home *** CD-ROM | disk | FTP | other *** search
- From: jimp@cognos.UUCP (Jim Patterson)
- Newsgroups: comp.sources.misc
- Subject: JOVE support for VT200-type function keys
- Message-ID: <2788@ncoast.UUCP>
- Date: 4 Jul 87 20:28:03 GMT
- Sender: allbery@ncoast.UUCP
- Organization: Cognos Incorporated, Ottawa, Canada
- Lines: 448
- Approved: allbery@ncoast.UUCP
- X-Archive: comp.sources.misc/8707/6
-
- I've put together a series of differences we've applied to JOVE
- since we got it from USENET. Basically these changes fall into
- two categories:
-
- Support for ANSI function keys (VT200-style). The existing support
- wasn't able to handle function keys with numeric parameters. This is
- now possible, though not quite as general as the rest of the
- key-mapping. Incidently, Dasher terminals that have an ANSI mode and
- SUN workstations can make use of the same logic.
-
- To enable the ANSI function key support, you need to bind the ANSI
- function code initiator to the function ansi-codes. This is a special
- prefix which existed in the original version of jove that we got
- (4.6.1.4), but which we have extended somewhat. The following bindings
- work for most ANSI-style terminals
-
- bind-to-key ansi-codes ^[[
- bind-to-key ansi-codes ^[O
-
- If you are running a terminal which transmits 8-bit controls, then set the
- environment variable METAKEY and define the following bindings instead.
-
- bind-to-key ansi-codes ^[^[
- bind-to-key ansi-codes ^[^O
-
- We have included a few bug-fixes. Some of these are for support of
- different terminals; for example, Dashers don't have a conventional
- line-feed (it acts as a newline), so we've added a DN termcap function
- that can be set to the proper value. A similar problem occured
- because the backspace sequence wasn't being used properly.
-
- You may or may not want the change put into jove.c to put out
- visual-end a little later. I found this useful in dealing with
- a terminal which supports multiple windows.
-
- Here are a few things that we haven't done, but should.
-
- Put function keys into their own section of the keymaps. At present
- they share the keymap with other keys, and so have been restricted to
- the miscmap. This prevents the use of any prefix character with
- a function key (but a function key can be a prefix character). This
- isn't a really big problem because there are generally a liberal number
- of function keys, but it would be nice to be able to define ESC <left>
- and so on.
-
- Provide some sort of terminal specific translation of function key
- names, so that describe-key prints function keys as FIND, F12, etc.
- instead of ESC [ 1 ~ and ESC [ 2 4 ~.
-
- Update the documentation to describe Ansi-codes and how to bind
- ansi function keys.
-
- The following file gives default bindings for a vt200-series terminal.
- ============================================= New file: vt200.joverc
- bind-to-key ansi-codes ^[[
- bind-to-key ansi-codes ^[O
- bind-to-key ansi-codes ^[^[
- bind-to-key ansi-codes ^[^O
- bind-to-key search-forward ^[[1~
- bind-to-key yank ^[[2~
- bind-to-key kill-region ^[[3~
- bind-to-key set-mark ^[[4~
- bind-to-key previous-page ^[[5~
- bind-to-key next-page ^[[6~
- bind-to-key describe-key [28~
- bind-to-key execute-named-command [29~
- ============================================ End of vt200.joverc
- The following are all context diffs. They work with patch on our system
- (SUN running BSD 4.2 Unix).
-
- *** extend.c Mon Jun 22 14:44:20 1987
- --- extend.c Mon Jun 22 14:44:21 1987
- ***************
- *** 20,25 ****
- --- 20,27 ----
- extern int getch(),
- getchar();
-
- + #define DASHER_MAP(x) (((x) % 100) + ((x) / 100) * 32)
- +
- /* Auto execute code */
-
- #define NEXECS 20
- ***************
- *** 99,107 ****
- --- 101,135 ----
- BindSomething(findmac);
- }
-
- + /*
- + * AnsiKey : return 'key' value for an ANSI-style function
- + * sequence. This is the value of the numeric operand for
- + * extended-type functions, or the next character for others.
- + */
- +
- + int AnsiKey() {
- + int c;
- + int num1 = 0;
- +
- + c = addgetc();
- + while (isdigit(c)) {
- + num1 = num1*10 + (c - '0');
- + c = addgetc();
- + }
- + while (c == ';' || isdigit(c))
- + c = addgetc();
- + /* Map Dasher functions into 128-byte space */
- + if (c == 'z')
- + num1 = DASHER_MAP(num1);
- + if (c == '~' || c == 'z')
- + return num1;
- + else return c;
- + }
- +
- extern int EscPrefix(),
- CtlxPrefix(),
- MiscPrefix();
- + extern int AnsiCodes();
-
- data_obj **
- IsPrefix(cp)
- ***************
- *** 121,126 ****
- --- 149,168 ----
- return 0;
- }
-
- + data_obj **
- + IsAnsiCode(cp)
- + data_obj *cp;
- + {
- + int (*proc)();
- +
- + if (cp == 0 || (cp->Type & TYPEMASK) != FUNCTION)
- + return 0;
- + proc = ((struct cmd *) cp)->c_proc;
- + if (proc == AnsiCodes)
- + return miscmap;
- + return 0;
- + }
- +
- unbind_aux(c)
- {
- if (c == CR || c == LF)
- ***************
- *** 132,137 ****
- --- 174,180 ----
- UnbindC()
- {
- char *keys;
- + int lastKey;
- data_obj **map = mainmap;
-
- keys = do_ask("\r\n\01\02\03\04\05\06\010\011\013\014\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037", unbind_aux, (char *) 0, ProcFmt);
- ***************
- *** 142,152 ****
- break;
- if ((map = IsPrefix(map[*keys])) == 0)
- break;
- ! keys++;
- }
- if (keys[1] != 0)
- complain("That's not a legitimate key sequence.");
- ! map[keys[0]] = 0;
- }
-
- addgetc()
- --- 185,211 ----
- break;
- if ((map = IsPrefix(map[*keys])) == 0)
- break;
- ! if (IsAnsiCode(map[*keys])) {
- ! map = miscmap;
- ! lastKey = 0;
- ! ++keys;
- ! while (*keys != '\0' && isdigit(*keys)) {
- ! lastKey = lastKey * 10 + (*keys - '0');
- ! ++keys;
- }
- + if (*keys != 'z' && *keys != '~')
- + lastKey = *keys;
- + /* Map Dasher functions into 128-byte space */
- + if (*keys == 'z')
- + lastKey = DASHER_MAP(lastKey);
- + break;
- + }
- +
- + lastKey = *++keys;
- + }
- if (keys[1] != 0)
- complain("That's not a legitimate key sequence.");
- ! map[lastKey] = 0;
- }
-
- addgetc()
- ***************
- *** 193,198 ****
- --- 252,259 ----
- } else {
- if (nextmap = IsPrefix(map[c]))
- BindWMap(nextmap, c, cmd);
- + else if (IsAnsiCode(map[c]))
- + miscmap[AnsiKey()] = cmd;
- else
- map[c] = cmd;
- }
- ***************
- *** 215,220 ****
- --- 276,282 ----
-
- DescWMap(map, key)
- data_obj **map;
- + int key;
- {
- data_obj *cp = map[key],
- **prefp;
- ***************
- *** 223,228 ****
- --- 285,292 ----
- add_mess("is unbound.");
- else if (prefp = IsPrefix(cp))
- DescWMap(prefp, addgetc());
- + else if (IsAnsiCode(cp))
- + DescWMap(miscmap, AnsiKey());
- else
- add_mess("is bound to %s.", cp->Name);
- }
- ***************
- *** 519,524 ****
- --- 583,589 ----
- {
- struct variable *vp;
- char prbuf[256];
- +
-
- if ((vp = (struct variable *) findvar(ProcFmt)) == 0)
- return;
- *** jove.c Mon Jun 22 14:45:33 1987
- --- jove.c Mon Jun 22 14:45:34 1987
- ***************
- *** 342,353 ****
- {
- ttyset(OFF);
- putpad(KE, 1);
- - putpad(VE, 1);
- putpad(TE, 1);
- #ifdef ID_CHAR
- INSmode(0);
- #endif
- Placur(ILI, 0);
- printf("%s", mesg);
- putpad(CE, 1);
- flusho();
- --- 342,353 ----
- {
- ttyset(OFF);
- putpad(KE, 1);
- putpad(TE, 1);
- #ifdef ID_CHAR
- INSmode(0);
- #endif
- Placur(ILI, 0);
- + putpad(VE, 1); /* Relocated, for better visual support */
- printf("%s", mesg);
- putpad(CE, 1);
- flusho();
- *** misc.c Mon Jun 22 14:46:13 1987
- --- misc.c Mon Jun 22 14:46:14 1987
- ***************
- *** 439,444 ****
- --- 439,446 ----
- int num2;
- static char *unsupported = "[Unsupported ANSI code received]";
-
- + register data_obj *cp;
- +
- while (isdigit(c = getch()))
- num1 = (num1*10) + (c - '0');
-
- ***************
- *** 478,486 ****
- ClAndRedraw();
- break;
- }
- /* FALL THROUGH */
- default:
- ! complain(unsupported);
- }
- }
- #endif ANSICODES
- --- 480,507 ----
- ClAndRedraw();
- break;
- }
- + break;
- + case 'z': /* DASHER (ANSI) Function */
- + num1 = (num1 % 100) + (num1 / 100) * 32;
- /* FALL THROUGH */
- + case '~': /* VT220 function */
- +
- + cp = miscmap[num1 % (sizeof(miscmap) / sizeof(miscmap[0]))];
- + if (cp == 0) {
- + s_mess("[%sunbound]", key_strokes);
- + rbell();
- + } else
- + ExecCmd(cp);
- + break;
- +
- default:
- ! cp = miscmap[c];
- ! if (cp == 0) {
- ! s_mess("[%sunbound]", key_strokes);
- ! rbell();
- ! } else
- ! ExecCmd(cp);
- ! break;
- }
- }
- #endif ANSICODES
- *** screen.c Mon Jun 22 14:47:16 1987
- --- screen.c Mon Jun 22 14:47:17 1987
- ***************
- *** 144,149 ****
- if (i_line != CapLine || i_col != CapCol)
- Placur(i_line, i_col);
- ! if (UL && (c & 0177) == '_' && (*cursor & 0177) != ' ')
- ! putstr(" \b"); /* Erase so '_' looks right. */
- *cursor++ = c;
- putchar(c & 0177);
- --- 144,154 ----
- if (i_line != CapLine || i_col != CapCol)
- Placur(i_line, i_col);
- ! if (UL && (c & 0177) == '_' && (*cursor & 0177) != ' ') {
- ! putstr(" "); /* Erase so '_' looks right. */
- ! if (BC)
- ! putpad(BC, 1);
- ! else
- ! putchar('\b');
- ! }
- *cursor++ = c;
- putchar(c & 0177);
- ***************
- *** 533,537 ****
-
- while (--nlines >= 0)
- ! putchar('\n');
- CapLine = destline;
- }
- --- 538,542 ----
-
- while (--nlines >= 0)
- ! putpad(DN, 1);
- CapLine = destline;
- }
- *** term.c Mon Jun 22 14:47:50 1987
- --- term.c Mon Jun 22 14:47:50 1987
- ***************
- *** 20,25 ****
- --- 20,26 ----
- /* Termcap definitions */
-
- char *UP,
- + *DN,
- *CS,
- *SO,
- *SE,
- ***************
- *** 80,101 ****
-
- /* The ordering of ts and meas must agree !! */
- #ifdef LSRHS
- ! static char *ts="vsvealdlspcssosecmclcehoupbcicimdceillsfsrvbksketiteALDLICDCrsrepcip";
- static char **meas[] = {
- &VS, &VE, &AL, &DL, &SP, &CS, &SO, &SE,
- &CM, &CL, &CE, &HO, &UP, &BC, &IC, &IM,
- &DC, &EI, &LL, &SF, &SR, &VB, &KS, &KE,
- &TI, &TE, &M_AL, &M_DL, &M_IC, &M_DC,
- ! &RS, &RE, &lPC, &IP, 0
- };
- #else
- ! static char *ts="vsvealdlspcssosecmclcehoupbcicimdceillsfsrvbksketiteALDLICDCpcip";
- static char **meas[] = {
- &VS, &VE, &AL, &DL, &SP, &CS, &SO, &SE,
- &CM, &CL, &CE, &HO, &UP, &BC, &IC, &IM,
- &DC, &EI, &LL, &SF, &SR, &VB, &KS, &KE,
- &TI, &TE, &M_AL, &M_DL, &M_IC, &M_DC,
- ! &lPC, &IP, 0
- };
- #endif
-
- --- 81,102 ----
-
- /* The ordering of ts and meas must agree !! */
- #ifdef LSRHS
- ! static char *ts="vsvealdlspcssosecmclcehoupbcicimdceillsfsrvbksketiteALDLICDCrsrepcipdo";
- static char **meas[] = {
- &VS, &VE, &AL, &DL, &SP, &CS, &SO, &SE,
- &CM, &CL, &CE, &HO, &UP, &BC, &IC, &IM,
- &DC, &EI, &LL, &SF, &SR, &VB, &KS, &KE,
- &TI, &TE, &M_AL, &M_DL, &M_IC, &M_DC,
- ! &RS, &RE, &lPC, &IP, &DN, 0
- };
- #else
- ! static char *ts="vsvealdlspcssosecmclcehoupbcicimdceillsfsrvbksketiteALDLICDCpcipdo";
- static char **meas[] = {
- &VS, &VE, &AL, &DL, &SP, &CS, &SO, &SE,
- &CM, &CL, &CE, &HO, &UP, &BC, &IC, &IM,
- &DC, &EI, &LL, &SF, &SR, &VB, &KS, &KE,
- &TI, &TE, &M_AL, &M_DL, &M_IC, &M_DC,
- ! &lPC, &IP, &DN, 0
- };
- #endif
-
- ***************
- *** 154,159 ****
- --- 155,163 ----
- *(meas[i]) = (char *) tgetstr(ts, &termp);
- ts += 2;
- }
- +
- + if (!DN)
- + DN = "\n";
- if (lPC)
- PC = *lPC;
- if (XS)
- ***************
- *** 190,193 ****
- if (CanScroll = ((AL && DL) || CS))
- IDline_setup(termname);
- }
- -
- --- 194,196 ----
- *** termcap.h Mon Jun 22 14:47:57 1987
- --- termcap.h Mon Jun 22 14:47:57 1987
- ***************
- *** 9,14 ****
- --- 9,15 ----
-
- extern char
- *UP, /* Scroll reverse, or up */
- + *DN, /* down */
- *CS, /* If on vt100 */
- *SO, /* Start standout */
- *SE, /* End standout */
- --
-
- Jim Patterson decvax!utzoo!dciem!nrcaer!cognos!jimp
- Cognos Incorporated
-