diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-04-22 20:16:07 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-04-22 20:16:07 +0200 |
commit | f2b7f24e4e14099251dd0ed8e7e13d7ca466b0cf (patch) | |
tree | 6930eb16d09e714fe20d550bef270dedfe965bfd /sys/src | |
parent | b58584b0578617f6cabcae6e51c6e3e0dc51fec1 (diff) |
vt: handle application/normal mode (really fixes cursor keys)
Diffstat (limited to 'sys/src')
-rw-r--r-- | sys/src/cmd/vt/cons.h | 5 | ||||
-rw-r--r-- | sys/src/cmd/vt/main.c | 41 | ||||
-rw-r--r-- | sys/src/cmd/vt/vt.c | 34 |
3 files changed, 37 insertions, 43 deletions
diff --git a/sys/src/cmd/vt/cons.h b/sys/src/cmd/vt/cons.h index 25bdec477..8b521af10 100644 --- a/sys/src/cmd/vt/cons.h +++ b/sys/src/cmd/vt/cons.h @@ -35,13 +35,12 @@ struct ttystate { }; extern struct ttystate ttystate[]; -#define NKEYS 32 /* max key definitions */ struct funckey { char *name; char *sequence; }; -extern struct funckey *fk; -extern struct funckey vt100fk[], vt220fk[], ansifk[], xtermfk[]; +extern struct funckey *fk, *appfk; +extern struct funckey ansifk[], ansiappfk[], xtermfk[]; extern int x, y, xmax, ymax, olines; extern int peekc, attribute; diff --git a/sys/src/cmd/vt/main.c b/sys/src/cmd/vt/main.c index 7cecb4b49..8006c8184 100644 --- a/sys/src/cmd/vt/main.c +++ b/sys/src/cmd/vt/main.c @@ -110,7 +110,7 @@ char sendbuf[BSIZE]; /* hope you can't type ahead more than BSIZE chars */ char *sendbufp = sendbuf; char *term; -struct funckey *fk; +struct funckey *fk, *appfk; /* functions */ void initialize(int, char **); @@ -212,19 +212,17 @@ initialize(int argc, char **argv) char *fontname, *p; fontname = nil; + fk = ansifk; term = "vt100"; - fk = vt100fk; blkbg = 0; rflag = 0; attr = defattr; ARGBEGIN{ case '2': term = "vt220"; - fk = vt220fk; break; case 'a': term = "ansi"; - fk = ansifk; break; case 'b': blkbg = 1; /* e.g., for linux colored output */ @@ -521,17 +519,26 @@ canon(char *ep, Rune c) return(OTHER); } -void -sendfk(char *name) +char* +lookfk(struct funckey *fk, char *name) { int i; - static int fd; - for(i=0; fk[i].name; i++) - if(strcmp(name, fk[i].name)==0){ - sendnchars(strlen(fk[i].sequence), fk[i].sequence); - return; - } + for(i=0; fk[i].name; i++){ + if(strcmp(name, fk[i].name)==0) + return fk[i].sequence; + } + return nil; +} + +void +sendfk(char *name) +{ + char *s = lookfk(appfk != nil ? appfk : fk, name); + if(s == nil && appfk != nil) + s = lookfk(fk, name); + if(s != nil) + sendnchars(strlen(s), s); } int @@ -1111,16 +1118,6 @@ escapedump(int fd,uchar *str,int len) } void -funckey(int key) -{ - if(key >= NKEYS) - return; - if(fk[key].name == 0) - return; - sendnchars(strlen(fk[key].sequence), fk[key].sequence); -} - -void drawstring(Rune *str, int n) { memmove(onscreenr(x, y), str, n*sizeof(Rune)); diff --git a/sys/src/cmd/vt/vt.c b/sys/src/cmd/vt/vt.c index 0a2dd2063..457cbc94c 100644 --- a/sys/src/cmd/vt/vt.c +++ b/sys/src/cmd/vt/vt.c @@ -32,14 +32,7 @@ int originrelative = 0; int tabcol[200]; -struct funckey vt100fk[NKEYS] = { - { "up key", "\033OA", }, - { "down key", "\033OB", }, - { "left key", "\033OD", }, - { "right key", "\033OC", }, -}; - -struct funckey ansifk[NKEYS] = { +struct funckey ansifk[] = { { "up key", "\033[A", }, { "down key", "\033[B", }, { "left key", "\033[D", }, @@ -56,22 +49,24 @@ struct funckey ansifk[NKEYS] = { { "F10", "\033OY", }, { "F11", "\033OZ", }, { "F12", "\033O1", }, + { 0 }, }; -struct funckey vt220fk[NKEYS] = { - { "up key", "\033[A", }, - { "down key", "\033[B", }, - { "left key", "\033[D", }, - { "right key", "\033[C", }, -}; - -struct funckey xtermfk[NKEYS] = { - { "page up", "\033[5~", }, - { "page down", "\033[6~", }, +struct funckey ansiappfk[] = { { "up key", "\033OA", }, { "down key", "\033OB", }, { "left key", "\033OD", }, { "right key", "\033OC", }, + { 0 }, +}; + +struct funckey xtermfk[] = { + { "page up", "\033[5~", }, + { "page down", "\033[6~", }, + { "up key", "\033[A", }, + { "down key", "\033[B", }, + { "left key", "\033[D", }, + { "right key", "\033[C", }, { "F1", "\033OP", }, { "F2", "\033OQ", }, { "F3", "\033OR", }, @@ -84,6 +79,7 @@ struct funckey xtermfk[NKEYS] = { { "F10", "\033[21~", }, { "F11", "\033[23~", }, { "F12", "\033[24~", }, + { 0 }, }; char gmap[256] = { @@ -433,6 +429,7 @@ emulate(void) }else while(--noperand > 0){ switch(operand[noperand]){ case 1: /* set cursor keys to send ANSI functions: ESC [ A..D */ + appfk = nil; break; case 2: /* set VT52 mode (not implemented) */ break; @@ -486,6 +483,7 @@ emulate(void) default: break; case 1: /* set cursor keys to send application function: ESC O A..D */ + appfk = ansiappfk; break; case 2: /* set ANSI */ break; |