📄 menulib.c
字号:
ret = ERR_FORMAT; break; } ptr[level]->citem->next = ptr[level]->hitem; ptr[level]->hitem->prev = ptr[level]->citem; if( level == 0 ) { ptr[level]->citem = ptr[level]->hitem; ret = 0; break; /* Success, exit */ } else { ptr[level]->parent=ptr[level-1]; level--; } } else { disp_sysbox(buf); ret = ERR_NO_KEYWORD; break; } } fclose(fp); if( ret < 0 ) return ret; if( not_color ) { set_tty_attr(); } if( menu_create(menuhead.menu) == FALSE ) return ERR_CREATE_MENU; return 0;}/*----------------------------------------------------------------------------* * Function: 设置菜单位置. * Argument: * menu_t *menu - 菜单. * Return : * TRUE 成功. * FALSE 失败. *----------------------------------------------------------------------------*/menu_window_setup(menu_t *menu){ int px,pw,cw; uchar sy,sx,row,col,len; menuitem_t *ptr; /* Find out max len ,and adjust len to odd */ ptr = menu->hitem; row = col = 0; do { row++; if( ptr->index != 0 ) /* Not sepapator */ { len = strlen(ptr->text); if( strchr(ptr->text,'&') != NULL ) len--; if( len > col ) col = len; } ptr = ptr->next; } while( ptr != menu->hitem ); if( col % 2 ) col++; /* This is the top menu window && pulldown menu style */ if( menu->parent == NULL && screen.mstyle & MENU_PULLDOWN ) { /* Create window */ if( screen.mstyle & MENU_BOX ) { if( (menu->win=create_window(menuhead.sy,menuhead.sx,1,76, screen.text,screen.board,screen.wstyle)) == NULL ) { return FALSE; } menuhead.sy += 1; menuhead.sx += 2; } else { if( (menu->win=create_window(menuhead.sy,menuhead.sx,1,80, screen.text,screen.board,WINDOW_NO_BOARD)) == NULL ) { return FALSE; } } return TRUE; } /* Adjust text's length to max length */ ptr = menu->hitem; do { if( ptr->index != 0 ) /* Not sepapator */ { len = strlen(ptr->text); if( strchr(ptr->text,'&') != NULL ) len--; if( len < col ) { if( (ptr->text=(char *)realloc(ptr->text,col+1)) == NULL ) return FALSE; strcat(ptr->text,space(col-len)); } } ptr = ptr->next; } while( ptr != menu->hitem ); col+=2; /* For display ">>" or "√" */ if( screen.mstyle & MENU_DISP_NUMBER ) col+=2; /* This is the top menu window && popup menu style */ if( menu->parent == NULL && screen.mstyle & MENU_POPUP ) { /* Create window */ if( (menu->win=create_window(menuhead.sy,menuhead.sx,row,col, screen.text,screen.board,screen.wstyle)) == NULL ) { return FALSE; } return TRUE; } /* This is the other level menu window */ /* This is the pulldown menu's second level submenu */ if( (screen.mstyle & MENU_PULLDOWN) && (menu->parent->parent == NULL) ) { sy = menu->parent->win->sy+1; if( screen.mstyle & MENU_BOX ) { sy ++; } if( screen.mstyle & MENU_SITE_CENTER ) { px = menu->parent->citem->site+2; pw = strlen(menu->parent->citem->text); cw = col; if( px + (pw - cw) / 2 < 0 ) sx = 0; else { sx = px + (pw - cw - 8) / 2; } } else { sx = menu->parent->citem->site; } } else /* This is the popup menu's second level submenu && * pulldown menu's third level submenu */ { sy = menu->parent->win->sy+menu->parent->citem->site+1; if( screen.mstyle & MENU_SITE_LEFT ) { sx = menu->parent->win->sx+2; } else if( screen.mstyle & MENU_SITE_CENTER ) { px = menu->parent->win->sx; if( screen.mstyle & MENU_DISP_NUMBER ) px+=2; pw = strlen(menu->parent->citem->text); cw = col; if( px + (pw - cw) / 2 < 0 ) sx = 0; else { if( pw > cw ) { sx = px + (pw - cw) / 2; } else sx = px + (pw - cw - 1) / 2; } } else /* MENU_SITE_RIGHT */ { if( screen.wstyle & WINDOW_SHADE ) sx = menu->parent->win->sx+menu->parent->win->col-6; else sx = menu->parent->win->sx+menu->parent->win->col-4; } } /* Adjust sy < screen_endy && sx < screen_endx */ if( sy > screen_endy ) { sy = screen_endy; } if( sy+row+3 > screen_maxrow ) { sy = screen_maxrow-row-3; } if( sx > screen_endx ) { sx = screen_endx; } if( sx+col+5 > screen_endx ) { if( screen.wstyle & WINDOW_SHADE ) sx = screen_endx-col-5; else sx = screen_endx-col-3; if( screen.mstyle & MENU_SITE_LEFT || screen.mstyle & MENU_SITE_CENTER ) { if( menu->parent->parent != NULL && sx > menu->parent->win->sx+2 ) sx = menu->parent->win->sx+2; } } /* Create window */ if( (menu->win=create_window(sy,sx,row,col,screen.text,screen.board, screen.wstyle)) == NULL ) { return FALSE; } return TRUE;}menu_create(menu_t *menu){ menu_t *ptr; ptr = menu; ptr->citem = ptr->hitem; if( menu_window_setup(ptr) == FALSE ) return FALSE; while(1) { if( ptr->citem->child != NULL ) { ptr = ptr->citem->child; ptr->citem = ptr->hitem; if( menu_window_setup(ptr) == FALSE ) return FALSE; } else { ptr->citem = ptr->citem->next; if( ptr->citem == ptr->hitem ) { while( ptr->parent != NULL ) { ptr = ptr->parent; ptr->citem = ptr->citem->next; if( ptr->citem != ptr->hitem ) break; } if( ptr->parent == NULL && ptr->citem == ptr->hitem ) return TRUE; } } }}/*----------------------------------------------------------------------------* * Function: 显示菜单条目(该条目由 menu->citem 确定). * Argument: * menu_t *menu - 菜单项指针. * chtype flag - NOV: 正常显示 REV: 反显. * Return : * TRUE. *----------------------------------------------------------------------------*/disp_menuitem(menu_t *menu,chtype flag){ int i,j,site,len,sx; char buf[100]; short f1,b1,f2,b2; chtype attr,hattr; menuitem_t *citem; window_t *cwin; cwin = menu->win; citem = menu->citem; if( not_color ) { if( flag == REV ) { if( citem->flag & MF_GRAYED ) { attr = flag|A_DIM; hattr= flag|A_DIM|screen.hotkey; } else { attr = flag; hattr = flag|screen.hotkey; } } else { if( citem->flag & MF_GRAYED ) { attr = A_DIM; hattr= A_DIM|screen.hotkey; } else { attr = flag; hattr = flag|screen.hotkey; } } } else { if( flag == REV ) { attr = screen.select; } else { attr = screen.text; } pair_content((short)PAIR_NUMBER(attr),&f1,&b1); pair_content((short)PAIR_NUMBER(screen.hotkey),&f2,&b2); hattr=COL(f2,b1); if( citem->flag & MF_GRAYED ) { attr = COL(f1|EXTRA_COLOR,b1|EXTRA_COLOR)|A_DIM; hattr= COL(f2|EXTRA_COLOR,b1|EXTRA_COLOR)|A_DIM; } } /* Display sepapator line */ if( citem->index == 0 ) { draw_line(cwin->sy+citem->site,cwin->sx,cwin->col); return TRUE; } if( screen.wstyle & WINDOW_CHINESE ) { sx = cwin->sx+2; } else { sx = cwin->sx+1; } len=strlen(citem->text); if( strchr(citem->text,'&') == NULL ) { /* Pulldown's top menu */ if( (screen.mstyle & MENU_PULLDOWN) && (menu->parent == NULL) ) { if( (screen.mstyle & MENU_DISP_NUMBER) && (citem->index < 10) ) { if( screen.mstyle & MENU_BOX ) { aprint(cwin->sy+1,citem->site+2,attr,"%d.",citem->index); aprint(cwin->sy+1,citem->site+4,attr,citem->text); } else { aprint(cwin->sy,citem->site,attr,"%d.",citem->index); aprint(cwin->sy,citem->site+2,attr,citem->text); } } else { if( screen.mstyle & MENU_BOX ) { aprint(cwin->sy+1,citem->site+2,attr,citem->text); } else { aprint(cwin->sy,citem->site,attr,citem->text); } } } else { if( (screen.mstyle & MENU_DISP_NUMBER) && (citem->index < 10) ) { aprint(cwin->sy+citem->site,sx,attr,"%d.",citem->index); sx += 2; } aprint(cwin->sy+citem->site,sx,attr,citem->text); if( citem->child ) aprint(cwin->sy+citem->site,len+sx,attr,">>"); else aprint(cwin->sy+citem->site,len+sx,attr," "); if( citem->flag & MF_CHECKED ) { if( screen.wstyle & WINDOW_CHINESE ) aprint(cwin->sy+citem->site,len+sx,attr,"√"); else aprint(cwin->sy+citem->site,len+sx,attr," \xfb"); } } } else { site=j=0; for(i=0;i<len;i++) { if( citem->text[i] != '&' ) buf[j++] = citem->text[i]; else site = i; } buf[j] = '\0'; len--; if( (screen.mstyle & MENU_PULLDOWN) && (menu->parent == NULL) ) { if( (screen.mstyle & MENU_DISP_NUMBER) && (citem->index < 10) ) { if( screen.mstyle & MENU_BOX ) { aprint(cwin->sy+1,cwin->sx+citem->site+2,attr,"%d.",citem->index); aprint(cwin->sy+1,cwin->sx+citem->site+4,attr,buf); aprint(cwin->sy+1,cwin->sx+citem->site+site+4,hattr,"%c",citem->text[site+1]); } else { aprint(cwin->sy,cwin->sx+citem->site,attr,"%d.",citem->index); aprint(cwin->sy,cwin->sx+citem->site+2,attr,buf); aprint(cwin->sy,cwin->sx+citem->site+site+2,hattr,"%c",citem->text[site+1]); } } else { if( screen.mstyle & MENU_BOX ) { aprint(cwin->sy+1,cwin->sx+citem->site+2,attr,buf); aprint(cwin->sy+1,cwin->sx+citem->site+site+2,hattr,"%c",citem->text[site+1]); } else { aprint(cwin->sy,cwin->sx+citem->site,attr,buf); aprint(cwin->sy,cwin->sx+citem->site+site,hattr,"%c",citem->text[site+1]); } } } else { if( (screen.mstyle & MENU_DISP_NUMBER) && (citem->index < 10) ) { aprint(cwin->sy+citem->site,sx,attr,"%d.",citem->index); sx += 2; } aprint(cwin->sy+citem->site,sx,attr,buf); if( citem->child ) aprint(cwin->sy+citem->site,len+sx,attr,">>"); else aprint(cwin->sy+citem->site,len+sx,attr," "); if( citem->flag & MF_CHECKED ) { if( screen.wstyle & WINDOW_CHINESE ) aprint(cwin->sy+citem->site,len+sx,attr,"√"); else aprint(cwin->sy+citem->site,len+sx,attr," \xfb"); } aprint(cwin->sy+citem->site,site+sx,hattr,"%c",citem->text[site+1]); } } refresh(); return TRUE;}/*----------------------------------------------------------------------------* * Function: 显示一个菜单项的popup菜单. * Argument: * menu_t *menu - 菜单项指针. * Return : * TRUE. *----------------------------------------------------------------------------*/disp_menu(menu_t *menu){ menuitem_t *old_citem; if( show_window(menu->win) == FALSE ) return FALSE; old_citem=menu->citem; menu->citem=menu->hitem; do { disp_menuitem(menu,NOR); menu->citem = menu->citem->next; } while( menu->hitem != menu->citem ); menu->citem = old_citem; return TRUE;}/*----------------------------------------------------------------------------* * Function: 根据index获得相应菜单项的指针. * Argument: * menu_t *menu - 菜单项指针. * int index - 索引值(1...n or Alt-'a'...'z'),不计分隔符. * Return : * TRUE - 找到,移动当前菜单项指针. * FALSE - 没找到. *----------------------------------------------------------------------------*/int get_menuhandle(menu_t *menu,uchar index){ uchar *p; menuitem_t *ptr; ptr = menu->hitem; if( index >= 0 && index <= 9 ) { do { if( ptr->index == index ) { menu->citem = ptr; return TRUE; } else ptr = ptr->next; } while( menu->hitem != ptr ); } else { do { if((p=(uchar *)strchr(ptr->text,'&')) != NULL) { if( toupper(*++p) == toupper(index) ) { menu->citem = ptr; return TRUE; } } ptr = ptr->next; } while( menu->hitem != ptr ); } return FALSE;}/*----------------------------------------------------------------------------* * Function: 显示标题. * Argument: * None. * Return : * None. *----------------------------------------------------------------------------*/void disp_title(){ if( MenuTitle[0] == 0 ) return; strcce(MenuTitle,'"',' '); wcls_line(stdscr,title_sy,0,80,screen.title); attron(screen.title); mvaddstr(title_sy,0,MenuTitle); attroff(screen.title); wrefresh(stdscr);}/*----------------------------------------------------------------------------* * Function: 显示版权信息. * Argument: * None. * Return : * None. *----------------------------------------------------------------------------*/void disp_copyright(){ int trow,tcol,len; char title[80],*msg; WINDOW *txtwin; if( menuhead.copyright == NULL ) return; strcce(menuhead.copyright,'"',' '); len = strlen(menuhead.copyright); if( (msg=(char *)malloc(len+1)) == NULL ) return; if( count_chnum(menuhead.copyright,'\n') > 1 ) { strcpy(title,get_item(menuhead.copyright,'\n',0)); memcpy(msg,menuhead.copyright+strlen(title)+1,len-strlen(title)-1); msg[len-strlen(title)-1] = 0; } else { if( screen.wstyle & WINDOW_CHINESE ) strcpy(title,"标题"); else strcpy(title,"Title"); strcpy(msg,menuhead.copyright); } trow = count_chnum(msg,'\n'); copyright_row = trow + 2; if( screen.wstyle & WINDOW_SHADE ) copyright_row ++; if( copyright_row > screen_maxrow) copyright_row = screen_maxrow; tcol = get_item_maxlen(msg,'\n'); if( tcol <= 0 ) tcol = 20; if( screen.wstyle & WINDOW_CHINESE ) { if( screen.wstyle & WINDOW_SHADE ) copyright_col = tcol + 6; else copyright_col = tcol + 4; if( copyright_col % 2 != 0 ) { copyright_col++; tcol++; } } else { if( screen.wstyle & WINDOW_SHADE ) copyright_col = tcol + 3; else copyright_col = tcol + 2; } if( copyright_col > screen_maxcol ) copyright_col = screen_maxcol; copyright_sy = (screen_maxrow - copyright_row) / 2; copyright_sx = (screen_maxcol - tcol) / 2; if( copyright_sx % 2 != 0 ) copyright_sx++; tdraw_box((uchar)copyright_sy,(uchar)copyright_sx,(uchar)copyright_row,(uchar)copyright_col,screen.text,screen.board,screen.wstyle); len = copyright_sx + (copyright_col - strlen(title)) / 2 ; if( len % 2 != 0 ) len++; /* Display title text */ attron(screen.title); mvaddstr(copyright_sy,len-2,title); attroff(screen.title); if( screen.wstyle & WINDOW_CHINESE ) { if( (txtwin=subwin(stdscr,trow,tcol,copyright_sy+1,copyright_sx+2)) == NULL ) { return; } } else { if( (txtwin=subwin(stdscr,trow,tcol+1,copyright_sy+1,copyright_sx+1)) == NULL ) { return; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -