From c029a0c9130b7a9b5a9c3883e813dd8d8a0a770d Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sat, 22 Apr 2017 21:07:53 +0200 Subject: [PATCH] vt: handle insert/delete/home/end keys for vt220/xterm --- sys/src/cmd/vt/cons.h | 2 +- sys/src/cmd/vt/main.c | 43 ++++++++++++++++++++++++++++++++++--------- sys/src/cmd/vt/vt.c | 10 +++++++++- 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/sys/src/cmd/vt/cons.h b/sys/src/cmd/vt/cons.h index 8b521af10..b4bafdb68 100644 --- a/sys/src/cmd/vt/cons.h +++ b/sys/src/cmd/vt/cons.h @@ -40,7 +40,7 @@ struct funckey { char *sequence; }; extern struct funckey *fk, *appfk; -extern struct funckey ansifk[], ansiappfk[], xtermfk[]; +extern struct funckey ansifk[], ansiappfk[], vt220fk[]; 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 8006c8184..467356069 100644 --- a/sys/src/cmd/vt/main.c +++ b/sys/src/cmd/vt/main.c @@ -219,6 +219,7 @@ initialize(int argc, char **argv) attr = defattr; ARGBEGIN{ case '2': + fk = vt220fk; term = "vt220"; break; case 'a': @@ -240,7 +241,7 @@ initialize(int argc, char **argv) sysfatal("could not create log file: %s: %r", p); break; case 'x': - fk = xtermfk; + fk = vt220fk; term = "xterm"; break; case 'r': @@ -531,14 +532,17 @@ lookfk(struct funckey *fk, char *name) return nil; } -void +int sendfk(char *name) { char *s = lookfk(appfk != nil ? appfk : fk, name); if(s == nil && appfk != nil) s = lookfk(fk, name); - if(s != nil) + if(s != nil){ sendnchars(strlen(s), s); + return 1; + } + return 0; } int @@ -570,6 +574,30 @@ waitchar(void) resize_flag = 1; if(cs->raw) { switch(kbdchar){ + case Kins: + if(!sendfk("insert")) + goto Send; + break; + case Kdel: + if(!sendfk("delete")) + goto Send; + break; + case Khome: + if(!sendfk("home")) + goto Send; + break; + case Kend: + if(!sendfk("end")) + goto Send; + break; + + case Kpgup: + sendfk("page up"); + break; + case Kpgdown: + sendfk("page down"); + break; + case Kup: sendfk("up key"); break; @@ -582,12 +610,7 @@ waitchar(void) case Kright: sendfk("right key"); break; - case Kpgup: - sendfk("page up"); - break; - case Kpgdown: - sendfk("page down"); - break; + case KF|1: sendfk("F1"); break; @@ -624,6 +647,7 @@ waitchar(void) case KF|12: sendfk("F12"); break; + case '\n': echobuf[0] = '\r'; sendnchars(1, echobuf); @@ -633,6 +657,7 @@ waitchar(void) sendnchars(1, echobuf); break; default: + Send: sendnchars(runetochar(echobuf, &kbdchar), echobuf); break; } diff --git a/sys/src/cmd/vt/vt.c b/sys/src/cmd/vt/vt.c index 457cbc94c..9a0c0fc48 100644 --- a/sys/src/cmd/vt/vt.c +++ b/sys/src/cmd/vt/vt.c @@ -57,16 +57,23 @@ struct funckey ansiappfk[] = { { "down key", "\033OB", }, { "left key", "\033OD", }, { "right key", "\033OC", }, + { 0 }, }; -struct funckey xtermfk[] = { +struct funckey vt220fk[] = { + { "insert", "\033[2~", }, + { "delete", "\033[3~", }, + { "home", "\033[1~", }, + { "end", "\033[4~", }, { "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", }, @@ -79,6 +86,7 @@ struct funckey xtermfk[] = { { "F10", "\033[21~", }, { "F11", "\033[23~", }, { "F12", "\033[24~", }, + { 0 }, };