git: 9front

Download patch

ref: 8b87266cbc1c9c3d4e3c9629491ef57357a80943
parent: 7f3cb2a9c5b740dc86c4ac4e3d4cb45bb2e69dac
author: Ori Bernstein <ori@eigenstate.org>
date: Sat Jun 26 13:29:27 EDT 2021

vt, ssh: don't send interrupts on window resize

When resizing windows, vt would signal ssh by updating
the window size and sending an interrupt. Ssh reacted
by forwarding both the winch and an interrupt.

This change adds a WINCH generation counter so that
ssh can differentiate between resizes and interrupts.
If an interrupt comes in, and the WINCH generation
changes, then the interrupt is taken as signalling a
WINCH.

--- a/sys/src/cmd/ssh.c
+++ b/sys/src/cmd/ssh.c
@@ -1090,13 +1090,22 @@
 	int	ypixels;
 	int	lines;
 	int	cols;
+	int	gen;
 } tty;
 
-void
+int
 getdim(void)
 {
 	char *s;
+	int g;
 
+	if(s = getenv("WINCH")){
+		g = atoi(s);
+		if(tty.gen == g)
+			return 0;
+		tty.gen = g;
+		free(s);
+	}
 	if(s = getenv("XPIXELS")){
 		tty.xpixels = atoi(s);
 		free(s);
@@ -1113,6 +1122,7 @@
 		tty.cols = atoi(s);
 		free(s);
 	}
+	return 1;
 }
 
 void
@@ -1175,6 +1185,7 @@
 	fmtinstall('[', encodefmt);
 	fmtinstall('k', kfmt);
 
+	tty.gen = -1;
 	tty.term = getenv("TERM");
 	if(tty.term == nil)
 		tty.term = "";
@@ -1403,20 +1414,22 @@
 			intr = 1;
 		if(intr){
 			if(!raw) break;
-			getdim();
-			sendpkt("busbuuuu", MSG_CHANNEL_REQUEST,
-				send.chan,
-				"window-change", 13,
-				0,
-				tty.cols,
-				tty.lines,
-				tty.xpixels,
-				tty.ypixels);
-			sendpkt("busbs", MSG_CHANNEL_REQUEST,
-				send.chan,
-				"signal", 6,
-				0,
-				"INT", 3);
+			if(getdim()){
+				sendpkt("busbuuuu", MSG_CHANNEL_REQUEST,
+					send.chan,
+					"window-change", 13,
+					0,
+					tty.cols,
+					tty.lines,
+					tty.xpixels,
+					tty.ypixels);
+			}else{
+				sendpkt("busbs", MSG_CHANNEL_REQUEST,
+					send.chan,
+					"signal", 6,
+					0,
+					"INT", 3);
+			}
 			intr = 0;
 			continue;
 		}
--- a/sys/src/cmd/vt/main.c
+++ b/sys/src/cmd/vt/main.c
@@ -61,6 +61,7 @@
 int	nbacklines;
 int	xmax, ymax;
 int	blocked;
+int	winchgen;
 int	resize_flag = 1;
 int	pagemode;
 int	olines;
@@ -867,6 +868,7 @@
 void
 exportsize(void)
 {
+	putenvint("WINCH", ++winchgen);
 	putenvint("XPIXELS", (xmax+1)*ftsize.x);
 	putenvint("YPIXELS", (ymax+1)*ftsize.y);
 	putenvint("LINES", ymax+1);
--