📄 ui.c
字号:
if (ch==KEY_DELETE && cursorpos+offset!=strlen(newtext)) { tmp=malloc(strlen(newtext)); for (i=0;i<=strlen(newtext);i++) { if (i<=cursorpos+offset) tmp[i]=newtext[i]; else tmp[i-1]=newtext[i]; } tmp[strlen(newtext)-1]=0; free(newtext); newtext=malloc(strlen(tmp)+1); strncpy(newtext,tmp,strlen(tmp)+1);// ch=KEY_LEFT; } if (printable(ch) && strlen(newtext)<max) { tmp=malloc(strlen(newtext)+2); for (i=0;i<strlen(newtext);i++) { if (i<cursorpos+offset) tmp[i]=newtext[i]; else tmp[i+1]=newtext[i]; } tmp[cursorpos+offset]=ch; tmp[strlen(newtext)+1]=0; free(newtext); newtext=malloc(strlen(tmp)+1); strncpy(newtext,tmp,strlen(tmp)+1); free(tmp); ch=KEY_RIGHT; } if (ch==KEY_LEFT) { if (cursorpos) { cursorpos--; } else { if (offset) { offset--; } } } if (ch==KEY_RIGHT && cursorpos+offset<strlen(newtext)) { cursorpos++; if (cursorpos > len) { cursorpos=len; offset++; if (offset > strlen(newtext)-len) { offset=strlen(newtext)-len; } } } if (ch!=KEY_ESC && ch!=KEY_RETURN) ch=0; } if (ch==KEY_ESC) { free(newtext); newtext=malloc(strlen(text)+1); strncpy(newtext,text,strlen(text)+1); } wattrset(parent_window,attrs[COLOR_TEXT]); wmove(parent_window,0,0); mvwaddch(parent_window,0,0,'=');#if 0 for (i=0;i<max;i++) { if (i>=0 && i<=len) mvwaddch(parent_window,y,x+i,' '); } wrefresh(parent_window); mvwaddch(parent_window,0,0,' '); wrefresh(parent_window); mvwaddch(parent_window,1,1,'=');#endif for (i=0;i<max;i++) { if (i<=len) { mvwaddch(parent_window,y,x+i,textfield[i]); } } wrefresh(parent_window); mvwaddch(parent_window,0,0,' '); wmove(parent_window,0,0); wrefresh(parent_window); wmove(parent_window,y,x); wmove(parent_window,y,x); wmove(parent_window,y,x); wmove(parent_window,y,x); wmove(parent_window,y,x); wmove(parent_window,y,x); wmove(parent_window,y,x); wmove(parent_window,y,x); wmove(parent_window,y,x); wmove(parent_window,y,x); return newtext;}char *input(WINDOW *parent_window,int y,int x, unsigned int len,const char *text, unsigned int max){ return input2(parent_window,y,x,len,text,max,0,0);}void new_menu(int updown_nleftright){ MENU_num=0; MENU_pos=0; MENU_updown_nleftright=updown_nleftright;}void menu_item(unsigned int pos,int y,int x,char *text, char hotkey1,char hotkey2,char hotkey3){ if (pos >= MENU_num) MENU_num=pos+1; MENU_xpos[pos]=x; MENU_ypos[pos]=y; free(MENU_text[pos]); MENU_text[pos]=malloc(strlen(text)+1); strncpy(MENU_text[pos],text,strlen(text)+1); MENU_hotkey1[pos]=hotkey1; MENU_hotkey2[pos]=hotkey2; MENU_hotkey3[pos]=hotkey3;}int menu_show(WINDOW *parent_window){ unsigned int i; unsigned int j; int old_pos=0; int ch=0; for (i=0; i < MENU_num; i++) { wattrset(parent_window,attrs[COLOR_MENU]); wmove(parent_window,MENU_ypos[i],MENU_xpos[i]); for (j=0; j < strlen(MENU_text[i]); j++) { if (j!=0) { if (MENU_text[i][j-1]=='%') { wattrset(parent_window,attrs[COLOR_MENU_HOTKEY]); } } if (MENU_text[i][j]!='%') { waddch(parent_window,MENU_text[i][j]); } if (j!=0) { if (MENU_text[i][j-1]=='%') { wattrset(parent_window,attrs[COLOR_MENU]); } } } } while (ch!=KEY_RETURN) { i=old_pos; wattrset(parent_window,attrs[COLOR_MENU]); wmove(parent_window,MENU_ypos[i],MENU_xpos[i]); for (j=0;j<strlen(MENU_text[i]);j++) { if (j!=0) if (MENU_text[i][j-1]=='%') wattrset(parent_window,attrs[COLOR_MENU_HOTKEY]); if (MENU_text[i][j]!='%') waddch(parent_window,MENU_text[i][j]); if (j!=0) if (MENU_text[i][j-1]=='%') wattrset(parent_window,attrs[COLOR_MENU]); } i=MENU_pos; wattrset(parent_window,attrs[COLOR_MENU_HI]); wmove(parent_window,MENU_ypos[i],MENU_xpos[i]); for (j=0;j<strlen(MENU_text[i]);j++) { if (j!=0) if (MENU_text[i][j-1]=='%') wattrset(parent_window,attrs[COLOR_MENU_HOTKEY_HI]); if (MENU_text[i][j]!='%') waddch(parent_window,MENU_text[i][j]); if (j!=0) if (MENU_text[i][j-1]=='%') wattrset(parent_window,attrs[COLOR_MENU_HI]); } old_pos=MENU_pos; wrefresh(parent_window); ch=getch2(); if ((ch==KEY_UP && MENU_updown_nleftright==1) || (ch==KEY_LEFT && MENU_updown_nleftright==0)) { if (MENU_pos) { MENU_pos--; } else { if (MENU_num) { MENU_pos=MENU_num-1; } } } if ((ch==KEY_DOWN && MENU_updown_nleftright==1) || (ch==KEY_RIGHT && MENU_updown_nleftright==0)) { MENU_pos++; if (MENU_pos >= MENU_num) { MENU_pos=0; } } for (i=0; i < MENU_num; i++) { if (ch==MENU_hotkey1[i] || ch==MENU_hotkey2[i] || MENU_hotkey3[i]) { ch=KEY_RETURN; MENU_pos=i; } } } i=old_pos; wattrset(parent_window,attrs[COLOR_MENU]); wmove(parent_window,MENU_ypos[i],MENU_xpos[i]); for (j=0;j<strlen(MENU_text[i]);j++) { if (j!=0) if (MENU_text[i][j-1]=='%') wattrset(parent_window,attrs[COLOR_MENU_HOTKEY]); if (MENU_text[i][j]!='%') waddch(parent_window,MENU_text[i][j]); if (j!=0) if (MENU_text[i][j-1]=='%') wattrset(parent_window,attrs[COLOR_MENU]); } i=MENU_pos; wattrset(parent_window,attrs[COLOR_MENU_HI]); wmove(parent_window,MENU_ypos[i],MENU_xpos[i]); for (j=0;j<strlen(MENU_text[i]);j++) { if (j!=0) if (MENU_text[i][j-1]=='%') wattrset(parent_window,attrs[COLOR_MENU_HOTKEY_HI]); if (MENU_text[i][j]!='%') waddch(parent_window,MENU_text[i][j]); if (j!=0) if (MENU_text[i][j-1]=='%') wattrset(parent_window,attrs[COLOR_MENU_HI]); } wrefresh(parent_window); return MENU_pos; }void draw_frame(WINDOW *parent_window,int y1,int x1,int y2,int x2,char fillcharacter){ int z; int i; if (x2<x1) { z=x1; x1=x2; x2=z; } if (y2<y1) { z=y1; y1=y2; y2=z; } wattrset(parent_window,attrs[COLOR_FRAME]); mvwaddch(parent_window,y1,x1,ACS_ULCORNER); mvwaddch(parent_window,y2,x1,ACS_LLCORNER); mvwaddch(parent_window,y1,x2,ACS_URCORNER); mvwaddch(parent_window,y2,x2,ACS_LRCORNER); wmove(parent_window,y1,x1+1); for (z=x1+1;z<x2;z++) waddch(parent_window,ACS_HLINE); wmove(parent_window,y2,x1+1); for (z=x1+1;z<x2;z++) waddch(parent_window,ACS_HLINE); for (z=y1+1;z<y2;z++) { wmove(parent_window,z,x1); waddch(parent_window,ACS_VLINE); if (fillcharacter!=0) { for (i=x1+1;i<x2;i++) waddch(parent_window,fillcharacter); } else { wmove(parent_window,z,x1); } waddch(parent_window,ACS_VLINE); } }void erase_frame(WINDOW *parent_window,int y1,int x1,int y2,int x2,char fillcharacter){ int z; int i; if (x2<x1) { z=x1; x1=x2; x2=z; } if (y2<y1) { z=y1; y1=y2; y2=z; } wattrset(parent_window,attrs[COLOR_FRAME]); mvwaddch(parent_window,y1,x1,ACS_ULCORNER); mvwaddch(parent_window,y2,x1,ACS_LLCORNER); mvwaddch(parent_window,y1,x2,ACS_URCORNER); mvwaddch(parent_window,y2,x2,ACS_LRCORNER); wmove(parent_window,y1,x1+1); for (z=y1;z<=y2;z++) { wmove(parent_window,z,x1); if (fillcharacter!=0) { for (i=x1;i<=x2;i++) waddch(parent_window,fillcharacter); } else { wmove(parent_window,z,x1); } } }void headline(WINDOW *parent_window,int y,int x,const char* text){ wattrset(parent_window,attrs[COLOR_HEADLINE]); mvwprintw(parent_window,y,x+2,"%s",text); wattrset(parent_window,attrs[COLOR_BRACKETS]); wmove(parent_window,y,x+1); waddch(parent_window,'['); wmove(parent_window,y,x+2+strlen(text)); waddch(parent_window,']');}void draw_mainheadline(WINDOW *parent_window,int y,char *text){ int z; wmove(parent_window,y,0); wattrset(parent_window,attrs[COLOR_FRAME]); for (z=0;z<COLS;z++) waddch(parent_window,ACS_HLINE); headline(parent_window,y,COLS-strlen(text)-4,text); }void uimain(void){ (void) signal(SIGINT, finish); (void) initscr();// setupterm("xterm-color",1,(int *)0); keypad (stdscr,TRUE); (void) nonl(); (void) cbreak(); (void) noecho(); if (has_colors()) { start_color(); } init_colors();// } else {// endwin();// fprintf(stderr,"sorry... i need colors... (try using export TERM=xterm-color)\n"); // byebye(1);// } wclear(stdscr); wrefresh(stdscr);}void finish(int sig){ endwin(); byebye(sig);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -