ref: b68b3a6e19eb57c9f1c8b70b624f103254f4964a
parent: 4fd09def0fc51d0606e677f1ab59ad695d1cd780
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);