📄 curlib.c
字号:
savetty();#endif}/*----------------------------------------------------------------------------* * FUNCTION: 恢复一块屏幕区域. * Argument: * file_flag - 0.不从文件恢复 1.从文件恢复. * Return : * TRUE - 成功. * 说 明: * 同 save_window() 成对使用. *----------------------------------------------------------------------------*/restore_vs(int file_flag){#if 1 int i,j; char fname[81],tname[30]; chtype *ptr; FILE *fp; if( file_flag ) { strcpy(tname,ttyname(0)); strcce(tname,'/','_'); sprintf(fname,".screen.%d%s",getuid(),&tname[strlen(tname)-3]); if( (fp=fopen(fname,"r")) == NULL ) return FALSE; fscanf(fp,"%02d%02d%02d%02d\n",&vs.sy,&vs.sx,&vs.row,&vs.col); ptr = (chtype *)vs.buf; for(i=vs.sy;i<vs.sy+vs.row;i++) { for(j=vs.sx;j<vs.sx+vs.col;j++) { fscanf(fp,"%d ",ptr); ptr++; } } fclose(fp); } ptr = (chtype *)vs.buf; for(i=vs.sy;i<vs.sy+vs.row;i++) { for(j=vs.sx;j<vs.sx+vs.col;j++) { mvwaddch(stdscr,i,j,*ptr++); } } wrefresh(stdscr); return TRUE;#else resetty();#endif}/*----------------------------------------------------------------------------* * Function: 画一个box. * Argument: * uchar sy - 指定box的开始行坐标. * uchar sx - 指定box的开始列坐标. * uchar row - 指定box的行数. * uchar col - 指定box的列数. * Return : * TRUE. *----------------------------------------------------------------------------*/draw_box(uchar sy,uchar sx,uchar row,uchar col){ tdraw_box(sy,sx,row,col,screen.text,screen.board,screen.wstyle);}/*----------------------------------------------------------------------------* * Function: 画一个box. * Argument: * uchar sy - 指定box的开始行坐标. * uchar sx - 指定box的开始列坐标. * uchar row - 指定box的行数. * uchar col - 指定box的列数. * chtype tattr - 文本的前景色和背景色. * chtype battr - 边框的前景色和背景色. * chtype flag - WINDOW_SHADE: 阴影 WINDOW_ENGLISH: 英文制表符. * Return : * TRUE. *----------------------------------------------------------------------------*/tdraw_box(uchar sy,uchar sx,uchar row,uchar col,chtype tattr,chtype battr,chtype style){ register uchar i,j; if( style & WINDOW_NO_BOARD ) { cls(sy,sx,row,col,tattr); return TRUE; } if( style & WINDOW_SHADE ) /* There is box with shade */ { if( style & WINDOW_ENGLISH ) { wattron(stdscr,battr); mvwaddch(stdscr,sy,sx,0xda); /*┌ This is english table symbol */ for(i=1;i<col-2;i++) { mvwaddch(stdscr,sy,sx+i,0xc4); /* ─ */ mvwaddch(stdscr,sy+row-2,sx+i,0xc4); /* ─ */ } mvwaddch(stdscr,sy,sx+col-2,0xbf); /* ┐ */ for(i=1;i<row-2;i++) { mvwaddch(stdscr,sy+i,sx,0xb3); /* │ */ mvwaddch(stdscr,sy+i,sx+col-2,0xb3); /* │*/ } mvwaddch(stdscr,sy+row-2,sx,0xc0); /* └ */ mvwaddch(stdscr,sy+row-2,sx+col-2,0xd9); /* ┘*/ wattroff(stdscr,battr); /* draw shadom */ wattron(stdscr,screen.shade); for(i=1;i<row-1;i++) mvwaddch(stdscr,sy+i,sx+col-1,' '); for(i=1;i<col;i++) mvwaddch(stdscr,sy+row-1,sx+i,' '); wattroff(stdscr,screen.shade); /* clear test area */ cls(sy+1,sx+1,row-3,col-3,tattr); } else { wattron(stdscr,battr); mvwaddstr(stdscr,sy,sx,"┌"); /* This is chinese table symbol */ for(i=2;i<col-4;i+=2) { mvwaddstr(stdscr,sy,sx+i,"─"); mvwaddstr(stdscr,sy+row-2,sx+i,"─"); } mvwaddstr(stdscr,sy,sx+col-4,"┐"); for(i=1;i<row-2;i++) { mvwaddstr(stdscr,sy+i,sx,"│"); mvwaddstr(stdscr,sy+i,sx+col-4,"│"); } mvwaddstr(stdscr,sy+row-2,sx,"└"); mvwaddstr(stdscr,sy+row-2,sx+col-4,"┘"); wattroff(stdscr,battr); /* Draw shadom */ wattron(stdscr,screen.shade); for(i=1;i<row-1;i++) mvwaddstr(stdscr,sy+i,sx+col-2," "); for(i=2;i<col;i++) mvwaddch(stdscr,sy+row-1,sx+i,' '); wattroff(stdscr,screen.shade); /* Clear text area */ cls(sy+1,sx+2,row-3,col-6,tattr); } } else { if( style & WINDOW_ENGLISH ) { wattron(stdscr,battr); mvwaddch(stdscr,sy,sx,0xda); /*┌ This is english table symbol */ for(i=1;i<col-1;i++) { mvwaddch(stdscr,sy,sx+i,0xc4); mvwaddch(stdscr,sy+row-1,sx+i,0xc4); } mvwaddch(stdscr,sy,sx+col-1,0xbf); for(i=1;i<row-1;i++) { mvwaddch(stdscr,sy+i,sx,0xb3); mvwaddch(stdscr,sy+i,sx+col-1,0xb3); } mvwaddch(stdscr,sy+row-1,sx,0xc0); mvwaddch(stdscr,sy+row-1,sx+col-1,0xd9); wattroff(stdscr,battr); /* clear test area */ cls(sy+1,sx+1,row-2,col-2,tattr); } else { wattron(stdscr,battr); mvwaddstr(stdscr,sy,sx,"┌"); /* This is chinese table symbol */ for(i=2;i<col-2;i+=2) { mvwaddstr(stdscr,sy,sx+i,"─"); mvwaddstr(stdscr,sy+row-1,sx+i,"─"); } mvwaddstr(stdscr,sy,sx+col-2,"┐"); for(i=1;i<row-1;i++) { mvwaddstr(stdscr,sy+i,sx,"│"); mvwaddstr(stdscr,sy+i,sx+col-2,"│"); } mvwaddstr(stdscr,sy+row-1,sx,"└"); mvwaddstr(stdscr,sy+row-1,sx+col-2,"┘"); wattroff(stdscr,battr); cls(sy+1,sx+2,row-2,col-4,tattr); } } touchwin(stdscr); wrefresh(stdscr); return TRUE;}/*----------------------------------------------------------------------------* * Function: 在指定窗口画一个box. * Argument: * WINDOW *win - 指定的窗口. * chtype tattr - 文本的前景色和背景色. * chtype battr - 边框的前景色和背景色. * chtype flag - WINDOW_SHADE: 阴影 WINDOW_ENGLISH: 英文制表符. * Return : * TRUE. *----------------------------------------------------------------------------*/wdraw_box(WINDOW *win,chtype tattr,chtype battr,chtype flag){ short i,j,f,b; WINDOW *boxwin; if( flag & WINDOW_SHADE ) /* There is box with shade */ { if( flag & WINDOW_ENGLISH ) {#if 0 wattron(win,battr); mvwaddch(win,0,0,0xa9); /*┌ This is english table symbol */ for(i=1;i<win->_maxx-2;i++) { mvwaddch(win,0,i,0xc4); mvwaddch(win,win->_maxy-2,i,0xc4); } mvwaddch(win,0,win->_maxx-2,0xaa); for(i=1;i<win->_maxy-2;i++) { mvwaddch(win,i,0,0xb3); mvwaddch(win,i,win->_maxx-4,0xb3); } mvwaddch(win,win->_maxy-2,0,0xc0); mvwaddch(win,win->_maxy-2,win->_maxx-2,0xd9); wattroff(win,battr); wattron(win,screen.shade); for(i=1;i<win->_maxy-1;i++) mvwaddch(win,i,win->_maxx-1,' '); for(i=1;i<win->_maxx-1;i++) mvwaddch(win,win->_maxy-1,i,' '); wattroff(win,screen.shade); wattron(win,tattr); for(i=1;i<win->_maxy-2;i++) for(j=1;j<win->_maxx-2;j++) mvwaddch(win,i,j,' '); wattroff(win,tattr);#else if( (boxwin=subwin(win,win->_maxy-1,win->_maxx-1,win->_begy,win->_begx)) == NULL ) { return(FALSE); } wattron(boxwin,battr); box(boxwin,0,0); wattroff(boxwin,battr); touchwin(boxwin); wrefresh(boxwin); /* draw shade */ wattron(win,screen.shade); for(i=1;i<win->_maxy-1;i++) mvwaddch(win,i,win->_maxx-1,' '); for(i=1;i<win->_maxx-1;i++) mvwaddch(win,win->_maxy-1,i,' '); wattroff(win,screen.shade); /* clear screen */ wattron(win,tattr); for(i=1;i<win->_maxy-2;i++) for(j=1;j<win->_maxx-2;j++) mvwaddch(win,i,j,' '); wattroff(win,tattr);#endif } else { wattron(win,battr); mvwaddstr(win,0,0,"┌"); /* This is chinese table symbol */ for(i=2;i<win->_maxx-4;i+=2) { mvwaddstr(win,0,i,"─"); mvwaddstr(win,win->_maxy-2,i,"─"); } mvwaddstr(win,0,win->_maxx-4,"┐"); for(i=1;i<win->_maxy-2;i++) { mvwaddstr(win,i,0,"│"); mvwaddstr(win,i,win->_maxx-4,"│"); } mvwaddstr(win,win->_maxy-2,0,"└"); mvwaddstr(win,win->_maxy-2,win->_maxx-4,"┘"); wattroff(win,battr); /* Add shade */ wattron(win,screen.shade); for(i=1;i<win->_maxy-1;i++) mvwaddstr(win,i,win->_maxx-2," "); for(i=2;i<win->_maxx;i++) mvwaddch(win,win->_maxy-1,i,' '); wattroff(win,screen.shade); wattron(win,tattr); for(i=1;i<win->_maxy-2;i++) for(j=2;j<win->_maxx-4;j++) mvwaddch(win,i,j,' '); wattroff(win,tattr); } } else { if( flag & WINDOW_ENGLISH ) { wattron(win,battr); box(win,0,0); wattroff(win,battr); wattron(win,tattr); for(i=1;i<win->_maxy-1;i++) for(j=1;j<win->_maxx-1;j++) mvwaddch(win,i,j,' '); wattroff(win,tattr); } else { wattron(win,battr); mvwaddstr(win,0,0,"┌"); /* This is chinese table symbol */ for(i=2;i<win->_maxx-2;i+=2) { mvwaddstr(win,0,i,"─"); mvwaddstr(win,win->_maxy-1,i,"─"); } mvwaddstr(win,0,win->_maxx-2,"┐"); for(i=1;i<win->_maxy-1;i++) { mvwaddstr(win,i,0,"│"); mvwaddstr(win,i,win->_maxx-2,"│"); } mvwaddstr(win,win->_maxy-1,0,"└"); mvwaddstr(win,win->_maxy-1,win->_maxx-2,"┘"); wattroff(win,battr); wattron(win,tattr); for(i=1;i<win->_maxy-1;i++) for(j=2;j<win->_maxx-2;j++) mvwaddch(win,i,j,' '); wattroff(win,tattr); } } touchwin(win); wrefresh(win); return TRUE;}/*----------------------------------------------------------------------------* * Function: 用某种颜色清除屏幕. * Argument: * short sy - 开始行. * short sx - 开始列. * short row - 列. * short col - 行. * chtype attr - 颜色. * Return : * TRUE. *----------------------------------------------------------------------------*/cls(int sy,int sx,int row,int col,chtype attr){ register uchar i,j; wattron(stdscr,attr); for(i=sy;i<sy+row;i++) { for(j=sx;j<sx+col;j++) { mvwaddch(stdscr,i,j,' '); } } wattroff(stdscr,attr); touchwin(stdscr); wrefresh(stdscr); return TRUE;}/*----------------------------------------------------------------------------* * Function: 用某种颜色清除窗口. * Argument: * WINDOW *win - 窗口. * chtype attr - 颜色. * Return : * TRUE. *----------------------------------------------------------------------------*/wcls(WINDOW *win,chtype attr){ register char i,j; short f,b; wattron(win,attr); for(i=0;i<win->_maxy;i++) { for(j=0;j<win->_maxx;j++) { mvwaddch(win,i,j,' '); } } wattroff(win,attr); touchwin(win); wrefresh(win); return TRUE;}/*----------------------------------------------------------------------------* * Function: 用某种颜色清除屏幕的一行. * Argument: * short sy - 开始行. * short sx - 开始列. * short len - 长度. * chtype attr - 颜色. * Return : * TRUE. *----------------------------------------------------------------------------*/cls_line(int sy,int sx,int len,chtype attr){ return(wcls_line(stdscr,sy,sx,len,attr));}/*----------------------------------------------------------------------------* * Function: 用某种颜色清除窗口的一行. * Argument: * WINDOW *win - 窗口. * short sy - 开始行. * short sx - 开始列. * short len - 长度. * chtype attr - 颜色. * Return : * TRUE. *----------------------------------------------------------------------------*/wcls_line(WINDOW *win,int sy,int sx,int len,chtype attr){ register char i; if( need_check_flag ) { if( debug_yx(sy,sx,"wcls_line()") == FALSE || debug_yx(sy,sx+len-1,"wcls_line()") == FALSE || debug_rowcol(0,len,"wcls_line()") == FALSE ) return(FALSE); } wattron(win,attr); for(i=0;i<len;i++) { mvwaddch(win,sy,sx+i,' '); } wattroff(win,attr); touchwin(win); wrefresh(win); return TRUE;}/*----------------------------------------------------------------------------* * Function: 在屏幕中央显示一个系统消息窗口. * Argument: * char *msg - 消息文本. * Return : * TRUE. *----------------------------------------------------------------------------*/disp_sysbox(char *msg){ uchar i,len,sx,sy,lines; len = 20; lines = get_item_num(msg,'\n'); if( lines == 0 ) lines = 1; sy = (screen_endy - lines) / 2 - 1; if( sy < 0 ) sy = 0; if( lines == 0 ) { if( strlen(msg) > len ) len = strlen(msg); } else { for(i=0;i<lines;i++) { if( strlen(get_item(msg,'\n',i)) > len ) len = strlen(get_item(msg,'\n',i)); } } if( (len % 2) != 0 ) len+=7; else len+=8; if( len > 79 ) len = 79; sx=(80-len)/2; if( screen.wstyle & WINDOW_CHINESE ) disp_box(sy,sx,msg,"◆系统警告◆",MSG_AK); else disp_box(sy,sx,msg,"<Warning>",MSG_AK);}/*----------------------------------------------------------------------------* * Function: 显示一个消息窗口. * Argument: * short sy - 消息框的开始行. * short sx - 消息框的开始列. * char *msg - 消息文本. * char *title - 标题文本. * chtype flag - MSG_OK, MSG_OC, MSG_YN, MSG_YNC, MSG_RC, MSG_ARI. * Return : * TRUE. *----------------------------------------------------------------------------*/print_sysbox(format,va_alist)char *format;va_dcl{ va_list arg; char strbuf[DATA_LENGTH]; va_start(arg); vsprintf(strbuf,format,arg);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -