Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!uunet!hsi!mlfarm!ron From: ron@mlfarm.com (Ronald Florence) Newsgroups: comp.unix.xenix.sco Subject: Re: '286 curses keypad() mode Message-ID: <812@mlfarm.com> Date: 24 May 91 13:29:04 GMT References: <160@kaos.UUCP> Sender: ron@mlfarm.com Organization: Maple Lawn Farm, Stonington, CT Lines: 158 In-reply-to: wardlaw@kaos.UUCP's message of 22 May 91 19:14:14 GMT In comp.unix.xenix.sco, wardlaw@kaos.UUCP (Johnie Wardlaw) writes: > I am having a problem using the function key capabilities in curses on > SCO Xenix V/286 v2.3.2. There are all sorts of solutions, and some are complex. To read multi-character keys reliably, you sometimes need a timer so that the the key handler can distinguish between `ESC' followed by `[' followed by `A', from the special key sequence `ESC[A'. The following code is a quick and dirty solution. I wouldn't use it for an editor, but it works fine for games. The keycodes are from the terminfo version of curses, but I use this code with termcap. Call the function lookupkeys() after initscr(). Then read keys with int_variable = getkey(). #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create: # keys.c # keys.h # This archive created: Fri May 24 09:17:31 1991 # By: Ronald Florence (Maple Lawn Farm, Stonington, CT) export PATH; PATH=/bin:/usr/bin:$PATH echo shar: "extracting 'keys.c'" '(1587 characters)' if test -f 'keys.c' then echo shar: "will not over-write existing file 'keys.c'" else sed 's/^X//' << \SHAR_EOF > 'keys.c' X/* X * keys.c - gets arrow and function keys from termcap, X * returns terminfo codes X * changes quit key for use as arrow X * X * define NO_SYSV for versions of curses that do not look up X * arrow & function key strings from termcap X * X * copyright 1988 Ronald Florence X * changed VMIN & VTIME for wy99 @ 9600, ron@mlfarm (7/11/88) X */ X X#include X#ifndef KEY_DOWN X#include "keys.h" X#endif X X#define NKEYS 16 X Xchar X#ifdef NO_SYSV X *tcap_ids[] = { X "kd", "ku", "kl", "kr", "kh", "kb", X "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7", "k8", "k9", 0 X }, X#endif X *fkeys[NKEYS]; X Xlookupkeys() X{ X#ifdef NO_SYSV X static char sbuf[256]; X char **key, tbuf[1024], *fill = sbuf, *tgetstr(); X int i = 0; X X tgetent(tbuf, ttytype); X for (key = tcap_ids; *key; ++key) X fkeys[i++] = tgetstr(*key, &fill); X#else X fkeys[0] = KD; X fkeys[1] = KU; X fkeys[2] = KL; X fkeys[3] = KR; X fkeys[4] = KH; X fkeys[5] = KB; X fkeys[6] = K0; X fkeys[7] = K1; X fkeys[8] = K2; X fkeys[9] = K3; X fkeys[10] = K4; X fkeys[11] = K5; X fkeys[12] = K6; X fkeys[13] = K7; X fkeys[14] = K8; X fkeys[15] = K9; X#endif X fixquit(); X} X X Xgetkey() X{ X char cmd[6]; X register k; X X k = read(0, cmd, 6); X cmd[k] = '\0'; X for (k = 0; k < NKEYS; k++) X if (strcmp(cmd, fkeys[k]) == 0) X return (k + KEY_DOWN); X return ((int) *cmd); X} X X Xfixquit() X{ X struct termio new; X X ioctl(0, TCGETA, &new); X new.c_cc[VQUIT] = 0xff; /* in case QUIT is an arrow */ X new.c_cc[VTIME] = 1; /* minimum timeout */ X new.c_cc[VMIN] = 3; /* or three characters */ X ioctl(0, TCSETA, &new); X} SHAR_EOF if test 1587 -ne "`wc -c < 'keys.c'`" then echo shar: "error transmitting 'keys.c'" '(should have been 1587 characters)' fi fi echo shar: "extracting 'keys.h'" '(345 characters)' if test -f 'keys.h' then echo shar: "will not over-write existing file 'keys.h'" else sed 's/^X//' << \SHAR_EOF > 'keys.h' X/* X * keys.h X * copyright 1988 Ronald Florence X * X * use with curses programs that need extended keyboard X * (if tcap.h does not include the defines) X */ X X#define KEY_DOWN 0402 X#define KEY_UP 0403 X#define KEY_LEFT 0404 X#define KEY_RIGHT 0405 X#define KEY_HOME 0406 X#define KEY_BACKSPACE 0407 X#define KEY_F0 0410 X#define KEY_F(n) (KEY_F0 + (n)) SHAR_EOF if test 345 -ne "`wc -c < 'keys.h'`" then echo shar: "error transmitting 'keys.h'" '(should have been 345 characters)' fi fi exit 0 # End of shell archive -- Ronald Florence ron@mlfarm.com