ctk-term.c

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

C
1,029
字号
	      revers(1);	    } else {	      revers(0);	    }	    if(c == 0) {	      cputc(' ');	    } else {	      cputc(c);	    }	    revers(0);	    textcolor((unsigned char)(TERM_TEXTENTRYCOLOR + focus));	  }	  cputc('<');	} else {	  if(focus & CTK_FOCUS_WIDGET && j == w->widget.textentry.ypos) {	    revers(1);	  } else {	    revers(0);	  }	  cvlinexy(xpos, ypos, 1);	  gotoxy((unsigned char)(xpos + 1), ypos);          	  cputsn(text, w->w);	  i = wherex();	  if(i - xpos - 1 < w->w) {	    cclear((unsigned char)(w->w - (i - xpos) + 1));	  }	  cvline(1);	}      }      ++ypos;      text += w->widget.textentry.len + 1;    }    revers(0);    break;  case CTK_WIDGET_ICON:    if(ypos >= clipy1 && ypos < clipy2) {      textcolor((unsigned char)(TERM_ICONCOLOR + focus));      if(focus & 1) {	revers(1);      } else {	revers(0);      }      x = xpos;      len = strlen(w->widget.icon.title);      if(x + len >= sizex) {	x = sizex - len;      }      gotoxy(x, (unsigned char)(ypos + 3));      if(ypos >= clipy1 && ypos < clipy2) {	cputs(w->widget.icon.title);      }      gotoxy(xpos, ypos);      if (w->widget.icon.textmap != NULL) {	for(i = 0; i < 3; ++i) {	  	  if(ypos >= clipy1 && ypos < clipy2) {	    gotoxy(xpos,ypos);	    cputc(w->widget.icon.textmap[0 + 3 * i]);	    cputc(w->widget.icon.textmap[1 + 3 * i]);	    cputc(w->widget.icon.textmap[2 + 3 * i]);	  }	  ++ypos;	}      }      x = xpos;      revers(0);    }    break;  default:    break;  }}/*-----------------------------------------------------------------------------------*//**  * Draw a widget on the VNC screen. Called by the CTK module. * * \param w The widget to be drawn. * \param focus The focus of the widget. * \param clipy1 The lower y coordinate bound. * \param clipy2 The upper y coordinate bound. *//*-----------------------------------------------------------------------------------*/voidctk_draw_widget(struct ctk_widget *w,		unsigned char focus,		unsigned char clipy1,		unsigned char clipy2){  struct ctk_window *win = w->window;  struct ctk_icon *icon;  unsigned char posx, posy, x, len;  posx = win->x + 1;  posy = win->y + 2;  if(w == win->focused) {    focus |= CTK_FOCUS_WIDGET;  }    draw_widget(w, posx, posy,	      (unsigned char)(posx + win->w),	      (unsigned char)(posy + win->h),	      clipy1, clipy2,	      focus);  if(w->type != CTK_WIDGET_ICON) {    update_area((unsigned char)(posx + w->x),		(unsigned char)(posy + w->y), 		(unsigned char)(w->w + 2), 		w->h);  } else {    icon = (struct ctk_icon *)w;    len = strlen(icon->title);    x = posx + w->x;    if(x + len >= sizex) {      x = sizex - len;    }    update_area(x,       (unsigned char)(posy + w->y),       (unsigned char)(len > 4? len: 4),       w->h);      }  #ifdef CTK_CONIO_CONF_UPDATE  CTK_CONIO_CONF_UPDATE();#endif /* CTK_CONIO_CONF_UPDATE */}/*-----------------------------------------------------------------------------------*//**  * Clear a window on the terminal screen. Called by the CTK module. * * \param window The window to be cleared. * \param focus The focus of the window. * \param clipy1 The lower y coordinate bound. * \param clipy2 The upper y coordinate bound. *//*-----------------------------------------------------------------------------------*/voidctk_draw_clear_window(struct ctk_window *window,		      unsigned char focus,		      unsigned char clipy1,		      unsigned char clipy2){  unsigned char i;  unsigned char h;  textcolor((unsigned char)(TERM_WINDOWCOLOR + focus));    h = window->y + 2 + window->h;  /* Clear window contents. */  for(i = window->y + 2; i < h; ++i) {    if(i >= clipy1 && i < clipy2) {      cclearxy((unsigned char)(window->x + 1), i, window->w);    }  }  update_area((unsigned char)(window->x + 1),    (unsigned char)(window->y + 2),     window->w, window->h);}/*-----------------------------------------------------------------------------------*/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 */}/*-----------------------------------------------------------------------------------*//**  * Draw a window on the terminal screen. Called by the CTK module. * * \param window The window to be drawn. * \param focus The focus of the window. * \param clipy1 The lower y coordinate bound. * \param clipy2 The upper y coordinate bound. * \param draw_borders The flag for border drawing. *//*-----------------------------------------------------------------------------------*/voidctk_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;  unsigned char i;    if(window->y + 1 >= clipy2) {    return;  }      x = window->x;  y = window->y + 1;  x1 = x + 1;  y1 = y + 1;  x2 = x1 + window->w;  y2 = y1 + window->h;  if(draw_borders) {    /* Draw window frame. */      textcolor((unsigned char)(TERM_WINDOWCOLOR + focus));    if(y >= clipy1) {      cputcxy(x, y, CH_ULCORNER);      for(i = wherex() + window->titlelen + CTK_CONF_WINDOWMOVE * 2; i < x2; ++i) {	cputcxy(i, y, CH_TITLEBAR);      }      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;      }    }      for(i = y1; i < y1 + h; ++i) {      cputcxy(x, i, CH_WINDOWLBORDER);      cputcxy(x2, i, CH_WINDOWRBORDER);    }    if(y2 >= clipy1 &&       y2 < clipy2) {      cputcxy(x, y2, CH_LLCORNER);      for(i = x1; i < x2; ++i) {	cputcxy(i, y2, CH_WINDOWLOWERBORDER);      }      cputcxy(x2, y2, CH_LRCORNER);    }  }  draw_window_contents(window, focus, clipy1, clipy2,		       x1, x2, (unsigned char)(y + 1), y2);  update_area(window->x, window->y,     (unsigned char)(window->w + 2),     (unsigned char)(window->h + 2));}/*-----------------------------------------------------------------------------------*//**  * Draw a dialog on the terminal screen. Called by the CTK module. * * \param dialog The dialog to be drawn. *//*-----------------------------------------------------------------------------------*/voidctk_draw_dialog(struct ctk_window *dialog){  unsigned char x, y;  unsigned char i;  unsigned char x1, y1, x2, y2;  textcolor(TERM_WINDOWCOLOR + CTK_FOCUS_DIALOG);  x = dialog->x;  y = dialog->y + 1;  x1 = x + 1;  y1 = y + 1;  x2 = x1 + dialog->w;  y2 = y1 + dialog->h;  /* Draw dialog frame. */    for(i = y1; i < y1 + dialog->h; ++i) {    cputcxy(x, i, CH_DIALOGLBORDER);    cputcxy(x2, i, CH_DIALOGRBORDER);  }    for(i = x1; i < x2; ++i) {    cputcxy(i, y, CH_DIALOGUPPERBORDER);    cputcxy(i, y2, CH_DIALOGLOWERBORDER);  }  cputcxy(x, y, CH_DIALOG_ULCORNER);  cputcxy(x, y2, CH_DIALOG_LLCORNER);  cputcxy(x2, y, CH_DIALOG_URCORNER);  cputcxy(x2, y2, CH_DIALOG_LRCORNER);      /* Clear dialog contents. */  for(i = y1; i < y2; ++i) {    cclearxy(x1, i, dialog->w);  }  draw_window_contents(dialog, CTK_FOCUS_DIALOG, 0, sizey,		       x1, x2, y1, y2);  update_area(dialog->x, dialog->y,     (unsigned char)(dialog->w + 4),     (unsigned char)(dialog->h + 4));}/*-----------------------------------------------------------------------------------*//**  * Clear parts of the terminal desktop. Called by the CTK module. * * \param y1 The lower y coordinate bound. * \param y2 The upped y coordinate bound. *//*-----------------------------------------------------------------------------------*/voidctk_draw_clear(unsigned char y1, unsigned char y2){  unsigned char i;  textcolor(TERM_BACKGROUNDCOLOR);  for(i = y1; i < y2; ++i) {    cclearxy(0, i, sizex);  }  update_area(0, y1, sizex, (unsigned char)(y2 - y1));}/*-----------------------------------------------------------------------------------*//** \internal * Draw one menu on the termainl desktop. * * \param m The CTK menu to be drawn. *//*-----------------------------------------------------------------------------------*/static voiddraw_menu(struct ctk_menu *m){  unsigned char x, x2, y;  textcolor(TERM_MENUCOLOR);  x = wherex();  cputs(m->title);  cputc(' ');  x2 = wherex();  if(x + CTK_CONF_MENUWIDTH > sizex) {    x = sizex - CTK_CONF_MENUWIDTH;  }      for(y = 0; y < m->nitems; ++y) {    if(y == m->active) {      textcolor(TERM_ACTIVEMENUCOLOR);      revers(0);    } else {      textcolor(TERM_MENUCOLOR);	      }    gotoxy(x, (unsigned char)(y + 1));    if(m->items[y].title[0] == '-') {      chline(CTK_CONF_MENUWIDTH);    } else {      cputs(m->items[y].title);    }    if(x + CTK_CONF_MENUWIDTH > wherex()) {      cclear((unsigned char)(x + CTK_CONF_MENUWIDTH - wherex()));    }    revers(1);  }    gotoxy(x2, 0);  textcolor(TERM_MENUCOLOR);    update_area(x, 0, CTK_CONF_MENUWIDTH, (unsigned char)(m->nitems + 1));}/*-----------------------------------------------------------------------------------*//**  * Draw the menus on the terminal desktop. Called by the CTK module. * * \param menus The CTK menubar. *//*-----------------------------------------------------------------------------------*/voidctk_draw_menus(struct ctk_menus *menus){  struct ctk_menu *m;      /* Draw menus */  textcolor(TERM_MENUCOLOR);  gotoxy(0, 0);  revers(1);  cputc(' ');  for(m = menus->menus->next; m != NULL; m = m->next) {    if(m != menus->open) {      update_area(wherex(), 0, (unsigned char)(strlen(m->title) + 1), 1);      cputs(m->title);      cputc(' ');    } else {      draw_menu(m);    }  }  if(wherex() + strlen(menus->desktopmenu->title) + 1>= sizex) {    gotoxy((unsigned char)(sizex - strlen(menus->desktopmenu->title) - 1), 0);  } else {    cclear((unsigned char)(sizex - wherex() - strlen(menus->desktopmenu->title) - 1));    update_area(wherex(), 0,       (unsigned char)(sizex - wherex() -strlen(menus->desktopmenu->title) - 1),       1);  }    /* Draw desktopmenu */  if(menus->desktopmenu != menus->open) {    update_area(wherex(), 0, (unsigned char)(strlen(menus->desktopmenu->title) + 1), 1);    cputs(menus->desktopmenu->title);    cputc(' ');  } else {    draw_menu(menus->desktopmenu);  }  revers(0);}/*-----------------------------------------------------------------------------------*//**  * Obtain the height of the terminal desktop. Called by the CTK module. * * \return The height of the terminal desktop, in characters. *//*-----------------------------------------------------------------------------------*/unsigned charctk_draw_height(void){  return sizey;}/*-----------------------------------------------------------------------------------*//**  * Obtain the height of the terminal desktop. Called by the CTK module. * * \return The height of the terminal desktop, in characters. *//*-----------------------------------------------------------------------------------*/unsigned charctk_draw_width(void){  return sizex;}/*-----------------------------------------------------------------------------------*//** * Draws a character on the virtual screen. Called by the libconio module. * * \param c The character to be drawn. * \param xpos The x position of the character. * \param ypos The y position of the character. * \param reversedflag Determines if the character should be reversed or not. * \param color The color of the character. *//*-----------------------------------------------------------------------------------*/voidctk_arch_draw_char(char c,		   unsigned char xpos,		   unsigned char ypos,		   unsigned char reversedflag,		   unsigned char color){  /* Check if out of bounds */  if (xpos >= sizex || ypos >= sizey) {    return;  }  ctk_term_out_update_screen(xpos,ypos, (unsigned char)(c & 0x7f), color);}

⌨️ 快捷键说明

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