ctk-80col.c

来自「伟大的Contiki工程, 短小精悍 的操作系统, 学习编程不可不看」· C语言 代码 · 共 1,191 行 · 第 1/3 页

C
1,191
字号
{  struct ctk_window *win = w->window;  unsigned char posx, posy;  posx = (win->x & 0xfe) + 1;  posy = win->y + 2;  if(w == win->focused) {    focus |= CTK_FOCUS_WIDGET;  }    draw_widget(w, posx, posy,	      posx + win->w,	      posy + win->h,	      clipy1, clipy2,	      focus);  #ifdef CTK_CONIO_CONF_UPDATE  CTK_CONIO_CONF_UPDATE();#endif /* CTK_CONIO_CONF_UPDATE */}/*-----------------------------------------------------------------------------------*/static voids_ctk_draw_clear_window(struct ctk_window *window,		      unsigned char focus,		      unsigned char clipy1,		      unsigned char clipy2){  unsigned char i;  unsigned char h;    if(focus & CTK_FOCUS_WINDOW) {    color(COLOR_FOCUS_WINDOW);  } else {    color(COLOR_BACKGROUND_WINDOW);  }      h = window->y + 2 + window->h;  /* Clear window contents. */  for(i = window->y + 2; i < h; ++i) {    if(i >= clipy1 && i < clipy2) {      gotoxy((window->x & 0xfe) + 1, i);      ctk_80col_cclear((window->w + 1)/2);    }  }}/*-----------------------------------------------------------------------------------*/static voiddraw_window_contents(struct ctk_window *window, unsigned char focus,		     unsigned char clipy1, unsigned char clipy2,		     unsigned char x1, unsigned char x2,		     unsigned char y1, unsigned char y2){  struct ctk_widget *w;  unsigned char wfocus;    /* Draw inactive widgets. */  for(w = window->inactive; w != NULL; w = w->next) {    draw_widget(w, x1, y1, x2, y2,		clipy1, clipy2,		focus);  }    /* Draw active widgets. */  for(w = window->active; w != NULL; w = w->next) {      wfocus = focus;    if(w == window->focused) {      wfocus |= CTK_FOCUS_WIDGET;    }   draw_widget(w, x1, y1, x2, y2, 	       clipy1, clipy2,	       wfocus);  }#ifdef CTK_CONIO_CONF_UPDATE  CTK_CONIO_CONF_UPDATE();#endif /* CTK_CONIO_CONF_UPDATE */}/*-----------------------------------------------------------------------------------*/static voids_ctk_draw_window(struct ctk_window *window, unsigned char focus,		  unsigned char clipy1, unsigned char clipy2,		  unsigned char draw_borders){  unsigned char x, y;  unsigned char h;  unsigned char x1, y1, x2, y2;    if(window->y + 1 >= clipy2) {    return;  }      x = window->x & 0xfe;  y = window->y + 1;  /*  if(focus & CTK_FOCUS_WINDOW) {  } else {  }*/  x1 = x + 1;  y1 = y + 1;  x2 = x1 + window->w;  y2 = y1 + window->h;  /* Draw window frame. */  gotoxy(x, y);  ctk_80col_windowparams.w = (window->w-1)/2;  ctk_80col_windowparams.h = window->h;  if(clipy1 < y) {    ctk_80col_windowparams.clipy1 = 0;  } else {    ctk_80col_windowparams.clipy1 = clipy1 - y;  }  ctk_80col_windowparams.clipy2 = clipy2 - y + 1;  ctk_80col_windowparams.color1 = ctk_80col_theme.windowcolors[focus];  ctk_80col_windowparams.color2 = ctk_80col_theme.windowcolors[focus];  ctk_80col_windowparams.titlecolor = ctk_80col_theme.windowcolors[focus+1];  ctk_80col_windowparams.title = window->title;  ctk_80col_windowparams.titlelen = window->titlelen/2;  if(ctk_80col_windowparams.clipy1 < ctk_80col_windowparams.clipy2 &&     ctk_80col_windowparams.clipy2 > 0) {    ctk_80col_draw_windowborders();  }  /*    if(y >= clipy1) {    cputcxy(x, y, CH_ULCORNER);    gotoxy(wherex() + window->titlelen + CTK_CONF_WINDOWMOVE * 2, wherey());    chline(window->w - (wherex() - x) - 2);    cputcxy(x2, y, CH_URCORNER);  }  h = window->h;    if(clipy1 > y1) {    if(clipy1 - y1 < h) {      h = clipy1 - y1;            y1 = clipy1;    } else {      h = 0;    }  }  if(clipy2 < y1 + h) {    if(y1 >= clipy2) {      h = 0;    } else {      h = clipy2 - y1;    }  }  cvlinexy(x, y1, h);  cvlinexy(x2, y1, h);    if(y + window->h >= clipy1 &&     y + window->h < clipy2) {    cputcxy(x, y2, CH_LLCORNER);    chlinexy(x1, y2, window->w);    cputcxy(x2, y2, CH_LRCORNER);  }  */  if(ctk_mode_get() != CTK_MODE_WINDOWMOVE) {    draw_window_contents(window, focus, clipy1, clipy2,			 x1, x2, y + 1, y2);  }}/*-----------------------------------------------------------------------------------*/static voids_ctk_draw_dialog(struct ctk_window *dialog){  unsigned char x, y;  unsigned char i;  unsigned char x1, y1, x2, y2;      x = dialog->x & 0xfe;  y = dialog->y + 1;  x1 = x + 1;  y1 = y + 1;  x2 = x1 + dialog->w;  y2 = y1 + dialog->h;  /* Draw dialog frame. */    /*  cvlinexy(x, y1,	   dialog->h);  cvlinexy(x2, y1,	   dialog->h);  chlinexy(x1, y,	   dialog->w);  chlinexy(x1, y2,	   dialog->w);  cputcxy(x, y, CH_ULCORNER);  cputcxy(x, y2, CH_LLCORNER);  cputcxy(x2, y, CH_URCORNER);  cputcxy(x2, y2, CH_LRCORNER);  */  gotoxy(x, y);  ctk_80col_windowparams.w = (dialog->w-1)/2;  ctk_80col_windowparams.h = dialog->h;  ctk_80col_windowparams.clipy1 = 0;  ctk_80col_windowparams.clipy2 = SCREEN_HEIGHT;  ctk_80col_windowparams.color1 = ctk_80col_theme.windowcolors[4];  ctk_80col_windowparams.color2 = ctk_80col_theme.windowcolors[4];  ctk_80col_windowparams.titlecolor = ctk_80col_theme.windowcolors[5];  ctk_80col_draw_windowborders();      /* Clear dialog contents. */  color(COLOR_DIALOG);  for(i = y1; i < y2; ++i) {    gotoxy((x1 & 0xfe) + 2, i);    ctk_80col_cclear((dialog->w + 1)/2 - 2);    /*    cclearxy(x1, i, dialog->w);*/  }  draw_window_contents(dialog, CTK_FOCUS_DIALOG, 0, SCREEN_HEIGHT,		       x1, x2, y1, y2);}/*-----------------------------------------------------------------------------------*/static voids_ctk_draw_clear(unsigned char y1, unsigned char y2){  unsigned char i;    for(i = y1; i < y2; ++i) {        ctk_80col_clear_line(i);  }}/*-----------------------------------------------------------------------------------*/static voiddraw_menu(struct ctk_menu *m){  unsigned char x, x2, y;    color(ctk_80col_theme.openmenucolor);    revers(0);  x = wherex();  _cputs(m->title);  cputc(' ');  x2 = wherex();  if(x + CTK_CONF_MENUWIDTH > SCREEN_WIDTH) {    x = SCREEN_WIDTH - CTK_CONF_MENUWIDTH - 2;  }      for(y = 0; y < m->nitems; ++y) {    if(y == m->active) {      color(ctk_80col_theme.activemenucolor);    } else {      color(ctk_80col_theme.openmenucolor);    }    gotoxy(x, y + 1);    ctk_80col_cclear(CTK_CONF_MENUWIDTH/2);    gotoxy(x, y + 1);    if(m->items[y].title[0] == '-') {      chline(CTK_CONF_MENUWIDTH);    } else {      /*      _cputs(m->items[y].title);*/      ctk_80col_cputsn(m->items[y].title, m->items[y].titlelen);    }    /*    if(x + CTK_CONF_MENUWIDTH > wherex()) {      cclear(x + CTK_CONF_MENUWIDTH - wherex());      }*/    }  gotoxy(x2, 0);  revers(1);}/*-----------------------------------------------------------------------------------*/static voids_ctk_draw_menus(struct ctk_menus *menus){  struct ctk_menu *m;      memcpy((char *)0xe000, ctk_80col_theme.menuleftpattern, 8);  /* Draw menus */  gotoxy(2, 0);  revers(1);   for(m = menus->menus->next; m != NULL; m = m->next) {    color(ctk_80col_theme.menucolor);    if(m != menus->open) {      /*      _cputs(m->title);*/      ctk_80col_cputsn(m->title, m->titlelen);      cputc(' ');    } else {      draw_menu(m);    }  }  color(ctk_80col_theme.menucolor);      if(wherex() + strlen(menus->desktopmenu->title) + 2 >= SCREEN_WIDTH) {    gotoxy(SCREEN_WIDTH - strlen(menus->desktopmenu->title) - 2, 0);  } else {    cclear(SCREEN_WIDTH - wherex() -	   strlen(menus->desktopmenu->title) - 2);  }    /* Draw desktopmenu */  if(menus->desktopmenu != menus->open) {    ctk_80col_cputsn(menus->desktopmenu->title, menus->desktopmenu->titlelen);  } else {    draw_menu(menus->desktopmenu);  }  /*  gotoxy(78, 0);  color(ctk_80col_screencolors[0]);  cputc(' ');  cputc(' ');    */    revers(0);  memcpy((char *)0xe138, ctk_80col_theme.menurightpattern, 8);}/*-----------------------------------------------------------------------------------*/static unsigned chars_ctk_draw_height(void){  return SCREEN_HEIGHT;}/*-----------------------------------------------------------------------------------*/static unsigned chars_ctk_draw_width(void){  return SCREEN_WIDTH;}/*-----------------------------------------------------------------------------------*/static unsigned shorts_ctk_mouse_xtoc(unsigned short x){  return x / 4;}/*-----------------------------------------------------------------------------------*/static unsigned shorts_ctk_mouse_ytoc(unsigned short y){  return y / 8;}/*-----------------------------------------------------------------------------------*/SERVICE(ctk_hires_service, ctk_draw_service, { 1,  1,  1,  s_ctk_draw_init,  s_ctk_draw_clear,  s_ctk_draw_clear_window,  s_ctk_draw_window,  s_ctk_draw_dialog,  s_ctk_draw_widget,  s_ctk_draw_menus,  s_ctk_draw_width,  s_ctk_draw_height,  s_ctk_mouse_xtoc,  s_ctk_mouse_ytoc });/*--------------------------------------------------------------------------*/PROCESS(ctk_hires_service_process, "CTK hires service");PROCESS_THREAD(ctk_hires_service_process, ev, data) {  PROCESS_BEGIN();  s_ctk_draw_init();  ctk_restore();    SERVICE_REGISTER(ctk_hires_service);  while(ev != PROCESS_EVENT_SERVICE_REMOVED &&	ev != PROCESS_EVENT_EXIT) {    PROCESS_WAIT_EVENT();  }  SERVICE_REMOVE(ctk_hires_service);  VIC.ctrl1 = 0x1b;  /* $D011 */  VIC.addr  = 0x17;  /* $D018 */  VIC.ctrl2 = 0xc8;  /* $D016 */  CIA2.pra  = 0x03;  /* $DD00 */    PROCESS_END();}/*--------------------------------------------------------------------------*/

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?