From 5d7a77cf57a1a3c1b5b1b8203fa9b53dc38561ed Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sat, 22 Apr 2017 18:01:49 +0200 Subject: [PATCH] vt: fix xterm cursor keys --- sys/src/cmd/vt/cons.h | 1 + sys/src/cmd/vt/main.c | 17 +++++++++++++++-- sys/src/cmd/vt/vt.c | 13 ++++++------- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/sys/src/cmd/vt/cons.h b/sys/src/cmd/vt/cons.h index b487ee9bd..25bdec477 100644 --- a/sys/src/cmd/vt/cons.h +++ b/sys/src/cmd/vt/cons.h @@ -54,6 +54,7 @@ extern void newline(void); extern int get_next_char(void); extern void ringbell(void); extern int number(Rune *, int *); +extern void shift(int,int,int,int); extern void scroll(int,int,int,int); extern void backup(int); extern void sendnchars(int, char *); diff --git a/sys/src/cmd/vt/main.c b/sys/src/cmd/vt/main.c index 94877d3f3..7cecb4b49 100644 --- a/sys/src/cmd/vt/main.c +++ b/sys/src/cmd/vt/main.c @@ -214,7 +214,7 @@ initialize(int argc, char **argv) fontname = nil; term = "vt100"; fk = vt100fk; - blkbg = nocolor = 0; + blkbg = 0; rflag = 0; attr = defattr; ARGBEGIN{ @@ -315,8 +315,9 @@ drawscreen(void) uchar c, *ap, *cp; Rune *rp; - /* draw background */ draw(screen, screen->r, bgcolor, nil, ZP); + + /* draw background */ for(y = 0; y <= ymax; y++){ for(x = 0; x <= xmax; x += n){ cp = onscreenc(x, y); @@ -982,6 +983,18 @@ pos(Point pt) return pt; } +void +shift(int x1, int y, int x2, int w) +{ + if(x1+w > xmax+1) + w = xmax+1 - x1; + if(x2+w > xmax+1) + w = xmax+1 - x2; + memmove(onscreenr(x1, y), onscreenr(x2, y), w*sizeof(Rune)); + memmove(onscreena(x1, y), onscreena(x2, y), w); + memmove(onscreenc(x1, y), onscreenc(x2, y), w); +} + void scroll(int sy, int ly, int dy, int cy) /* source, limit, dest, which line to clear */ { diff --git a/sys/src/cmd/vt/vt.c b/sys/src/cmd/vt/vt.c index c6e35f8a7..0a2dd2063 100644 --- a/sys/src/cmd/vt/vt.c +++ b/sys/src/cmd/vt/vt.c @@ -68,10 +68,10 @@ struct funckey vt220fk[NKEYS] = { struct funckey xtermfk[NKEYS] = { { "page up", "\033[5~", }, { "page down", "\033[6~", }, - { "up key", "\033[A", }, - { "down key", "\033[B", }, - { "left key", "\033[D", }, - { "right key", "\033[C", }, + { "up key", "\033OA", }, + { "down key", "\033OB", }, + { "left key", "\033OD", }, + { "right key", "\033OC", }, { "F1", "\033OP", }, { "F2", "\033OQ", }, { "F3", "\033OR", }, @@ -326,7 +326,6 @@ emulate(void) case 'Z': Ident: sendnchars(7, "\033[?1;2c"); /* VT100 with AVO option */ -// sendnchars(5, "\033[?6c"); /* VT102 (insert/delete-char, etc.) */ break; /* @@ -734,7 +733,7 @@ emulate(void) case 'P': fixops(operand); i = x + operand[0]; - draw(screen, Rpt(pt(x, y), pt(xmax+1, y+1)), screen, nil, pt(i, y)); + shift(x, y, i, xmax+1 - i); clear(xmax-operand[0], y, xmax+1, y+1); break; @@ -744,7 +743,7 @@ emulate(void) case '@': fixops(operand); i = x + operand[0]; - draw(screen, Rpt(pt(i, y), pt(xmax+1, y+1)), screen, nil, pt(x, y)); + shift(i, y, x, xmax+1 - i); clear(x, y, i, y+1); break;