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