ref: f2b7f24e4e14099251dd0ed8e7e13d7ca466b0cf
parent: b58584b0578617f6cabcae6e51c6e3e0dc51fec1
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Apr 22 16:16:07 EDT 2017
vt: handle application/normal mode (really fixes cursor keys)
--- a/sys/src/cmd/vt/cons.h
+++ b/sys/src/cmd/vt/cons.h
@@ -35,13 +35,12 @@
};
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;
--- a/sys/src/cmd/vt/main.c
+++ b/sys/src/cmd/vt/main.c
@@ -110,7 +110,7 @@
char *sendbufp = sendbuf;
char *term;
-struct funckey *fk;
+struct funckey *fk, *appfk;
/* functions */
void initialize(int, char **);
@@ -212,8 +212,8 @@
char *fontname, *p;
fontname = nil;
+ fk = ansifk;
term = "vt100";
- fk = vt100fk;
blkbg = 0;
rflag = 0;
attr = defattr;
@@ -220,11 +220,9 @@
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,19 +519,28 @@
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
waitchar(void)
{
@@ -1108,16 +1115,6 @@
else if(str[i] == '\n') fprint(fd,"^J\n");
else fprint(fd,"%c",str[i]);
}
-}
-
-void
-funckey(int key)
-{
- if(key >= NKEYS)
- return;
- if(fk[key].name == 0)
- return;
- sendnchars(strlen(fk[key].sequence), fk[key].sequence);
}
void
--- a/sys/src/cmd/vt/vt.c
+++ b/sys/src/cmd/vt/vt.c
@@ -32,14 +32,7 @@
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 @@
{ "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 @@
{ "F10", "\033[21~", },
{ "F11", "\033[23~", },
{ "F12", "\033[24~", },
+ { 0 },
};
char gmap[256] = {
@@ -433,6 +429,7 @@
}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 @@
default:
break;
case 1: /* set cursor keys to send application function: ESC O A..D */
+ appfk = ansiappfk;
break;
case 2: /* set ANSI */
break;