/* we_term.c */ /* Copyright (C) 1993 Fred Kruse */ /* This is free software; you can redistribute it and or */ /* modify it under the terms of the */ /* GNU General Public License, see the file COPYING. */ #include "edit.h" #ifdef UNIX #include #include #include #include #define KEYFN 42 #define NSPCHR 13 #ifndef XWPE_DLL #define WpeDllInit WpeTermInit #endif /* we_term.c */ char *init_key(char *key); char *init_kkey(char *key); int init_cursor(void); int e_begscr(void); void e_endwin(void); int fk_t_cursor(int x); int fk_t_putchar(int c); int fk_attrset(int a); int e_t_refresh(void); int e_t_sys_ini(void); int e_t_sys_end(void); int e_t_getch(void); int e_find_key(int c, int j, int sw); void e_exitm(char *s, int n); int fk_t_locate(int x, int y); int fk_t_mouse(int *g); int e_t_initscr(void); int e_t_kbhit(void); int e_t_d_switch_out(int sw); int e_t_switch_screen(int sw); int e_t_deb_out(FENSTER *f); int e_s_sys_end(); int e_s_sys_ini(); extern int MAXSLNS; extern int MAXSCOL; #ifndef NCURSES char *key_f[KEYFN], *key_key; #endif char *cur_rc, *cur_vs, *cur_nvs, *cur_vvs, cur_attr; char *att_so, *att_ul, *att_rv, *att_bl, *att_dm, *att_bo; char *ratt_no, *ratt_so, *ratt_ul, *ratt_rv, *ratt_bl, *ratt_dm, *ratt_bo; char *beg_scr, *swt_scr, *sav_cur, *res_cur; extern char *altschirm; extern char *att_no; char *col_fg, *col_bg, *spc_st, *spc_in, *spc_bg, *spc_nd; extern int col_num; #ifdef NCURSES chtype sp_chr[NSPCHR]; #else char *sp_chr[NSPCHR]; #endif extern int cur_x, cur_y; extern struct termios otermio, ntermio, ttermio; #ifdef TERMCAP char area[315]; char *ap = area; char tcbuf[1024]; char *tc_screen; char *tgetstr(); int tgetnum(); char *tgoto(); #define tigetstr(k) tgetstr(k, &ap) #define term_move(x,y) e_putp(tgoto(cur_rc, x, y)) #define term_refresh() fflush(stdout) #else /* Because term.h defines "buttons" it messes up we_gpm.c if in edit.h */ #include /* AIX requires that tparm has 10 arguments. */ #define tparm1(a,b) tparm((a), (b), 0, 0, 0, 0, 0, 0, 0, 0) #define tparm2(a,b,c) tparm((a), (b), (c), 0, 0, 0, 0, 0, 0, 0) #ifdef NCURSES #define term_move(x,y) move(y, x) #define term_refresh() refresh() #else #define term_move(x,y) e_putp(tparm2(cur_rc, y, x)) #define term_refresh() fflush(stdout) #endif #endif int WpeDllInit(int *argc, char **argv) { fk_u_cursor = fk_t_cursor; fk_u_locate = fk_t_locate; e_u_d_switch_out = e_t_d_switch_out; e_u_switch_screen = e_t_switch_screen; e_u_deb_out = e_t_deb_out; e_u_kbhit = e_t_kbhit; e_u_s_sys_end = e_s_sys_end; e_u_s_sys_ini = e_s_sys_ini; e_u_refresh = e_t_refresh; e_u_getch = e_t_getch; e_u_sys_ini = e_t_sys_ini; e_u_sys_end = e_t_sys_end; e_u_system = system; fk_u_putchar = fk_t_putchar; #ifdef HAVE_LIBGPM if (WpeGpmMouseInit() == 0) { fk_mouse = WpeGpmMouse; } else #endif fk_mouse = fk_t_mouse; WpeMouseChangeShape = (void (*)(WpeMouseShape))WpeNullFunction; WpeMouseRestoreShape = WpeNullFunction; WpeDisplayEnd = e_endwin; #ifdef __linux__ u_bioskey = WpeLinuxBioskey; #else u_bioskey = WpeZeroFunction; #endif e_t_initscr(); if (col_num > 0) { e_pr_u_col_kasten = e_pr_x_col_kasten; e_frb_u_menue = e_frb_x_menue; e_s_u_clr = e_s_x_clr; e_n_u_clr = e_n_x_clr; } else { e_pr_u_col_kasten = e_pr_t_col_kasten; e_frb_u_menue = e_frb_t_menue; e_s_u_clr = e_s_t_clr; e_n_u_clr = e_n_t_clr; } MCI = '+'; MCA = '0'; RD1 = '\01'; RD2 = '\02'; RD3 = '\03'; RD4 = '\04'; RD5 = '\05'; RD6 = '\06'; RE1 = '\01'; RE2 = '\02'; RE3 = '\03'; RE4 = '\04'; RE5 = '\05'; RE6 = '\06'; WBT = '\13'; ctree[0] = "\11\12\07"; /* 07 -> 30 */ ctree[1] = "\11\12\12"; /* 11 -> 16 */ ctree[2] = "\11\07\12"; /* 12 -> 22 */ ctree[3] = "\10\12\12"; /* 10 -> 25 */ ctree[4] = "\11\12\12"; /* RD1 = '+'; RD2 = '+'; RD3 = '+'; RD4 = '+'; RD5 = '-'; RD6 = '|'; *//* RE1 = '.'; RE2 = '.'; RE3 = '.'; RE4 = '.'; RE5 = '.'; RE6 = ':'; WBT = '#'; ctree[0] = "|__"; ctree[1] = "|__"; ctree[2] = "|__"; ctree[3] = "|__"; ctree[4] = "|__"; */ return 0; } char *init_key(char *key) { char *tmp, *keystr; tmp = (char *) tigetstr(key); if (tmp == NULL || tmp == ((char *) -1)) return(NULL); else { keystr = MALLOC(strlen(tmp)+1); strcpy(keystr, tmp); } return(keystr); } #ifndef NCURSES char *init_kkey(char *key) { char *tmp; int i; tmp = init_key(key); if (tmp == NULL) return(NULL); if (!key_key) { key_key = MALLOC(2); key_key[0] = tmp[1]; key_key[1] = '\0'; return(tmp); } else { for (i = 0; key_key[i] != '\0'; i++) if (key_key[i] == tmp[1]) return(tmp); key_key = REALLOC(key_key, i + 2); key_key[i] = tmp[1]; key_key[i + 1] = '\0'; } return(tmp); } #endif char *init_spchr(char c) { int i; char *pt = NULL; if (!spc_st || !spc_bg || !spc_nd) return(NULL); for (i = 0; spc_st[i] && spc_st[i+1] && spc_st[i] != c; i+=2) ; if (spc_st[i] && spc_st[i+1]) { pt = MALLOC((strlen(spc_bg)+strlen(spc_nd)+2)*sizeof(char)); if(pt) sprintf(pt, "%s%c%s", spc_bg, spc_st[i+1], spc_nd); } return(pt); } int init_cursor() { #ifndef TERMCAP if (!(cur_rc = init_key("cup"))) return(-1); if ((col_fg = init_key("setaf")) && (col_bg = init_key("setab"))) { /* terminfo 10.2.x color code */ if ((col_num = tigetnum("colors")) < 0) col_num = 8; } else if ((col_fg = init_key("setf")) && (col_bg = init_key("setb"))) { /* Older terminfo color code */ if((col_num = tigetnum("colors")) < 0) col_num = 8; } else { /* No colors */ if(col_fg) { free(col_fg); col_fg = NULL; } if(col_bg) { free(col_bg); col_bg = NULL; } } spc_st = init_key("acsc"); spc_in = init_key("enacs"); spc_bg = init_key("smacs"); spc_nd = init_key("rmacs"); att_no = init_key("sgr0"); att_so = init_key("smso"); att_ul = init_key("smul"); att_rv = init_key("rev"); att_bl = init_key("blink"); att_dm = init_key("dim"); att_bo = init_key("bold"); ratt_no = init_key("sgr0"); ratt_so = init_key("rmso"); ratt_ul = init_key("rmul"); ratt_rv = init_key("sgr0"); ratt_bl = init_key("sgr0"); ratt_dm = init_key("sgr0"); ratt_bo = init_key("sgr0"); beg_scr = init_key("smcup"); swt_scr = init_key("rmcup"); sav_cur = init_key("sc"); res_cur = init_key("rc"); #ifndef NCURSES key_f[0] = init_kkey("kf1"); key_f[1] = init_kkey("kf2"); key_f[2] = init_kkey("kf3"); key_f[3] = init_kkey("kf4"); key_f[4] = init_kkey("kf5"); key_f[5] = init_kkey("kf6"); key_f[6] = init_kkey("kf7"); key_f[7] = init_kkey("kf8"); key_f[8] = init_kkey("kf9"); key_f[9] = init_kkey("kf10"); key_f[10] = init_kkey("kcuu1"); key_f[11] = init_kkey("kcud1"); key_f[12] = init_kkey("kcub1"); key_f[13] = init_kkey("kcuf1"); key_f[14] = init_kkey("kich1"); key_f[15] = init_kkey("khome"); key_f[16] = init_kkey("kpp"); if(!(key_f[17] = init_kkey("kdch1"))) key_f[17] = "\177"; key_f[18] = init_kkey("kend"); key_f[19] = init_kkey("knp"); key_f[20] = init_kkey("kbs"); key_f[21] = init_kkey("khlp"); key_f[22] = init_kkey("kll"); key_f[23] = init_kkey("kf17"); key_f[24] = init_kkey("kf18"); key_f[25] = init_kkey("kf19"); key_f[26] = init_kkey("kf20"); key_f[27] = init_kkey("kf21"); key_f[28] = init_kkey("kf22"); key_f[29] = init_kkey("kf23"); key_f[30] = init_kkey("kf24"); key_f[31] = init_kkey("kf25"); key_f[32] = init_kkey("kf26"); key_f[33] = init_kkey("kPRV"); key_f[34] = init_kkey("kNXT"); key_f[35] = init_kkey("kLFT"); key_f[36] = init_kkey("kRIT"); key_f[37] = init_kkey("kHOM"); key_f[38] = init_kkey("kri"); key_f[39] = init_kkey("kEND"); key_f[40] = init_kkey("kind"); key_f[41] = init_kkey("kext"); #endif #else if(!(cur_rc = init_key("cm"))) return(-1); if((col_fg = init_key("Sf")) && (col_bg = init_key("Sb"))) { if((col_num = tgetnum("Co")) < 0) col_num = 8; } else { if(col_fg) { free(col_fg); col_fg = NULL; } if(col_bg) { free(col_bg); col_bg = NULL; } } spc_st = init_key("ac"); spc_in = init_key("eA"); spc_bg = init_key("as"); spc_nd = init_key("ae"); att_no = init_key("me"); att_so = init_key("so"); att_ul = init_key("us"); att_rv = init_key("mr"); att_bl = init_key("mb"); att_dm = init_key("mh"); att_bo = init_key("md"); ratt_no = init_key("me"); ratt_so = init_key("se"); ratt_ul = init_key("ue"); ratt_rv = init_key("me"); ratt_bl = init_key("me"); ratt_dm = init_key("me"); ratt_bo = init_key("me"); beg_scr = init_key("ti"); swt_scr = init_key("te"); sav_cur = init_key("sc"); res_cur = init_key("rc"); key_f[0] = init_kkey("k1"); key_f[1] = init_kkey("k2"); key_f[2] = init_kkey("k3"); key_f[3] = init_kkey("k4"); key_f[4] = init_kkey("k5"); key_f[5] = init_kkey("k6"); key_f[6] = init_kkey("k7"); key_f[7] = init_kkey("k8"); key_f[8] = init_kkey("k9"); key_f[9] = init_kkey("k;"); key_f[10] = init_kkey("ku"); key_f[11] = init_kkey("kd"); key_f[12] = init_kkey("kl"); key_f[13] = init_kkey("kr"); key_f[14] = init_kkey("kI"); key_f[15] = init_kkey("kh"); key_f[16] = init_kkey("kP"); key_f[17] = init_kkey("kD"); key_f[18] = init_kkey("@7"); key_f[19] = init_kkey("kN"); key_f[20] = init_kkey("kb"); key_f[21] = init_kkey("%1"); key_f[22] = init_kkey("kH"); key_f[23] = init_kkey("F7"); key_f[24] = init_kkey("F8"); key_f[25] = init_kkey("F9"); key_f[26] = init_kkey("FA"); key_f[27] = init_kkey("FB"); key_f[28] = init_kkey("FC"); key_f[29] = init_kkey("FD"); key_f[30] = init_kkey("FE"); key_f[31] = init_kkey("FF"); key_f[32] = init_kkey("FG"); key_f[33] = init_kkey("%e"); key_f[34] = init_kkey("%c"); key_f[35] = init_kkey("#4"); key_f[36] = init_kkey("%i"); key_f[37] = init_kkey("#2"); key_f[38] = init_kkey("kR"); key_f[39] = init_kkey("*7"); key_f[40] = init_kkey("kF"); key_f[41] = init_kkey("@1"); #endif #ifdef NCURSES sp_chr[0] = 0; sp_chr[1] = ACS_ULCORNER; sp_chr[2] = ACS_URCORNER; sp_chr[3] = ACS_LLCORNER; sp_chr[4] = ACS_LRCORNER; sp_chr[5] = ACS_HLINE; sp_chr[6] = ACS_VLINE; sp_chr[7] = ACS_S9; sp_chr[8] = ACS_VLINE; sp_chr[9] = ACS_VLINE; sp_chr[10] = ACS_S9; sp_chr[11] = ACS_DIAMOND; sp_chr[12] = ' '; #else sp_chr[0] = ""; if(!(sp_chr[1] = init_spchr('l'))) sp_chr[1] = "+"; if(!(sp_chr[2] = init_spchr('k'))) sp_chr[2] = "+"; if(!(sp_chr[3] = init_spchr('m'))) sp_chr[3] = "+"; if(!(sp_chr[4] = init_spchr('j'))) sp_chr[4] = "+"; if(!(sp_chr[5] = init_spchr('q'))) sp_chr[5] = "-"; if(!(sp_chr[6] = init_spchr('x'))) sp_chr[6] = "|"; if(!(sp_chr[7] = init_spchr('w'))) sp_chr[7] = "_"; if(!(sp_chr[8] = init_spchr('t'))) sp_chr[8] = "|"; if(!(sp_chr[9] = init_spchr('m'))) sp_chr[9] = "|"; if(!(sp_chr[10] = init_spchr('q'))) sp_chr[10] = "_"; if(!(sp_chr[11] = init_spchr('`'))) sp_chr[11] = "#"; if(!(sp_chr[12] = init_spchr('a'))) sp_chr[12] = " "; #endif return(0); } int e_t_initscr() { int ret, i, k; #ifndef TERMCAP WINDOW * stdscr; #endif ret = tcgetattr(1, &otermio); /* save old settings */ /* if(ret) { printf("Error in Terminal Initialisation Code: %d\n", ret); printf("c_iflag = %o, c_oflag = %o, c_cflag = %o,\n", otermio.c_iflag, otermio.c_oflag, otermio.c_cflag); printf("c_lflag = %o, c_line = %o, c_cc = {\"\\%o\\%o\\%o\\%o\\%o\\%o\\%o\\%o\"}\n", otermio.c_lflag, otermio.c_line, otermio.c_cc[0], otermio.c_cc[1], otermio.c_cc[2], otermio.c_cc[3], otermio.c_cc[4], otermio.c_cc[5], otermio.c_cc[6], otermio.c_cc[7]); WpeExit(1); } */ #ifndef TERMCAP if ((stdscr=initscr())==(WINDOW *)ERR) exit(27); #ifdef NCURSES cbreak(); noecho(); nonl(); intrflush(stdscr,FALSE); keypad(stdscr,TRUE); #endif if (has_colors()) { start_color(); for (i = 0; i < COLORS; i++) { for (k = 0; k < COLORS; k++) { if (i != 0 || k != 0) { init_pair(i * 8 + k, k, i); } } } } #endif e_begscr(); schirm = MALLOC(2 * MAXSCOL * MAXSLNS); altschirm = MALLOC(2 * MAXSCOL * MAXSLNS); #if !defined(NO_XWINDOWS) && defined(NEWSTYLE) extbyte = MALLOC(MAXSCOL * MAXSLNS); #endif e_abs_refr(); if(init_cursor()) { printf("Terminal Not in the right mode\n"); e_exit(1); } tcgetattr(0, &ntermio); ntermio.c_iflag = 0; /* setup new settings */ ntermio.c_oflag = 0; ntermio.c_lflag = 0; ntermio.c_cc[VMIN] = 1; ntermio.c_cc[VTIME] = 0; #ifdef VSWTCH ntermio.c_cc[VSWTCH] = 0; #endif tcsetattr(0, TCSADRAIN, &ntermio); if (spc_in) e_putp(spc_in); return(0); } int svflgs, kbdflgs; int e_begscr() { int cols, lns; kbdflgs = fcntl( 0, F_GETFL, 0 ); #ifndef TERMCAP #ifndef NCURSES setupterm((char *)0, 1, (int *)0); #endif if ((lns = tigetnum("lines")) > 0) MAXSLNS = lns; if ((cols = tigetnum("cols")) > 0) MAXSCOL = cols; #else if ((tc_screen = getenv("TERM")) == NULL) e_exitm("Environment variable TERM not defined!", 1); if ((tgetent(tcbuf, tc_screen)) != 1) e_exitm("Unknown terminal type!", 1); if ((lns = tgetnum("li")) > 0) MAXSLNS = lns; if ((cols = tgetnum("co")) > 0) MAXSCOL = cols; #endif return(0); } #define fk_putp(p) ( p ? e_putp(p) : e_putp(att_no) ) void e_endwin() { #ifdef NCURSES endwin(); #else fk_putp(ratt_bo); #endif tcsetattr(0, TCSADRAIN, &otermio); } int fk_t_cursor(int x) { return(x); } int fk_t_putchar(int c) { #ifdef NCURSES addch(c); return c; #else return(fputc(c, stdout)); #endif } int fk_attrset(int a) { if(cur_attr == a) return(0); #ifdef NCURSES switch(a) { case 0: attrset(A_NORMAL); break; case 1: attrset(A_STANDOUT); break; case 2: attrset(A_UNDERLINE); break; case 4: attrset(A_REVERSE); break; case 8: attrset(A_BLINK); break; case 16: attrset(A_DIM); break; case 32: attrset(A_BOLD); break; } #else switch(cur_attr) { case 0: fk_putp(ratt_no); break; case 1: fk_putp(ratt_so); break; case 2: fk_putp(ratt_ul); break; case 4: fk_putp(ratt_rv); break; case 8: fk_putp(ratt_bl); break; case 16: fk_putp(ratt_dm); break; case 32: fk_putp(ratt_bo); break; } switch(a) { case 0: fk_putp(att_no); break; case 1: fk_putp(att_so); break; case 2: fk_putp(att_ul); break; case 4: fk_putp(att_rv); break; case 8: fk_putp(att_bl); break; case 16: fk_putp(att_dm); break; case 32: fk_putp(att_bo); break; } #endif return(cur_attr = a); } void fk_colset(int c) { int bg; if (cur_attr == c) return; cur_attr = c; bg = c / 16; #ifdef TERMCAP if ((c %= 16) >= col_num) { fk_putp(att_bo); e_putp(tgoto(col_fg, 0, c % col_num)); e_putp(tgoto(col_bg, 0, bg)); } else { fk_putp(ratt_bo); e_putp(tgoto(col_fg, 0, c)); e_putp(tgoto(col_bg, 0, bg)); } #else #ifdef NCURSES if (c & 8) attrset(A_BOLD); else attrset(A_NORMAL); color_set((bg * 8) + c % 8, NULL); #else if ((c %= 16) >= col_num) { fk_putp(att_bo); e_putp(tparm1(col_fg, c % col_num)); e_putp(tparm1(col_bg, bg)); } else { fk_putp(ratt_bo); e_putp(tparm1(col_fg, c)); e_putp(tparm1(col_bg, bg)); } #endif #endif } int e_t_refresh() { int x = cur_x, y = cur_y, i, j, c; fk_cursor(0); for(i = 0; i < MAXSLNS; i++) for(j = 0; j < MAXSCOL; j++) { if (i == MAXSLNS-1 && j == MAXSCOL-1) break; if (*(schirm + 2*MAXSCOL * i + 2 * j) != *(altschirm + 2*MAXSCOL * i + 2 * j) || *(schirm + 2*MAXSCOL * i + 2 * j + 1) != *(altschirm + 2*MAXSCOL * i + 2 * j + 1) ) { if (cur_x != j || cur_y != i) term_move(j, i); if (cur_x < MAXSCOL) { cur_x = j + 1; cur_y = i; } else { cur_x = 0; cur_y = i+1; } if (col_num <= 0) fk_attrset(e_gt_col(j, i)); else fk_colset(e_gt_col(j, i)); c = e_gt_char(j, i); #ifdef NCURSES if (c < NSPCHR) addch(sp_chr[c]); else addch(c); #else if (c < NSPCHR) e_putp(sp_chr[c]); else fputc(c, stdout); #endif *(altschirm + 2*MAXSCOL * i + 2 * j) = *(schirm + 2*MAXSCOL * i + 2 * j); *(altschirm + 2*MAXSCOL * i + 2 * j + 1) = *(schirm + 2*MAXSCOL * i + 2 * j + 1); } } fk_cursor(1); fk_locate(x, y); term_refresh(); return(0); } int e_t_sys_ini() { e_refresh(); tcgetattr(0, &ttermio); svflgs = fcntl( 0, F_GETFL, 0 ); e_endwin(); return(0); } int e_t_sys_end() { tcsetattr(0, TCSADRAIN, &ttermio); fcntl( 0, F_SETFL, svflgs ); e_abs_refr(); fk_locate(0, 0); return(0); } int e_t_kbhit() { int ret; char kbdflgs, c; e_refresh(); kbdflgs = fcntl(0, F_GETFL, 0 ); fcntl(0, F_SETFL, kbdflgs | O_NONBLOCK); ret = read(0, &c, 1); fcntl(0, F_SETFL, kbdflgs & ~O_NONBLOCK); return (ret == 1 ? c : 0); } #ifdef NCURSES int e_t_getch() { int c, bk; e_refresh(); c = fk_getch(); if (c > KEY_CODE_YES) { switch (c) { case KEY_F(1): c = F1; break; case KEY_F(2): c = F2; break; case KEY_F(3): c = F3; break; case KEY_F(4): c = F4; break; case KEY_F(5): c = F5; break; case KEY_F(6): c = F6; break; case KEY_F(7): c = F7; break; case KEY_F(8): c = F8; break; case KEY_F(9): c = F9; break; case KEY_F(10): c = F10; break; case KEY_UP: c = CUP; break; case KEY_DOWN: c = CDO; break; case KEY_LEFT: c = CLE; break; case KEY_RIGHT: c = CRI; break; case KEY_SFIND: c = EINFG; break; case KEY_IC: c = POS1; break; case KEY_DC: c = BUP; break; case KEY_PPAGE: c = ENDE; break; case KEY_NPAGE: c = BDO; break; case KEY_BACKSPACE: c = WPE_DC; break; case KEY_HELP: c = HELP; break; case KEY_LL: c = ENDE; break; case KEY_F(17): c = SF1; break; case KEY_F(18): c = SF2; break; case KEY_F(19): c = SF3; break; case KEY_F(20): c = SF4; break; case KEY_F(21): c = SF5; break; case KEY_F(22): c = SF6; break; case KEY_F(23): c = SF7; break; case KEY_F(24): c = SF8; break; case KEY_F(25): c = SF9; break; case KEY_F(26): c = SF10; break; case KEY_PREVIOUS: c = CUP+512; break; case KEY_NEXT: c = CDO+512; break; case KEY_HOME: c = POS1+512; break; case KEY_END: c = ENDE+512; break; default: c = 0; break; } bk = bioskey(); if (bk & 3) c += 512; else if (bk & 4) c += 514; } else if ( c == WPE_TAB ) { bk = bioskey(); if ( bk & 3) c = WPE_BTAB; else c = WPE_TAB; } else if (c == WPE_ESC) { c = fk_getch(); if (c > KEY_CODE_YES) { switch (c) { case KEY_F(1): c = AF1; break; case KEY_F(2): c = AF2; break; case KEY_F(3): c = AF3; break; case KEY_F(4): c = AF4; break; case KEY_F(5): c = AF5; break; case KEY_F(6): c = AF6; break; case KEY_F(7): c = AF7; break; case KEY_F(8): c = AF8; break; case KEY_F(9): c = AF9; break; case KEY_F(10): c = AF10; break; case KEY_UP: c = BUP; break; case KEY_DOWN: c = BDO; break; case KEY_LEFT: c = CCLE; break; case KEY_RIGHT: c = CCRI; break; case KEY_SFIND: c = EINFG; break; case KEY_IC: c = CPS1; break; case KEY_DC: c = CBUP; break; case KEY_PPAGE: c = CEND; break; case KEY_NPAGE: c = CBDO; break; case KEY_BACKSPACE: c = AltBS; break; case KEY_HELP: c = AF1; break; case KEY_LL: c = CEND; break; case KEY_PREVIOUS: c = BUP+512; break; case KEY_NEXT: c = BDO+512; break; case KEY_HOME: c = CPS1+512; break; case KEY_END: c = CEND+512; break; default: c = 0; break; } bk = bioskey(); if (bk & 3) c += 512; else if (bk & 4) c += 514; } else if (c != WPE_ESC) c = e_tast_sim(c); } return(c); } #else int e_t_getch() { int c, c2, pshift, bk; pshift = 0; e_refresh(); if ((c = fk_getch()) != WPE_ESC) { if (key_f[20] && c == *key_f[20]) return(WPE_DC); else if (key_f[17] && c == *key_f[17]) return(ENTF); else if ( c == WPE_TAB ) { bk = bioskey(); if (bk & 3) return (WPE_BTAB); else return (WPE_TAB); } else return(c); } else if ((c = fk_getch()) == WPE_CR) return(WPE_ESC); bk = bioskey(); if (bk & 3) pshift = 512; else if (bk & 4) pshift = 514; if (c == WPE_ESC) { if ((c = fk_getch()) == WPE_ESC) return(WPE_ESC); if ((c2 = e_find_key(c, 1, 1))) return(c2 + pshift); } if ((c2 = e_find_key((char)c, 1, 0))) return(c2 + pshift); return(e_tast_sim(c + pshift)); } char e_key_save[10]; int e_find_key(int c, int j, int sw) { int i, k; e_key_save[j] = c; e_key_save[j+1] = '\0'; for(i = 0; i < KEYFN; i++) { if(key_f[i] == NULL) continue; for(k = 1; k <= j && e_key_save[k] == *(key_f[i] + k); k++); if(k > j) { if(*(key_f[i] + k) != '\0') return(e_find_key(fk_getch(), j+1, sw)); else if(sw) { switch(i) { case 0: return(AF1); case 1: return(AF2); case 2: return(AF3); case 3: return(AF4); case 4: return(AF5); case 5: return(AF6); case 6: return(AF7); case 7: return(AF8); case 8: return(AF9); case 9: return(AF10); case 10: return(BUP); case 11: return(BDO); case 12: return(CCLE); case 13: return(CCRI); case 14: return(EINFG); case 15: return(CPS1); case 16: return(CBUP); case 17: return(ENTF); case 18: return(CEND); case 19: return(CBDO); case 20: return(AltBS); case 21: return(AF1); case 22: return(CEND); case 33: return(BUP+512); case 34: return(BDO+512); case 35: return(CCLE+512); case 36: return(CCRI+512); case 37: return(CPS1+512); case 38: return(CBUP+512); case 39: return(CEND+512); case 40: return(CBDO+512); case 41: return(CEND); default: return(0); } } else { switch(i) { case 0: return(F1); case 1: return(F2); case 2: return(F3); case 3: return(F4); case 4: return(F5); case 5: return(F6); case 6: return(F7); case 7: return(F8); case 8: return(F9); case 9: return(F10); case 10: return(CUP); case 11: return(CDO); case 12: return(CLE); case 13: return(CRI); case 14: return(EINFG); case 15: return(POS1); case 16: return(BUP); case 17: return(ENTF); case 18: return(ENDE); case 19: return(BDO); case 20: return(WPE_DC); case 21: return(HELP); case 22: return(ENDE); case 23: return(SF1); case 24: return(SF2); case 25: return(SF3); case 26: return(SF4); case 27: return(SF5); case 28: return(SF6); case 29: return(SF7); case 30: return(SF8); case 31: return(SF9); case 32: return(SF10); case 33: return(CUP+512); case 34: return(CDO+512); case 35: return(CLE+512); case 36: return(CRI+512); case 37: return(POS1+512); case 38: return(BUP+512); case 39: return(ENDE+512); case 40: return(BDO+512); case 41: return(ENDE); default: return(0); } } } } return(0); } #endif int fk_t_locate(int x, int y) { if (col_num > 0) { fk_colset(e_gt_col(cur_x, cur_y)); #ifdef NCURSES /* Causes problems. Reason unknown. - Dennis */ /*mvaddch(cur_y,cur_x,e_gt_char(cur_x, cur_y));*/ #else fputc(e_gt_char(cur_x, cur_y), stdout); #endif } cur_x = x; cur_y = y; term_move(x, y); return(y); } int fk_t_mouse(int *g) { return(0); } int e_t_switch_screen(int sw) { static int sav_sw = -1; if (sw == sav_sw) return(0); sav_sw = sw; if (sw && beg_scr) { term_refresh(); if (sav_cur) e_putp(sav_cur); e_putp(beg_scr); } else if (!sw && swt_scr) { e_putp(swt_scr); if (res_cur) e_putp(res_cur); term_refresh(); } else return(-1); return(0); } int e_t_deb_out(FENSTER *f) { #ifndef NCURSES if (!swt_scr || !beg_scr) #endif return(e_error("Your terminal don\'t use begin/end cup", 0, f->fb)); e_d_switch_out(1); getchar(); e_d_switch_out(0); return(0); } int e_d_switch_screen(int sw) { #ifdef DEBUGGER if (!sw) e_g_sys_ini(); else e_g_sys_end(); #endif return(e_switch_screen(sw)); } int e_t_d_switch_out(int sw) { int i, j; static int save_sw = 32000; if (save_sw == sw) return(0); save_sw = sw; if (sw && e_d_switch_screen(0)) { term_move(0, 0); e_putp(att_no); for(i = 0; i < MAXSLNS; i++) for (j = 0; j < MAXSCOL; j++) e_d_putchar(' '); term_move(0, 0); term_refresh(); } else if (!sw) { e_d_switch_screen(1); e_abs_refr(); e_refresh(); } return(sw); } void e_exitm(char *s, int n) { e_endwin(); if (n != 0) printf("\n%s\n", s); exit(n); } int e_s_sys_ini() { e_sys_ini(); return(e_switch_screen(0)); } int e_s_sys_end() { e_switch_screen(1); return(e_sys_end()); } #endif /* Is UNIX */