rupley@arizona.edu (John Rupley) (06/09/89)
context diff patch for tcap.c:
1) added timeout loop in get1key(), for USG option; without it, one
cannot use the function keys under sys5; it could be made more portable
by #defining the processor speed, or building in a test for it;
commented-out code gives an alternative solution, without a timeout
loop.
2) modified ttable[], to allow shifted function keys and some other stuff.
3) sample terminfo, consistent with (2), included in comment.
John Rupley
uucp: ..{uunet | ucbvax | cmcl2 | hao!ncar!noao}!arizona!rupley!local
internet: rupley!local@megaron.arizona.edu
(H) 30 Calle Belleza, Tucson AZ 85716 - (602) 325-4533
(O) Dept. Biochemistry, Univ. Arizona, Tucson AZ 85721 - (602) 621-3929
------------------------------------------------------------------------
*** tcap.c Mon May 22 16:21:08 1989
--- ../tcap.c Fri May 26 13:47:56 1989
***************
*** 70,75
*/
#define termdef 1 /* don't define "term" external */
#include <stdio.h>
--- 70,135 -----
*/
+ /*
+ * a non-portable but generally usable USG option for get1key() is suggested;
+ * it allows use of the function keys needed to handle menus, specifically
+ * those of .emacsrc and the *.cmd files;
+ *
+ * it assumes typeahead() is enabled;
+ *
+ * the ttable[] bindings include shifted function and keypad keys;
+ *
+ * following is a sample ansi terminfo file, which has strings for the
+ * normal and shifted keys, and which adheres more-or-less to the
+ * ansi standard;
+ *
+ * a user without write permission on the system terminfo files likely
+ * will have to set up a local TERMINFO environment by use of .profile,
+ * and perhaps reprogram the function and keypad strings of the terminal;
+ *
+ * j.a. rupley, tucson, az - rupley!local@megaron.arizona.edu
+ */
+
+ /*-
+ ansi|modified terminfo description
+ # DELETE #...# COMMENTS #...# BEFORE #...# TIC'ING #
+ # standard stuff #
+ am, xon, cols#80, lines#24, bel=^G, cr=\r, clear=\E[H\E[J,
+ el=\E[K, ed=\E[J, cup=\E[%i%p1%d;%p2%dH, cud1=\n, home=\E[H,
+ cub1=\b, cuf1=\E[C, cuu1=\E[A, dch1=\E[P, dl1=\E[M, blink=\E[5m,
+ bold=\E[1m, smir=\E[4h, invis=\E[8m, rev=\E[7m, smso=\E[7m,
+ smul=\E[4m, sgr0=\E[m, rmir=\E[4l, rmso=\E[0m, rmul=\E[0m,
+ is2=\E[=h, ich1=\E[@, il1=\E[L,
+ dl=\E[%p1%dM, cud=\E[%p1%dB,
+ ich=\E[%p1%d@, il=\E[%p1%dL, cub=\E[%p1%dD, cuf=\E[%p1%dC,
+ cuu=\E[%p1%dA, ind=\n, ht=\t,
+ # function keys - kf0=kf10 #
+ kf1=\EOc, kf2=\EOd, kf3=\EOe, kf4=\EOf,
+ kf5=\EOg, kf6=\EOh, kf7=\EOi, kf8=\EOj, kf9=\EOk,
+ kf0=\EOl, kf10=\EOl,
+ # shifted function keys - lf0=lf10 #
+ # tricky - store and recover strings as labels #
+ lf1=\EOC, lf2=\EOD, lf3=\EOE, lf4=\EOF,
+ lf5=\EOG, lf6=\EOH, lf7=\EOI, lf8=\EOJ, lf9=\EOK,
+ lf0=\EOL, lf10=\EOL,
+ # keypad keys #
+ khome=\E[H, kcuu1=\E[A, kpp=\E[U,
+ kcub1=\E[D, kcuf1=\E[C,
+ kll=\E[E, kcud1=\E[B, knp=\E[V,
+ # ins #
+ kich1=\E[@,
+ # shifted keypad keys #
+ ka1=\E[!H, kri=\E[S, ka3=\E[!U,
+ kclr=\E[!@, kel=\E[!A,
+ kc1=\E[!E, kind=\E[T, kc3=\E[!V,
+ # shifted ins and shifted del #
+ kil1=\E[L, kdch1=\E[P,
+ # miscellaneous #
+ kdl1=\E[M,
+ cbt=\E[Z,
+ kbs=\b,
+ */
+
#define termdef 1 /* don't define "term" external */
#include <stdio.h>
***************
*** 103,136
} TBIND;
TBIND ttable[] = {
! "bt", SHFT | CTRL | 'i', "", /* backtab */
! "k1", SPEC | '1', "", /* function key 1 */
! "k2", SPEC | '2', "", /* function key 2 */
! "k3", SPEC | '3', "", /* function key 3 */
! "k4", SPEC | '4', "", /* function key 4 */
! "k5", SPEC | '5', "", /* function key 5 */
! "k6", SPEC | '6', "", /* function key 6 */
! "k7", SPEC | '7', "", /* function key 7 */
! "k8", SPEC | '8', "", /* function key 8 */
! "k9", SPEC | '9', "", /* function key 9 */
! "k0", SPEC | '0', "", /* function key 10 */
! "kA", CTRL | 'O', "", /* insert line */
! "kb", CTRL | 'H', "", /* backspace */
! "kC", CTRL | 'L', "", /* clear screen */
! "kD", SPEC | 'D', "", /* delete character */
! "kd", SPEC | 'N', "", /* down cursor */
! "kE", CTRL | 'K', "", /* clear to end of line */
! "kF", CTRL | 'V', "", /* scroll down */
! "kH", SPEC | '>', "", /* home down [END?] key */
! "kh", SPEC | '<', "", /* home */
! "kI", SPEC | 'C', "", /* insert character */
! "kL", CTRL | 'K', "", /* delete line */
! "kl", SPEC | 'B', "", /* left cursor */
! "kN", SPEC | 'V', "", /* next page */
! "kP", SPEC | 'Z', "", /* previous page */
! "kR", CTRL | 'Z', "", /* scroll down */
! "kr", SPEC | 'F', "", /* right cursor */
! "ku", SPEC | 'P', "", /* up cursor */
};
#define NTBINDS sizeof(ttable)/sizeof(TBIND)
--- 163,232 -----
} TBIND;
TBIND ttable[] = {
! "k1", SPEC | '1', "", /* kf1 /* function key 1 */
! "k2", SPEC | '2', "", /* kf2 /* function key 2 */
! "k3", SPEC | '3', "", /* kf3 /* function key 3 */
! "k4", SPEC | '4', "", /* kf4 /* function key 4 */
! "k5", SPEC | '5', "", /* kf5 /* function key 5 */
! "k6", SPEC | '6', "", /* kf6 /* function key 6 */
! "k7", SPEC | '7', "", /* kf7 /* function key 7 */
! "k8", SPEC | '8', "", /* kf8 /* function key 8 */
! "k9", SPEC | '9', "", /* kf9 /* function key 9 */
! "k0", SPEC | '0', "", /* kf0 /* function key 10 */
! "l1", SPEC | SHFT | '1', "", /* kl1 /* shftd func key 1 */
! "l2", SPEC | SHFT | '2', "", /* kl2 /* shftd func key 2 */
! "l3", SPEC | SHFT | '3', "", /* kl3 /* shftd func key 3 */
! "l4", SPEC | SHFT | '4', "", /* kl4 /* shftd func key 4 */
! "l5", SPEC | SHFT | '5', "", /* kl5 /* shftd func key 5 */
! "l6", SPEC | SHFT | '6', "", /* kl6 /* shftd func key 6 */
! "l7", SPEC | SHFT | '7', "", /* kl7 /* shftd func key 7 */
! "l8", SPEC | SHFT | '8', "", /* kl8 /* shftd func key 8 */
! "l9", SPEC | SHFT | '9', "", /* kl9 /* shftd func key 9 */
! "l0", SPEC | SHFT | '0', "", /* kl0 /* shftd func key 10 */
! /* the following key-pad keys and their bindings are obvious */
! "kh", SPEC | '<', "", /* khome /* home */
! "ku", SPEC | 'P', "", /* kcuu1 /* up cursor */
! "kP", SPEC | 'Z', "", /* kpp /* previous page */
! "kl", SPEC | 'B', "", /* kcub1 /* left cursor */
! "kr", SPEC | 'F', "", /* kcuf1 /* right cursor */
! "kH", SPEC | '>', "", /* kll /* home down [END] */
! "kd", SPEC | 'N', "", /* kcud1 /* down cursor */
! "kN", SPEC | 'V', "", /* knp /* next page */
! /* the following are less obvious */
! /* ins # kI kich1 insert character */ /* bound to insspace */
! "kI", SPEC | 'C', "", /* kich1 /* insert character */
! /* shift del # kD kdch1 delete character */ /* bound to forwdel */
! "kD", SPEC | 'D', "", /* kdch1 /* delete character */
! /* shift ins # kA kil1 insert line */ /* bound to openline */
! "kA", CTRL | 'O', "", /* kil1 /* insert line */
! /* shift up # kR kri scroll up */ /* bound to backpage */
! "kR", CTRL | 'Z', "", /* kri /* scroll up */
! /* shift down # kF kind scroll down */ /* bound to forwpage */
! "kF", CTRL | 'V', "", /* kind /* scroll down */
! /* shift left # kC kclr clear screen */ /* bound to backword */
! /* "kC", META | 'B', "", /* kclr /* clear screen */
! "kC", SPEC | CTRL | 'B', "", /* kclr /* clear screen */
! /* shift right # kE kel clear to eol */ /* bound to forwword */
! /* "kE", META | 'F', "", /* kel /* clear to eol */
! "kE", SPEC | CTRL | 'F', "", /* kel /* clear to eol */
! /* shift pgup # K3 ka3 pad upper right */ /* bound to gotobop */
! /* "K3", META | 'P', "", /* ka3 /* pad upper right */
! "K3", SPEC | CTRL | 'Z', "", /* ka3 /* pad upper right */
! /* shift pgdn # K5 kc3 pad lower right */ /* bound to gotoeop */
! /* "K5", META | 'N', "", /* kc3 /* pad lower right */
! "K5", SPEC | CTRL | 'V', "", /* kc3 /* pad lower right */
! /* shift home # K1 ka1 pad upper left */ /* unbound key */
! "K1", SPEC | CTRL | '<', "", /* ka1 /* pad upper left */
! /* shift end # K4 kc1 pad lower left */ /* unbound key */
! "K4", SPEC | CTRL | '>', "", /* kc1 /* pad lower left */
! /* shift tab # bt cbt backtab /* unbound key */
! "bt", SHFT | CTRL | 'i', "", /* cbt /* backtab */
! /* and let's forget the following */
! /* alt del # kL kdl1 delete line */
! /* "kL", CTRL | 'K', "", /* kdl1 /* delete line */
! /* "kb", CTRL | 'H', "", /* kbs /* backspace */
! /* "kC", CTRL | 'L', "", /* kclr /* clear screen */
! /* "kE", CTRL | 'K', "", /* kel /* clear to eol */
};
#define NTBINDS sizeof(ttable)/sizeof(TBIND)
***************
*** 450,457
/* we don't know how to do this check for a pending char within
1/30th of a second machine independantly in the general System V
case.... so we don't */
! if (kbdmode != PLAY)
! return(CTRL | '[');
#endif
/* a key is pending within 1/30 of a sec... its an escape sequence */
--- 546,586 -----
/* we don't know how to do this check for a pending char within
1/30th of a second machine independantly in the general System V
case.... so we don't */
! /*
! * or... maybe we try it;
! * very non-portable solution;
! * hardware-dependent timing loop;
! * set upper-limit on loop by testing hardware, to get 30 ms;
! * use typahead() to check for waiting input on exit from loop;
! */
! { int i;
! if (kbdmode != PLAY && typahead() <= 0) {
! /* loop limit set by hardware test */
! /* for 30 ms or a bit less */
! for (i = 0; i < 1500; i++)
! ;
! if (typahead() <= 0)
! return(CTRL | '[');
! }
! }
! /*-
! * another way -- using blocking read;
! * problem... when <esc> used as terminator, as in setup for
! * searches, need to give it twice, or whatever;
! * non-portable... assumes ansi standard for function keys and
! * keypad;
! */
! /*
! {
! extern char kbdq;
! extern int kbdqp;
!
! kbdq = ttgetc();
! kbdqp = 1;
! if ((kbdq & 255) != '[' && (kbdq & 255) != 'O')
! return(CTRL | '[');
! }
! */
#endif
/* a key is pending within 1/30 of a sec... its an escape sequence */
***************
*** 457,462
/* a key is pending within 1/30 of a sec... its an escape sequence */
cseq[0] = 27;
sp = &cseq[1];
while (sp < &cseq[6]) {
c = ttgetc();
*sp++ = c;
--- 586,592 -----
/* a key is pending within 1/30 of a sec... its an escape sequence */
cseq[0] = 27;
sp = &cseq[1];
+ *sp = 0;
while (sp < &cseq[6]) {
c = ttgetc();
*sp++ = c;