📄 curlib.c
字号:
/*----------------------------------------------------------------------------* * 功 能: 光标库文件. * * 版 本: 1.00 * * 运行环境: SCO UNIX V3.2.4 以上版本. * * 历史记录: 日 期 作 者 备 注 * *----------------------------------------------------------------------------* * 1999/10/20 赖正兴 创建 * *----------------------------------------------------------------------------* * All rights reserved. Copyright (C) 1999-20001. * *----------------------------------------------------------------------------*/#include "curlib.h"/* * Globel varibles. *//***************************************************************************/attr_t screen; /* 屏幕属性 *//***************************************************************************//***************************************************************************/int need_check_flag = 0;int is_tty_flag = 0; /* 1.终端 0.主机控制台*/int not_color = 0; /* 1.不支持颜色 0.支持颜色 */int begin_work_flag = -1; /* begin_work() Use *///int argc;//char **argv;uchar sysbox_starty = 10; /* 系统提示的行位置 */uchar screen_starty = 0; /* screen 左上角 starty */uchar screen_startx = 0; /* screen 左上角 startx */uchar screen_endy = 23; /* screen 右下角 endy */uchar screen_endx = 79; /* screen 右下角 endx */uchar screen_maxrow = 24; /* screen 最大行 */uchar screen_maxcol = 80; /* screen 最大列 *//***************************************************************************//* * Local micros define. */#define DISPLAY_LENGTH 512/* * Local struct define. */typedef struct msgcmd_s { uchar id; char text[11]; int coord; struct msgcmd_s *next; struct msgcmd_s *prev; } msgcmd_t;/* * Local variables. */static window_t *windows[WINDOW_NUM];static int window_num;static vs_t vs;static char dispbuf[512];/* * Local function decleare. *//* * Functions. *//****************************************************************************** * <第一章> 屏幕窗口函数. * ******************************************************************************/ set_mode() { struct termio term; if (ioctl(0,TCGETA,&term) == -1 ) { perror("ioctl(TCGETA)"); end_work(); } term.c_lflag &= ~ICANON; term.c_lflag &= ~ECHO; term.c_cc[VMIN] = 0; term.c_cc[VTIME] = 1; if( ioctl(0,TCSETA,&term) == -1 ) /* Change Terminal Read_Define */ { perror("ioctl(TCSETA)"); end_work(); }}/*----------------------------------------------------------------------------* * Function: Initialize screen. * Argument: * None. * Return : * TRUE: successed. * FALSE: failured. *----------------------------------------------------------------------------*/int begin_work(void){ char *ttyname(),name[80]; if( begin_work_flag != -1 ) return(TRUE); initscr(); /* Initialize Screen */ set_mode(); umask(0); /* Change File Right (666) */ signal(SIGHUP ,SIG_IGN); signal(SIGINT ,SIG_IGN); signal(SIGQUIT,SIG_IGN); signal(SIGILL ,end_work); signal(SIGTRAP,end_work); signal(SIGIOT ,end_work); signal(SIGABRT,end_work); signal(SIGKILL,end_work); signal(SIGTERM,end_work); signal(SIGUSR1,end_work); begin_work_flag = 0; strcpy(name,ttyname(0)); if(memcmp(name,"/dev/tty01",10)==0 || memcmp(name,"/dev/tty02",10)==0 || memcmp(name,"/dev/tty03",10)==0 || memcmp(name,"/dev/tty04",10)==0 || memcmp(name,"/dev/tty05",10)==0 || memcmp(name,"/dev/tty06",10)==0 || memcmp(name,"/dev/tty07",10)==0 || memcmp(name,"/dev/tty08",10)==0 || memcmp(name,"/dev/tty09",10)==0 || memcmp(name,"/dev/tty10",10)==0 || memcmp(name,"/dev/tty11",10)==0 || memcmp(name,"/dev/tty12",10)==0 || (memcmp(name,"/dev/ttyp",9)==0 && memcmp(getenv("TERM"),"ansi",4)==0) || memcmp(name,"/dev/ttysyscon",14)==0 ) { is_tty_flag = 0; screen_endy = 24; /* screen 右下角 endy */ screen_maxrow = 25; /* screen 最大行 */ } else { is_tty_flag = 1; screen_endy = 23; /* screen 右下角 endy */ screen_maxrow = 24; /* screen 最大行 */ }#if 0 sprint(0,0,"is_tty_flag=%d name:%s tty:%s",is_tty_flag,name,getenv("TERM")); get_char();#endif set_color_pair(); if( is_tty_flag || !has_colors() ) { not_color = 1; /* 1.不支持颜色 0.支持颜色 */ set_tty_attr(); } else { not_color = 0; /* 1.不支持颜色 0.支持颜色 */ screen.title = COL(RED,WHITE); /* 标题(前景色,背景色) */ screen.text = COL(WHITE,BLACK);/* 正文(前景色,背景色) */ screen.board = COL(BLACK,WHITE);/* 边框(前景色,背景色) */ screen.client = COL(WHITE,CYAN); /* 客户区颜色(前景色,背景色) */ screen.select = COL(BLACK,GREEN);/* 选项(前景色,背景色) */ screen.hotkey = COL(RED,BLACK); /* 热键(前景色,背景色) */ screen.shade = COL(CYAN,BLACK); /* 阴影(前景色,背景色) */ screen.prompt = COL(WHITE,BLACK);/* 提示颜色(前景色,背景色) */ screen.edit = COL(WHITE,BLACK);/* 编辑颜色(前景色,背景色) */ screen.wstyle = WINDOW_CHINESE|WINDOW_SHADE;/* 窗口风格 */ } return(TRUE);}void set_tty_attr(void){ screen.title = A_REVERSE;/* 标题(前景色,背景色) */ screen.text = A_NORMAL;/* 正文(前景色,背景色) */ screen.board = A_NORMAL;/* 边框(前景色,背景色) */ screen.client = A_NORMAL;/* 客户区颜色(前景色,背景色) */ screen.select = A_REVERSE;/* 选项(前景色,背景色) */ screen.hotkey = A_UNDERLINE; /* 热键(下划线) */ screen.shade = A_NORMAL;/* 阴影(前景色,背景色) */ screen.prompt = A_REVERSE;/* 提示颜色 (前景色,背景色) */ screen.edit = A_REVERSE;/* 编辑颜色(前景色,背景色) */ screen.wstyle = WINDOW_CHINESE; /* 窗口风格 */}/*----------------------------------------------------------------------------* * Function: End screen. * Argument: * None. * Return : * None. *----------------------------------------------------------------------------*/void end_work(){ printf("%c[=%dF%c[=%dG%c[0m",27,7,27,0,27); /*缺省黑底白字*/ clear(); touchwin(stdscr); refresh(); endwin(); /* Initialize Screen */ exit(0); /* Exit Program */}/*----------------------------------------------------------------------------* * FUNCTION: 初始化系统颜色. * Argument: * None. * Return : * None. *----------------------------------------------------------------------------*/set_color_pair(){ short i,j; if( has_colors() ) { if( start_color() == OK ) { for(i=0;i<COLORS;i++) for(j=0;j<COLORS;j++) init_pair((short)(i+j*COLORS),i,j); return(TRUE); } else return(FALSE); } else return(FALSE);}/*----------------------------------------------------------------------------* * Function: 关闭或打开光标. * Argument: * int flag - 0.CUR_DISABLE 1.CUR_ENABLE. * Return : * None. *----------------------------------------------------------------------------*/void cursor_control(int flag){ if( !is_tty_flag ) {#ifdef SCO_UNIX if( flag == CUR_DISABLE ) { } else { }#endif return; } if( flag == CUR_DISABLE ) { printf("%c[?%dl",KeyEsc,25); } else { printf("%c[?%dh",KeyEsc,25); }}/*----------------------------------------------------------------------------* * Function: 创建一个窗口. * Argument: * uchar sy - 指定box的开始行坐标. * uchar sx - 指定box的开始列坐标. * uchar row - 指定box中文本的行数. * uchar col - 指定box中文本的列数. * chtype tattr - 文本的前景色和背景色. * chtype battr - 边框的前景色和背景色. * chtype flag - WINDOW_SHADE: 阴影 WINDOW_ENGLISH: 英文制表符. * Return : * window_t * - 创建的窗口指针. * NULL - 创建失败. *----------------------------------------------------------------------------*/window_t *create_window(uchar sy,uchar sx,uchar row,uchar col,chtype tattr,chtype battr,chtype style){ window_t *win; if( need_check_flag ) { if((debug_yx(sy,sx,"create_window()") == FALSE) || (debug_rowcol(row,col,"create_window()") == FALSE) || (debug_yx(sy+row-1,sx+col-1,"create_window()") == FALSE) ) return(FALSE); } win=NULL; if( (win=(window_t *)malloc(sizeof(window_t))) == NULL ) { return NULL; } memset(win,'\0',sizeof(window_t)); win->sy = sy; win->sx = sx; if( style & WINDOW_NO_BOARD ) { win->row = row; win->col = col; } else if( style & WINDOW_CHINESE ) { if( style & WINDOW_SHADE ) { win->row = row+3; win->col = col+6; } else { win->row = row+2; win->col = col+4; } } else /* English board */ { if( style & WINDOW_SHADE ) { win->row = row+3; win->col = col+3; } else { win->row = row+2; win->col = col+2; } } win->tattr = tattr; win->battr = battr; win->style = style; return win;}/*----------------------------------------------------------------------------* * Function: 显示一个窗口,并保存窗口所覆盖的区域. * Argument: * window_t *win - 窗口指针. * Return : * TRUE - Success. * FALSE - Failure. *----------------------------------------------------------------------------*/show_window(window_t *win){ register uchar i,j; chtype *ptr; if( win == NULL ) return FALSE; if( (win->buf=(chtype *)malloc((win->row)*(win->col)*sizeof(chtype)+1)) == NULL ) { return FALSE; } ptr = win->buf; for(i=win->sy;i<win->sy+win->row;i++) { for(j=win->sx;j<win->sx+win->col;j++) { *ptr++=mvwinch(stdscr,i,j); } } tdraw_box(win->sy,win->sx,win->row,win->col,win->tattr,win->battr,win->style); return TRUE;}/*----------------------------------------------------------------------------* * Function: 隐一个窗口,并恢复窗口所覆盖的区域. * Argument: * window_t *win - 窗口指针. * Return : * TRUE - Success. *----------------------------------------------------------------------------*/hide_window(window_t *win){ register uchar i,j; chtype *ptr; if( win == NULL ) return TRUE; /* Restore old area */ if( win->buf != NULL ) { ptr = win->buf; for(i=win->sy;i<win->sy+win->row;i++) { for(j=win->sx;j<win->sx+win->col;j++) { mvwaddch(stdscr,i,j,*ptr++); } } wrefresh(stdscr); } free(win->buf); return TRUE;}/*----------------------------------------------------------------------------* * Function: 删除一个窗口,并恢复窗口所覆盖的区域. * Argument: * window_t *win - 窗口指针. * Return : * TRUE - Success. *----------------------------------------------------------------------------*/delete_window(window_t *win){ register uchar i,j; chtype *ptr; if( win == NULL ) return TRUE; /* Restore old area */ if( win->buf != NULL ) { ptr = win->buf; for(i=win->sy;i<win->sy+win->row;i++) { for(j=win->sx;j<win->sx+win->col;j++) { mvwaddch(stdscr,i,j,*ptr++); } } wrefresh(stdscr); } free(win->buf); free(win); return TRUE;}/*----------------------------------------------------------------------------* * FUNCTION: 保存一块屏幕区域, 显示一个窗口. * Argument: * uchar sy - 开始行. * uchar sx - 开始列. * uchar row - 行数. * uchar col - 列数. * Return : * TRUE - 成功. * FALSE - 失败. * 说 明: * 同 restore_window() 成对使用. *----------------------------------------------------------------------------*/save_window(uchar sy,uchar sx,uchar row,uchar col){ if( need_check_flag ) { if((debug_yx(sy,sx,"save_window()") ==FALSE) || (debug_rowcol(row,col,"save_window()") ==FALSE) || (debug_yx(sy+row-1,sx+col-1,"save_window()") ==FALSE) ) return(FALSE); } window_num++; if( window_num >= WINDOW_NUM ) { sprintf(dispbuf,"◆ 警告: 当前窗口号已超过 WINDOW_NUM[%d] !",WINDOW_NUM); disp_sysbox(dispbuf); return(FALSE); } if( (windows[window_num]=create_window(sy,sx,row,col,screen.text,screen.board,screen.wstyle)) == NULL ) { return -1; } show_window(windows[window_num]); return(TRUE);}/*----------------------------------------------------------------------------* * FUNCTION: 保存一块屏幕区域, 显示一个窗口. * Argument: * 无. * Return : * TRUE - 成功. * 说 明: * 同 save_window() 成对使用. *----------------------------------------------------------------------------*/restore_window(){ delete_window(windows[window_num]); window_num--; if( window_num < 0 ) window_num == 0; return(TRUE);}/*----------------------------------------------------------------------------* * FUNCTION: 保存一块屏幕区域, 显示一个窗口. * Argument: * uchar sy - 开始行. * uchar sx - 开始列. * uchar row - 行数. * uchar col - 列数. * Return : * TRUE - 成功. * FALSE - 失败. * 说 明: * 同 restore_vs() 一起使用. *----------------------------------------------------------------------------*/save_vs(int sy,int sx,int row,int col){#if 1 int i,j; char fname[81],tname[30],*ttyname(); chtype *ptr; FILE *fp; if( need_check_flag ) { if((debug_yx(sy,sx,"save_vs()") ==FALSE) || (debug_rowcol(row,col,"save_vs()") ==FALSE) || (debug_yx(sy+row-1,sx+col-1,"save_vs()") ==FALSE) ) return(FALSE); } strcpy(tname,ttyname(0)); strcce(tname,'/','_'); sprintf(fname,".screen.%d%s",getuid(),&tname[strlen(tname)-3]); if( (fp=fopen(fname,"w")) == NULL ) return FALSE; vs.sy = sy; vs.sx = sx; vs.row = row; vs.col = col; fprintf(fp,"%02d%02d%02d%02d\n",sy,sx,row,col); ptr = (chtype *)vs.buf; for(i=sy;i<sy+row;i++) { for(j=sx;j<sx+col;j++) { *ptr=mvwinch(stdscr,i,j); fprintf(fp,"%d ",*ptr); ptr++; } } fclose(fp); //cls(sy,sx,row,col,COL(WHITE,BLACK));#else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -