shithub: riscv

Download patch

ref: 5d7a77cf57a1a3c1b5b1b8203fa9b53dc38561ed
parent: c5b2927250f2dea07747150687239bdc883100a2
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Apr 22 14:01:49 EDT 2017

vt: fix xterm cursor keys

--- a/sys/src/cmd/vt/cons.h
+++ b/sys/src/cmd/vt/cons.h
@@ -54,6 +54,7 @@
 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 *);
--- a/sys/src/cmd/vt/main.c
+++ b/sys/src/cmd/vt/main.c
@@ -214,7 +214,7 @@
 	fontname = nil;
 	term = "vt100";
 	fk = vt100fk;
-	blkbg = nocolor = 0;
+	blkbg = 0;
 	rflag = 0;
 	attr = defattr;
 	ARGBEGIN{
@@ -315,8 +315,9 @@
 	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);
@@ -980,6 +981,18 @@
 	else if(pt.y > ymax+1)
 		pt.y = ymax+1;
 	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
--- a/sys/src/cmd/vt/vt.c
+++ b/sys/src/cmd/vt/vt.c
@@ -68,10 +68,10 @@
 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 @@
 			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 @@
 					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 @@
 					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;