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 + -
显示快捷键?