/* initkey.c - define terminfo keycodes Copyright 1990 Business Management Systems, Inc. Author: Stuart D. Gathman There are two goals here: 1) make sure that a minimal set of functions are available (so that the user can at least get out of the application). The program is aborted otherwise. 2) Provide several alternates for important keys to get around terminfo braindamage (and version differences). Note that the last Kdefine() for a particular sequence is the one in effect. */ #include #include #include "hackterm.h" #include #include /* work around braindamage in various terminfo flavors */ #ifndef TERMINAL #define TERMINAL struct term #endif extern TERMINAL *cur_term; /* required key */ static void reqkey(const char *name,const char *str,short code) { if (!str || !*str || Kdefine(str,code)) errvdesc(322,"Keycode %o (%s) not in terminfo",code,name); } static void optkey(const char *str,short code) { /* optional key */ static char def[2]; if (!str || !*str) { /* undefined strings may be NULL or "" */ if (!isascii(code)) return; def[0] = code; /* use code as default string */ str = def; } if (Kdefine(str,code)) errpost(322); } void initkey(void) { int i; /* first 10 fkeys are scrambled in terminfo (yuchh) */ reqkey("kf1",key_f1,KEY_F(1)); reqkey("kf2",key_f2,KEY_F(2)); reqkey("kf3",key_f3,KEY_F(3)); reqkey("kf4",key_f4,KEY_F(4)); reqkey("kf5",key_f5,KEY_F(5)); reqkey("kf6",key_f6,KEY_F(6)); reqkey("kf7",key_f7,KEY_F(7)); reqkey("kf8",key_f8,KEY_F(8)); reqkey("kf9",key_f9,KEY_F(9)); #ifdef key_f10 if (key_f10) { reqkey("kf10",key_f10,KEY_F(10)); optkey(key_f0,KEY_ENTER); /* possible "enter" */ } else reqkey("kf0",key_f0,KEY_F(10)); /* alternate F10 */ for (i = 11; i <= 30; ++i) optkey((&key_f11)[i-11],KEY_F(i)); #else reqkey("kf0",key_f0,KEY_F(10)); #endif reqkey("TAB duplicated","\t",KEY_TAB); reqkey("CR duplicated","\r",KEY_ENTER); /* standard ENTER key */ Kdefine("\n",KEY_ENTER); /* alternate ENTER (if not KEY_DOWN) */ Kdefine("\030",KEY_CANCEL); /* ^X cancel */ Kdefine("\007",KEY_RESET); Kdefine("\014",KEY_SELECT); Kdefine("\017",KEY_OPTIONS); reqkey("^C duplicated","\003",KEY_COMMAND); /* ^C attention */ #ifdef key_enter optkey(key_enter,KEY_ENTER); /* and yet another */ #endif optkey(key_eol,KEY_EOL); Kdefine("\b",KEY_BACKSPACE); /* fall back for backspace */ optkey(key_backspace,KEY_BACKSPACE); optkey(key_dc,KEY_DC); optkey(key_ic,KEY_IC); optkey(key_home,KEY_HOME); /* home */ optkey(key_shome,KEY_SHOME); /* set home */ optkey(key_right,KEY_RIGHT); optkey(key_sright,KEY_SRIGHT); optkey(key_left,KEY_LEFT); optkey(key_sleft,KEY_SLEFT); optkey(key_up,KEY_UP); optkey(key_sr,KEY_SR); optkey(key_down,KEY_DOWN); optkey(key_sf,KEY_SF); optkey(key_il,KEY_IL); optkey(key_dl,KEY_DL); #ifdef key_print optkey(key_print,KEY_PRINT); #else optkey("\020",KEY_PRINT); /* control-P for default print screen */ #endif #ifdef key_exit /* misc stuff not in V.2 */ optkey(key_select,KEY_SELECT); optkey(key_restart,KEY_RESET); optkey(key_command,KEY_COMMAND); optkey(key_cancel,KEY_CANCEL); optkey(key_exit,KEY_EXIT); optkey(key_end,KEY_END); optkey(key_send,KEY_SEND); optkey(key_btab,KEY_BTAB); optkey(key_next,KEY_NEXT); optkey(key_previous,KEY_PREVIOUS); optkey(key_npage,KEY_NPAGE); optkey(key_ppage,KEY_PPAGE); optkey(key_options,KEY_OPTIONS); optkey(key_help,KEY_HELP); optkey(key_find,KEY_FIND); optkey(key_sfind,KEY_SFIND); optkey(key_sic,KEY_SIC); optkey(key_close,KEY_CLOSE); #endif optkey(key_ll,KEY_LL); /* newline */ optkey(key_sbeg,KEY_SBEG); /* set left margin */ #ifdef key_refresh optkey(key_refresh,KEY_REFRESH); #else optkey("\022",REFRESH); /* ^R for Televideo */ #endif }