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);
--
⑨