home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d1xx
/
d131
/
mg1b.lha
/
Mg1b
/
Source
/
kbd.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-03-14
|
5KB
|
216 lines
/*
* Terminal independent keyboard handling.
*/
#include "def.h"
static mapin();
#ifdef DPROMPT
#define PROMPTL 80
char prompt[PROMPTL], *promptp;
#endif
/*
* All input from the user (should!) go through
* getkey. Quotep is true to get raw keys, false to
* get 11-bit code keys.
* Getkey is responsible for putting keystrokes away
* for macros. It also takes keystrokes out of the macro,
* though other input routines will can also do this.
* Read in a key, doing the terminal
* independent prefix handling. The terminal specific
* "getkbd" routine gets the first swing, and may return
* one of the special codes used by the special keys
* on the keyboard. The "getkbd" routine returns the
* C0 controls as received; this routine moves them to
* the right spot in 11 bit code.
* If the KPROMPT bit in the flags is set and DPROMPT is
* defined, do delayed prompting. (dprompt routine is
* in sys/???/ttyio.c)
*/
KEY
getkey(f) register int f; {
register KEY c;
KEY keychar();
int getkbd(), ttgetc();
if (kbdmop != NULL) return *kbdmop++;
#ifdef DPROMPT
if(!(f&KPROMPT)) prompt[0] = '\0';
#endif
c = (KEY) mapin(getkbd);
#ifdef DPROMPT
if(f&KPROMPT) {
if(promptp > prompt) *(promptp-1) = ' ';
if(promptp >= &prompt[PROMPTL-8]) f &= ~KPROMPT;
/* must have a lot of prefixes.... */
}
#endif
if ((f&KQUOTE) == 0) {
#ifdef DO_METAKEY
if ((c & ~KCHAR) == KCTRL) /* Function key */
c = ((char) c) & KCHAR;/* remove wrapping */
else if ((c >= 0x80) && (c <= 0xFF)) { /* real meta key */
c = ((char) c) & 0x7f; /* Get the key and mode map it */
if ((mode&MFLOW) != 0)
if (c == CCHR('^')) c = CCHR('Q');
else if (c == CCHR('\\')) c = CCHR('S');
if ((mode&MBSMAP) != 0)
if (c == CCHR('H')) c = 0x7f;
else if (c == 0x7f) c = CCHR('H');
c = KMETA | keychar(c & ~0x80, TRUE);
}
#endif
#ifdef DPROMPT
if(f&KPROMPT) {
keyname(promptp, (c<=0x1F && c>=0x00)?KCTRL|(c+'@'):c);
strcat(promptp, "-");
}
#endif
if (c == METACH) /* M- */
c = KMETA | keychar(mapin(ttgetc), TRUE);
else if (c == CTRLCH) /* C- */
c = KCTRL | keychar(mapin(ttgetc), TRUE);
else if (c == CTMECH) /* C-M- */
c = KCTRL | KMETA | keychar(mapin(ttgetc), TRUE);
else if (c<=0x1F && c>=0x00) /* Relocate control. */
c = KCTRL | (c+'@');
if (c == (KCTRL|'X')) /* C-X */
c = KCTLX | keychar(mapin(ttgetc), TRUE);
}
if ((f&KNOMAC) == 0 && kbdmip != NULL) {
if (kbdmip+1 > &kbdm[NKBDM-3]) { /* macro overflow */
(VOID) ctrlg(FALSE, 0, KRANDOM);
ewprintf("Keyboard macro overflow");
ttflush();
return (KCTRL|'G'); /* ^G it for us */
}
*kbdmip++ = c;
}
#ifdef DPROMPT
if(f&KPROMPT) {
keyname(promptp, c);
promptp += strlen(promptp);
*promptp++ = '-';
*promptp = '\0';
}
#endif
return (c);
}
/*
* go get a key, and run it through whatever mapping the modes
* specify.
*/
static mapin(get) int (*get)(); {
register int c;
#ifdef DPROMPT
if(prompt[0]!='\0' && ttwait()) {
ewprintf("%s", prompt); /* avoid problems with % */
update(); /* put the cursor back */
epresf = KPROMPT;
}
#endif
c = (*get)();
if ((mode&MFLOW) != 0) {
while (c == CCHR('S') || c == CCHR('Q'))
c = (*get)();
if (c == CCHR('^')) c = CCHR('Q');
else if (c == CCHR('\\')) c = CCHR('S');
}
if ((mode&MBSMAP) != 0)
if (c == CCHR('H')) c = 0x7f;
else if (c == 0x7f) c = CCHR('H');
return c;
}
/*
* Transform a key code into a name,
* using a table for the special keys and combination
* of some hard code and some general processing for
* the rest. None of this code is terminal specific any
* more. This makes adding keys easier.
*/
VOID
keyname(cp, k) register char *cp; register int k; {
register char *np;
register int c;
char nbuf[3];
static char hex[] = {
'0', '1', '2', '3',
'4', '5', '6', '7',
'8', '9', 'A', 'B',
'C', 'D', 'E', 'F'
};
if ((k&KCTLX) != 0) { /* C-X prefix. */
*cp++ = 'C';
*cp++ = '-';
*cp++ = 'x';
*cp++ = ' ';
}
if ((k&KMETA) != 0) { /* Add M- mark. */
*cp++ = 'E';
*cp++ = 'S';
*cp++ = 'C';
*cp++ = ' ';
}
if ((k&KCHAR)>=KFIRST && (k&KCHAR)<=KLAST) {
if ((np=keystrings[(k&KCHAR)-KFIRST]) != NULL) {
if ((k&KCTRL) != 0) {
*cp++ = 'C';
*cp++ = '-';
}
(VOID) strcpy(cp, np);
return;
}
}
c = k & ~(KMETA|KCTLX);
if (c == (KCTRL|'I')) /* Some specials. */
np = "TAB";
else if (c == (KCTRL|'M'))
np = "RET";
else if (c == (KCTRL|'J'))
np = "LFD";
else if (c == ' ')
np = "SPC";
else if (c == 0x7F)
np = "DEL";
else if (c == (KCTRL|'['))
np = "ESC";
else {
if ((k&KCTRL) != 0) { /* Add C- mark. */
*cp++ = 'C';
*cp++ = '-';
}
if ((k&(KCTRL|KMETA|KCTLX)) != 0 && ISUPPER(k&KCHAR) != FALSE)
k = TOLOWER(k&KCHAR);
np = &nbuf[0];
if (((k&KCHAR)>=0x20 && (k&KCHAR)<=0x7E)
|| ((k&KCHAR)>=0xA0 && (k&KCHAR)<=0xFE)) {
nbuf[0] = k&KCHAR; /* Graphic. */
nbuf[1] = 0;
} else { /* Non graphic. */
nbuf[0] = hex[(k>>4)&0x0F];
nbuf[1] = hex[k&0x0F];
nbuf[2] = 0;
}
}
(VOID) strcpy(cp, np);
}
/*
* turn a key into an internal char.
*/
KEY
keychar(c, f) register int c, f; {
if (f == TRUE && ISLOWER(c) != FALSE)
c = TOUPPER(c);
else if (c>=0x00 && c<=0x1F) /* Relocate control. */
c = (KCTRL|(c+'@'));
return (KEY) c;
}