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.
This commit is contained in:
parent
4fd09def0f
commit
b68b3a6e19
2 changed files with 30 additions and 15 deletions
|
@ -1090,13 +1090,22 @@ static struct {
|
|||
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 @@ getdim(void)
|
|||
tty.cols = atoi(s);
|
||||
free(s);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1175,6 +1185,7 @@ main(int argc, char *argv[])
|
|||
fmtinstall('[', encodefmt);
|
||||
fmtinstall('k', kfmt);
|
||||
|
||||
tty.gen = -1;
|
||||
tty.term = getenv("TERM");
|
||||
if(tty.term == nil)
|
||||
tty.term = "";
|
||||
|
@ -1403,20 +1414,22 @@ Mux:
|
|||
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;
|
||||
}
|
||||
|
|
|
@ -61,6 +61,7 @@ int backc;
|
|||
int nbacklines;
|
||||
int xmax, ymax;
|
||||
int blocked;
|
||||
int winchgen;
|
||||
int resize_flag = 1;
|
||||
int pagemode;
|
||||
int olines;
|
||||
|
@ -867,6 +868,7 @@ putenvint(char *name, int x)
|
|||
void
|
||||
exportsize(void)
|
||||
{
|
||||
putenvint("WINCH", ++winchgen);
|
||||
putenvint("XPIXELS", (xmax+1)*ftsize.x);
|
||||
putenvint("YPIXELS", (ymax+1)*ftsize.y);
|
||||
putenvint("LINES", ymax+1);
|
||||
|
|
Loading…
Reference in a new issue