home *** CD-ROM | disk | FTP | other *** search
- #include "jam.h"
- #include "def.h"
-
- #ifndef WINDOWED
- # ifndef CURSES
- # include <dos.h>
- # endif
-
- # ifdef MSC
- # include <bios.h>
- # endif /* MSC */
- #endif
-
- #define KMETA METABIT
-
- #ifdef CURSES
- static int rn_(mapCursesKey, (int foo));
- #endif
-
- static CONSTANT char *keystrings[] = {
- "Home", "Down-Arrow", "Up-Arrow", "Left-Arrow",
- "Right-Arrow", "Page-Up", "Page-Down", "End",
- "Delete", "Insert", "Control-Left", "Control-Right",
- "Control-PgUp", "Control-PgDn", "Control-Home", "Control-End",
- "F1", "F2", "F3", "F4",
- "F5", "F6", "F7", "F8",
- "F9", "F10", "FS1", "FS2",
- "FS3", "FS4", "FS5", "FS6",
- "FS7", "FS8", "FS9", "FS10",
- "FC1", "FC2", "FC3", "FC4",
- "FC5", "FC6", "FC7", "FC8",
- "FC9", "FC10",
-
- #if defined(WINDOWED) || defined(CURSES)
- "F11", "FS11", "FC11", "F12",
- "FS12", "FC12",
- "Num-Lock", "KP-/", "KP-*", "KP--",
- "KP-7", "KP-8", "KP-9", "KP-+",
- "KP-4", "KP-5", "KP-6",
- "KP-1", "KP-2", "KP-3", "KP-Enter",
- "KP-0", "KP-.",
-
- /* Of course someone wanted these added AFTER I got the
- * keypad, etc added in so the order is all messed up. Not worth my
- * time to fix all the .h files and this table...sorry (JAM)
- */
- "FM1", "FM2", "FM3", "FM4",
- "FM5", "FM6", "FM7", "FM8",
- "FM9", "FM10", "FM11", "FM12",
- "FCS1", "FCS2", "FCS3", "FCS4",
- "FCS5", "FCS6", "FCS7", "FCS8",
- "FCS9", "FCS10", "FCS11", "FCS12",
-
- "", /* KEXTEND, invisible and untypeable! */
-
- "KFind", "KSelect", "KSFind", "KSSelect",
- #endif
- };
-
- /* I like my tables static thus this access function.
- * Caller assumed to be well behaved, no range checking (JAM)
- */
- CONSTANT char *getkeystrings(i)
- int i;
- {
- return(keystrings[i]);
- }
-
-
- /* Convert IBM bios extended scan codes to appropriate function key values
- */
- #ifndef WINDOWED
- static CONSTANT KCHAR extended[] = {
- -1, -1, -1, 0, /* 0-3 */
- -1, -1, -1, -1, /* 4-7 */
- -1, -1, -1, -1, /* 8-11 */
- -1, -1, -1, -1, /* 12-15 */
- KMETA|'Q', KMETA|'W', KMETA|'E', KMETA|'R',/* 16-19 */
- KMETA|'T', KMETA|'Y', KMETA|'U', KMETA|'I',/* 20-23 */
- KMETA|'O', KMETA|'P', -1, -1, /* 24-27 */
- -1, -1, KMETA|'A', KMETA|'S',/* 28-31 */
- KMETA|'D', KMETA|'F', KMETA|'G', KMETA|'H',/* 32-35 */
- KMETA|'J', KMETA|'K', KMETA|'L', -1, /* 36-39 */
- -1, -1, -1, -1, /* 40-43 */
- KMETA|'Z', KMETA|'X', KMETA|'C', KMETA|'V',/* 44-47 */
- KMETA|'B', KMETA|'N', KMETA|'M', -1, /* 48-51 */
- -1, -1, /* oops - miscounted */ /* 52-53 */
- -1, -1, -1, -1, /* 54-57 */
- -1, KF1, KF2, KF3, /* 58-61 */
- KF4, KF5, KF6, KF7, /* 62-65 */
- KF8, KF9, KF10, -1, /* 66-69 */
- -1, KHOME, KUP, KPGUP, /* 70-73 */
- -1, KLEFT, -1, KRIGHT, /* 74-77 */
- -1, KEND, KDOWN, KPGDN, /* 78-81 */
- KINSERT, KDELETE, KSF1, KSF2, /* 82-85 */
- KSF3, KSF4, KSF5, KSF6, /* 86-89 */
- KSF7, KSF8, KSF9, KSF10, /* 90-93 */
- KCF1, KCF2, KCF3, KCF4, /* 94-97 */
- KCF5, KCF6, KCF7, KCF8, /* 98-101 */
- KCF9, KCF10, KMETA|KF1, KMETA|KF2,/* 102-105 */
- KMETA|KF3, KMETA|KF4, KMETA|KF5, KMETA|KF6,/* 106-109 */
- KMETA|KF7, KMETA|KF8, KMETA|KF9, KMETA|KF10,/* 110-113 */
- -1, KCLEFT, KCRIGHT, KCEND, /* 114-117 */
- KCPGDN, KCHOME, KMETA|'1', KMETA|'2',/* 118-121 */
- KMETA|'3', KMETA|'4', KMETA|'5', KMETA|'6',/* 122-125 */
- KMETA|'7', KMETA|'8', KMETA|'9', KMETA|'0',/* 126-129 */
- KMETA|'-', KMETA|'=', KCPGUP, /* 130-132 */
- };
- #endif
-
- #define NEXTENDED (sizeof(extended)-sizeof(KCHAR))
-
- static KCHAR savedkey = -1;
-
- getkbd()
- {
- return (ttgetc());
- }
-
- /*
- * Get keyboard character, and interpret
- * any special keys on the keyboard.
- */
- ttgetc()
- {
- KCHAR temp;
-
- while (savedkey == -1)
- getakey();
-
- temp = savedkey;
- savedkey = -1;
- return temp;
- }
-
- getakey()
- {
- #ifdef WINDOWED /* JAM */
- WindowGetEvent((void *)&savedkey);
- #else /* WINDOWED */
-
- # ifdef CURSES
- int foo;
- long currtime;
- KCHAR kchar;
- static long lasttime = 0;
- struct tm *timestruct1, *timestruct2;
-
- /* check for input in internal queue before
- * checking hardware queue
- */
- queued:
- if (DOSReturnKCHAR(&kchar))
- {
- savedkey = kchar;
- return (TRUE);
- }
-
- if (lasttime == 0)
- time(&lasttime);
-
- /* See if input, else do timeouts; this is kind of expensive
- */
- while (1)
- {
- time(&currtime);
- timestruct1 = localtime(&lasttime);
- timestruct2 = localtime(&currtime);
- if (timestruct2->tm_sec - timestruct1->tm_sec >= TIME_INC)
- {
- DoTimer();
- lasttime = 0;
- }
- foo = wgetch(stdscr);
- if (foo != ERR)
- break;
-
- foo = mapCursesKey(foo);
- if (foo == KEY_MIN)
- goto queued; /* ugh! goto */
- }
- savedkey = foo;
- # else
-
- union REGS rg;
- KCHAR kchar;
-
- /* check for input in internal queue before
- * checking hardware queue
- */
- if (DOSReturnKCHAR(&kchar))
- {
- savedkey = kchar;
- return (TRUE);
- }
-
- rg.h.ah = 0; /* read keyboard */
- /* rg.h.ah = 0x10; read enhanced keyboard */
-
- int86(0x16, &rg, &rg);
-
- if (rg.h.al)
- {
- if (rg.h.al == '\b' && rg.h.ah == 0x0E)
- rg.h.al = 0x7F; /* transform backspace key into delete */
- /* control H is still backspace */
- savedkey = rg.h.al; /* normal key value */
- }
- else
- {
- if (rg.h.ah >= NEXTENDED)
- savedkey = -1;
- else
- savedkey = extended[rg.h.ah];
- }
- # endif /* CURSES */
- #endif /* WINDOWED */
- return TRUE;
- }
-
- #ifndef WINDOWED /* not needed */
- pollkbd()
- {
- # ifdef MSC
- return _bios_keybrd(_KEYBRD_READY);
- # else
- # ifdef CURSES
- return(FALSE);
- # else
- return bioskey(1);
- # endif /* CURSES */
- # endif /* MSC */
- }
- #endif
-
- /* See if events pending; used only by display.c (update)
- * to forstall screen update in deference to handling input.
- *
- * For Windows, lookahead only for events which cause another redraw
- * else not updating makes cursor motion jumpy.
- */
- mytypeahead()
- {
- #ifdef WINDOWED
- return (WindowLookaheadEvent());
- #else
- if (savedkey != -1)
- return 1;
-
- if (pollkbd())
- getakey();
- return (savedkey != -1);
- #endif
- }
-
- ttykeymapinit()
- {
- /* mg 2a no longer lets me easily bind things at run time. */
- /* instead, I make up a keymap, and link it in at compile time */
- return TRUE;
- }
-
- PF ibm_keys[] = {
- gotobol, /* Home */
- forwline, /* Down */
- backline, /* Up */
- backchar, /* Left */
- forwchar, /* Right */
- backpage, /* Page Up */
- forwpage, /* Page Dn */
- gotoeol, /* End */
- forwdel, /* Delete */
- openline, /* Insert */
- backword, /* Control Left */
- forwword, /* Control Right */
- gotobob, /* Control PgUp */
- gotoeob, /* Control PgDn */
- gotobop, /* Control HOME */
- gotoeop, /* Control END */
-
- /* function keys - initially unassigned
- */
- rescan, rescan, rescan, rescan, rescan, rescan, rescan, rescan,
- rescan, rescan, rescan, rescan, rescan, rescan, rescan, rescan,
- rescan, rescan, rescan, rescan, rescan, rescan, rescan, rescan,
- rescan, rescan, rescan, rescan, rescan, rescan,
-
- #ifdef WINDOWED
- rescan, rescan, rescan, /* F11 */
- rescan, rescan, rescan, /* F12 */
- rescan, rescan, rescan,rescan, /* NUMLOCK / * - */
- rescan, rescan, rescan,rescan, /* 7 8 9 + */
- rescan, rescan, rescan, /* 4 5 6 */
- rescan, rescan, rescan,rescan, /* 1 2 3 ENTER */
- rescan, rescan, /* 0, DEL */
- rescan, rescan, rescan, rescan, /* META F1, F2, F3, F4 */
- rescan, rescan, rescan, rescan, /* META F5, F6, F7, F8 */
- rescan, rescan, rescan, rescan, /* META F9, F10, F11, F12 */
- rescan, rescan, rescan, rescan, /* Cntrl-Shift F1, F2, F3, F4 */
- rescan, rescan, rescan, rescan, /* Cntrl-Shift F5, F6, F7, F8 */
- rescan, rescan, rescan, rescan, /* Cntrl-Shift F9, F10, F11, F12 */
-
- silent_extend, /* KEXTEND, invisible and untypeable */
-
- rescan, rescan, rescan,rescan, /* KFind, KSelect, & shifted
- * (not normally on Windows PC's)
- */
-
-
- #endif
- };
-
- #ifdef CURSES
- static int mapCursesKey(c)
- int c;
- {
- switch(c)
- {
- case KEY_DOWN:
- c = KDOWN;
- break;
- case KEY_UP:
- c = KUP;
- break;
- case KEY_LEFT:
- c = KLEFT;
- break;
- case KEY_SLEFT:
- c = KCLEFT;
- break;
- case KEY_RIGHT:
- c = KRIGHT;
- break;
- case KEY_SRIGHT:
- c = KCRIGHT;
- break;
- case KEY_HOME:
- c = KHOME;
- break;
- case KEY_SHOME:
- c = KCHOME;
- break;
- case KEY_BACKSPACE:
- c = KDELETE;
- break;
-
- case KEY_F(1):
- c = KF1;
- break;
- case KEY_F(2):
- c = KF2;
- break;
- case KEY_F(3):
- c = KF3;
- break;
- case KEY_F(4):
- c = KF4;
- break;
- case KEY_F(5):
- c = KF5;
- break;
- case KEY_F(6):
- c = KF6;
- break;
- case KEY_F(7):
- c = KF7;
- break;
- case KEY_F(8):
- c = KF8;
- break;
- case KEY_F(9):
- c = KF9;
- break;
- case KEY_F(10):
- c = KF10;
- break;
-
- case KEY_NPAGE:
- c = KPGDN;
- break;
-
- case KEY_PPAGE:
- c = KPGUP;
- break;
-
- case KEY_END:
- c = KEND;
- break;
- default:
- if (c >= KEY_MIN)
- c = KEY_MIN;
- break;
- }
-
- return(c);
- }
- #endif
-