poole@forty2.UUCP (Simon Poole) (01/30/89)
Here are the patches to stkbd.c I mentioned, besides fixing the
<Shift><ClrHome> bug, they add some more function keys (see the
README).
NOTE: these patches are in no way official.......
-------------------------------------------------------------------
echo x - README
gres '^X' '' > README << '/'
XChanges to stkbd.c and stvdu.c
X==============================
XS.Poole 30.1.89
X
Xstkbd.c: to work around the slightly chaotic assignment of keycodes
X and to make the detection of function keys more robust,
X I've added a fourth table to stkbd.c. Keycodes that
X have 0 as an entry in this table belong to normal keys,
X other values are used as an index in to a table that
X contains part of the character sequence to produce, see
X the source code for more details.
X If COMPAT is defined, the only difference to the ST-
X Minix 1.1 is that <Shift><ClrHome> works and that <Insert>
X generates ESC [I , if COMPAT is not defined, the following
X sequences are generated:
X
X Function keys
X =============
X
X Key + Shift VT200 key
X
X F1 ESC O1~ ESC O21~ Find F10
X F2 ESC O2~ ESC O23~ Insert F11
X F3 ESC O3~ ESC O24~ Remove F12
X F4 ESC O4~ ESC O25~ Select F13
X F5 ESC O5~ ESC O26~ Prev. F14
X F6 ESC O6~ ESC O31~ Next F17
X F7 ESC O17~ ESC O32~ F6 F18
X F8 ESC O18~ ESC O33~ F7 F19
X F9 ESC O19~ ESC O34~ F8 F20
X F10 ESC O20~ ESC O35~ F9
X Undo ESC O36~ ESC O37~
X Help ESC O28~ ESC O29~ Help Do
X
X Arrow keys
X ==========
X
X Normal Application mode
X
X Left ESC [D ESC OD
X Down ESC [B ESC OB
X Right ESC [C ESC OC
X Up ESC [A ESC OA
X ClrHome ESC [H ESC OH
X + Shift ESC [J ESC OJ
X Insert ESC [I ESC OI
X
X Keypad
X ======
X
X Key (numeric mode) application mode
X
X ( ESC OP
X ) ESC OQ
X / ESC OR
X * ESC OS
X 7 ESC Ow
X 8 ESC Ox
X 9 ESC Oy
X - ESC Om
X 4 ESC Ot
X 5 ESC Ou
X 6 ESC Ov
X + ESC Ol
X 1 ESC Oq
X 2 ESC Ow
X 3 ESC Os
X 0 ESC Op
X . ESC On
X Enter ESC OM
X
X
XNOTE:
X - the keypad is not 100% compatible with a VTXXX, since
X the top row of keys ('(',')','/','*') should always
X generate the escape sequences.
X
X - the power-on defaults are:
X arrow keys: normal mode
X keypad: application mode
X (this is a bit in conflict with the patches
X to stvdu.c, but it enables you to ignore the
X changes to stvdu.c and still have the keypad)
X
X - without the patches to stvdu.c the modes of the arrow keys
X and the kepad cannot be changed.
X
X
X
Xstvdu.c: additional escape sequences:
X
X ESC [?1l set arrow key application mode
X ESC [?1l reset "
X
X ESC > keypad numeric mode
X ESC = keypad application mode
X
X
XNOTE:
X - after a reset (ESC c) the modes are set to:
X arrow keys: normal mode
X keypad: numeric mode
X
X****************************************************************************
/
echo x - stkbd.cdiff
gres '^X' '' > stkbd.cdiff << '/'
X*** ORIG/stkbd.c Thu Jan 21 20:15:59 1989
X--- stkbd.c Thu Jan 30 01:17:13 1989
X***************
X*** 1,6 ****
X--- 1,15 ----
X #ifdef ATARI_ST
X /*
X * The ACIA driver for the Atari ST, both MDI and KBD
X+ *
X+ * Modified the original 1.1 code to support more
X+ * function keys and provide a robust way of determing
X+ * which keys are function keys.
X+ * Note: defining COMPAT will result in key definitions
X+ * that are the same as for Minix 1.1 with the
X+ * exception that <Shift><ClrHome> works and
X+ * <Insert> generates ESC [I
X+ * S.Poole 21.1.89
X */
X #include "../h/const.h"
X #include "../h/type.h"
X***************
X*** 98,103 ****
X--- 107,261 ----
X /*78*/ 0, 0, 0, 0, 0, 0, 0, 0
X };
X
X+ /*
X+ * Flag for keypad mode
X+ * this can be set by code in stvdu.c
X+ */
X+ #ifdef COMPAT
X+ PUBLIC int keypad = FALSE;
X+ #else
X+ PUBLIC int keypad = TRUE;
X+ #endif
X+ /*
X+ * Flag for arrow key application mode
X+ * this can be set by code in stvdu.c
X+ */
X+ PUBLIC int app_mode = FALSE;
X+
X+ /*
X+ * Map function keys to an index into the
X+ * table of function key values
X+ */
X+ PRIVATE unsigned char f_keys[] = {
X+ /*00*/ 0, 0, 0, 0, 0, 0, 0, 0,
X+ /*08*/ 0, 0, 0, 0, 0, 0, 0, 0,
X+ /*10*/ 0, 0, 0, 0, 0, 0, 0, 0,
X+ /*18*/ 0, 0, 0, 0, 0, 0, 0, 0,
X+ /*20*/ 0, 0, 0, 0, 0, 0, 0, 0,
X+ /*28*/ 0, 0, 0, 0, 0, 0, 0, 0,
X+ /*30*/ 0, 0, 0, 0, 0, 0, 0, 0,
X+ /*38*/ 0, 0, 0, 1, 2, 3, 4, 5,
X+ /*40*/ 6, 7, 8, 9, 10, 0, 0, 17,
X+ /*48*/ 16, 0, 26, 13, 0, 15, 30, 0,
X+ /*50*/ 14, 0, 18, 0, 1, 2, 3, 4,
X+ /*58*/ 5, 6, 7, 8, 9, 10, 0, 0,
X+ /*60*/ 0, 11, 12, 19, 20, 21, 22, 23,
X+ /*68*/ 24, 25, 27, 28, 29, 31, 32, 33,
X+ /*70*/ 34, 35, 36, 0, 0, 0, 0, 0,
X+ /*78*/ 0, 0, 0, 0, 0, 0, 0, 0
X+ };
X+
X+ /*
X+ * Numbering of the function keys, this scheme was chosen
X+ * so that it easy to determine which function to call to actually
X+ * generate the string.
X+ *
X+ * Note: the <Help> and <Undo> keys are considered to be function
X+ * keys 11 and 12.
X+ *
X+ * F-keys: -----------------------------------------
X+ * | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10|
X+ * -----------------------------------------
X+ *
X+ * Arrow-Keys: -------------
X+ * | 12 | 11 |
X+ * -------------
X+ * | 18| 16| 17|
X+ * -------------
X+ * | 13| 14| 15|
X+ * -------------
X+ *
X+ * Keypad: -----------------
X+ * | 19| 20| 21| 22|
X+ * -----------------
X+ * | 23| 24| 25| 26|
X+ * -----------------
X+ * | 27| 28| 29| 30|
X+ * -----------------
X+ * | 31| 32| 33| |
X+ * ------------- 36|
X+ * | 34 | 35| |
X+ * -----------------
X+ */
X+
X+ /*
X+ * There is no problem with expanding this struct to
X+ * have a field for <Control> and <Alternate> (and combinations
X+ * of them), but who needs > 152 function keys?
X+ */
X+ struct fkey {
X+ char norm, shift;
X+ };
X+
X+ PRIVATE struct fkey ftbl[] = {
X+ #ifdef COMPAT
X+ /* 1 = F1 */ {'P', 0},
X+ /* 2 = F2 */ {'Q', 0},
X+ /* 3 = F3 */ {'R', 0},
X+ /* 4 = F4 */ {'S', 0},
X+ /* 5 = F5 */ {'T', 0},
X+ /* 6 = F6 */ {'U', 0},
X+ /* 7 = F7 */ {'V', 0},
X+ /* 8 = F8 */ {'W', 0},
X+ /* 9 = F9 */ {'X', 0},
X+ /* 10 = F10 */ {'Y', 0},
X+ /* 11 = Undo */ { 0, 0},
X+ /* 12 = Help */ { 0, 0},
X+ #else
X+ /*
X+ * So that we can produce VT200 style function-key codes,
X+ * the values here are integer values that are converted
X+ * to a string in kbdpf().
X+ *
X+ * The assignment of numbers to keys is rather chaotic,
X+ * but at least all the VT200 keys are there.
X+ */
X+ /* ST key */ /* VT200 key */
X+ /* 1 = F1 */ { 1, 21}, /* Find F10 */
X+ /* 2 = F2 */ { 2, 23}, /* Insert F11 */
X+ /* 3 = F3 */ { 3, 24}, /* Remove F12 */
X+ /* 4 = F4 */ { 4, 25}, /* Select F13 */
X+ /* 5 = F5 */ { 5, 26}, /* Prev. F14 */
X+ /* 6 = F6 */ { 6, 31}, /* Next F17 */
X+ /* 7 = F7 */ { 17, 32}, /* F6 F18 */
X+ /* 8 = F8 */ { 18, 33}, /* F7 F19 */
X+ /* 9 = F9 */ { 19, 34}, /* F8 F20 */
X+ /* 10 = F10 */ { 20, 35}, /* F9 */
X+ /* 11 = Undo */ { 36, 37}, /* */
X+ /* 12 = Help */ { 28, 29}, /* Help Do */
X+ #endif
X+ /*
X+ * The following codes are more conventional
X+ */
X+ /* 13 = Left */ {'D', 0},
X+ /* 14 = Down */ {'B', 0},
X+ /* 15 = Right */ {'C', 0},
X+ /* 16 = Up */ {'A', 0},
X+ /* 17 = ClrHome */ {'H', 'J'},
X+ /* 18 = Insert */ {'I', 0},
X+ /*
X+ * Keypad starts here
X+ */
X+ /* 19 = ( */ {'P', 0},
X+ /* 20 = ) */ {'Q', 0},
X+ /* 21 = / */ {'R', 0},
X+ /* 22 = * */ {'S', 0},
X+ /* 23 = 7 */ {'w', 0},
X+ /* 24 = 8 */ {'x', 0},
X+ /* 25 = 9 */ {'y', 0},
X+ /* 26 = - */ {'m', 0},
X+ /* 27 = 4 */ {'t', 0},
X+ /* 28 = 5 */ {'u', 0},
X+ /* 29 = 6 */ {'v', 0},
X+ /* 30 = + */ {'l', 0},
X+ /* 31 = 1 */ {'q', 0},
X+ /* 32 = 2 */ {'w', 0},
X+ /* 33 = 3 */ {'s', 0},
X+ /* 34 = 0 */ {'p', 0},
X+ /* 35 = . */ {'n', 0},
X+ /* 36 = Enter */ {'M', 0}
X+ };
X+
X PRIVATE int shift1, shift2, capslock, control, alt;
X /* keep track of key statii */
X PRIVATE char kbdbuf[2*MAX_OVERRUN+2];
X***************
X*** 161,175 ****
X *===========================================================================*/
X PRIVATE kbdkey(code)
X {
X! register c;
X!
X if (shift1 || shift2)
X c = keyshft[code];
X else if (capslock)
X c = keycaps[code];
X else
X c = keynorm[code];
X! if (c) {
X if (alt)
X c = national(code, c | 0x80);
X if (control) {
X--- 319,337 ----
X *===========================================================================*/
X PRIVATE kbdkey(code)
X {
X! register int c,f,fc;
X!
X! f = f_keys[code];
X if (shift1 || shift2)
X c = keyshft[code];
X else if (capslock)
X c = keycaps[code];
X else
X c = keynorm[code];
X! /*
X! * check if the key is not a function key
X! */
X! if (!f) {
X if (alt)
X c = national(code, c | 0x80);
X if (control) {
X***************
X*** 195,236 ****
X kbdput(code - 0x3B + 1, OPERATOR);
X return;
X }
X! switch (code) {
X! case 0x3B: /* PF1 */
X! kbdpf('P'); return;
X! case 0x3C: /* PF2 */
X! kbdpf('Q'); return;
X! case 0x3D: /* PF3 */
X! kbdpf('R'); return;
X! case 0x3E: /* PF4 */
X! kbdpf('S'); return;
X! case 0x3F: /* PF5 */
X! kbdpf('T'); return;
X! case 0x40: /* PF6 */
X! kbdpf('U'); return;
X! case 0x41: /* PF7 */
X! kbdpf('V'); return;
X! case 0x42: /* PF8 */
X! kbdpf('W'); return;
X! case 0x43: /* PF9 */
X! kbdpf('X'); return;
X! case 0x44: /* PF10 */
X! kbdpf('Y'); return;
X! case 0x47: /* Home/Clr */
X! kbdansi('H');
X! if (shift1 || shift2)
X! kbdansi('J');
X! return;
X! case 0x48: /* Up */
X! kbdansi('A'); return;
X! case 0x4B: /* Left */
X! kbdansi('D'); return;
X! case 0x4D: /* Right */
X! kbdansi('C'); return;
X! case 0x50: /* Down */
X! kbdansi('B'); return;
X! default:
X! return;
X }
X }
X
X--- 357,393 ----
X kbdput(code - 0x3B + 1, OPERATOR);
X return;
X }
X! f--; /* correct for index into ftbl */
X! if (shift1 || shift2)
X! fc = ftbl[f].shift;
X! else
X! fc = ftbl[f].norm;
X! /*
X! * f naturally has to be >= 0 for this piece
X! * of code to work
X! */
X! if (fc) {
X! if (f < 12)
X! #ifdef COMPAT
X! kbdkeypad(fc);
X! #else
X! kbdpf(fc);
X! #endif
X! else if (f < 18) {
X! #ifndef COMPAT
X! if (app_mode)
X! kbdkeypad(fc);
X! else
X! #endif
X! kbdarrow(fc);
X! }
X! else if (keypad)
X! /*
X! * keypad should be set by stvdu
X! */
X! kbdkeypad(fc);
X! else
X! kbdput(c,CONSOLE);
X }
X }
X
X***************
X*** 314,322 ****
X }
X
X /*
X! * Input escape sequence for function keys
X! */
X! PRIVATE kbdpf(c)
X {
X kbdput('\033', CONSOLE);
X kbdput('O', CONSOLE);
X--- 471,479 ----
X }
X
X /*
X! * Input escape sequence for keypad keys
X! */
X! PRIVATE kbdkeypad(c)
X {
X kbdput('\033', CONSOLE);
X kbdput('O', CONSOLE);
X***************
X*** 324,338 ****
X }
X
X /*
X! * Input ANSI escape sequence
X! */
X! PRIVATE kbdansi(c)
X {
X kbdput('\033', CONSOLE);
X kbdput('[', CONSOLE);
X kbdput(c, CONSOLE);
X }
X
X /*===========================================================================*
X * kb_timer *
X *===========================================================================*/
X--- 481,514 ----
X }
X
X /*
X! * Input escape sequence for arrow keys
X! */
X! PRIVATE kbdarrow(c)
X {
X kbdput('\033', CONSOLE);
X kbdput('[', CONSOLE);
X kbdput(c, CONSOLE);
X }
X
X+ #ifndef COMPAT
X+ /*
X+ * Input escape sequence for function keys
X+ */
X+ PRIVATE kbdpf(c)
X+ register char c;
X+ {
X+ register int t;
X+
X+ kbdput('\033', CONSOLE);
X+ kbdput('[', CONSOLE);
X+ /* this stuff is not robust */
X+ if ((t = c / 10) > 0)
X+ kbdput(t + '0', CONSOLE);
X+ kbdput((c % 10) + '0', CONSOLE);
X+ kbdput('~', CONSOLE);
X+ }
X+ #endif
X+
X /*===========================================================================*
X * kb_timer *
X *===========================================================================*/
/
echo x - stvdu.cdiff
gres '^X' '' > stvdu.cdiff << '/'
X*** ORIG/stvdu.c Thu Jan 2 13:41:28 1989
X--- stvdu.c Thu Jan 30 03:13:12 1989
X***************
X*** 45,50 ****
X--- 45,52 ----
X
X EXTERN char font16[];
X EXTERN char font8[];
X+ EXTERN int keypad;
X+ EXTERN int app_mode;
X
X /*===========================================================================*
X * start *
X***************
X*** 324,331 ****
X return;
X case 'l': /* RM: reset mode */
X case 'h': /* SM: set mode */
X! if (v->next[0] == '?' && v->next[1] == '5' && v->mono)
X! VIDEO->vd_rgb[0] = c == 'l' ? RGB_BLACK : RGB_WHITE;
X return;
X case '~': /* Minix-ST specific escape sequence */
X /*
X--- 326,337 ----
X return;
X case 'l': /* RM: reset mode */
X case 'h': /* SM: set mode */
X! if (v->next[0] == '?') { /* DEC private modes */
X! if (v->next[1] == '5' && v->mono) /* DECSCNM */
X! VIDEO->vd_rgb[0] = c == 'l' ? RGB_BLACK : RGB_WHITE;
X! else if (v->next[1] == '1') /* DECCKM */
X! app_mode = c == 'l' ? TRUE : FALSE;
X! }
X return;
X case '~': /* Minix-ST specific escape sequence */
X /*
X***************
X*** 400,405 ****
X--- 406,417 ----
X v->savcrow = v->crow;
X v->savattr = v->attr;
X return;
X+ case '=': /* DECKPAM: keypad application mode */
X+ keypad = TRUE;
X+ return;
X+ case '>': /* DECKPNM: keypad numeric mode */
X+ keypad = FALSE;
X+ return;
X case 'E': /* NEL: next line */
X vductrl(015);
X /* fall through */
X***************
X*** 417,422 ****
X--- 429,436 ----
X case 'c': /* RIS: reset to initial state */
X vduinit(&tty_struct[CONSOLE]);
X vducursor(0);
X+ keypad = FALSE;
X+ app_mode = FALSE;
X return;
X default:
X return;
/
--
----------------------------------------------------------------------------
UUCP: ...mcvax!cernvax!forty2!poole Simon Poole
BITNET: K538915@CZHRZU1A
----------------------------------------------------------------------------