ssh: issue "winchon" ctl request to /dev/consctl to get interrupt on window size change from vt(1)
This commit is contained in:
parent
faae8eb752
commit
bc54898807
1 changed files with 39 additions and 19 deletions
|
@ -97,7 +97,7 @@ shutdown(void)
|
||||||
void
|
void
|
||||||
catch(void*, char *msg)
|
catch(void*, char *msg)
|
||||||
{
|
{
|
||||||
if(strstr(msg, "interrupt") != nil){
|
if(strcmp(msg, "interrupt") == 0){
|
||||||
intr = 1;
|
intr = 1;
|
||||||
noted(NCONT);
|
noted(NCONT);
|
||||||
}
|
}
|
||||||
|
@ -114,7 +114,7 @@ wasintr(void)
|
||||||
return 1;
|
return 1;
|
||||||
memset(err, 0, sizeof(err));
|
memset(err, 0, sizeof(err));
|
||||||
errstr(err, sizeof(err));
|
errstr(err, sizeof(err));
|
||||||
r = strstr(err, "interrupt") != nil;
|
r = strcmp(err, "interrupted") == 0;
|
||||||
errstr(err, sizeof(err));
|
errstr(err, sizeof(err));
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
@ -1073,20 +1073,10 @@ static struct {
|
||||||
} tty;
|
} tty;
|
||||||
|
|
||||||
void
|
void
|
||||||
rawon(void)
|
getdim(void)
|
||||||
{
|
{
|
||||||
int ctl;
|
|
||||||
char *s;
|
char *s;
|
||||||
|
|
||||||
close(0);
|
|
||||||
if(open("/dev/cons", OREAD) != 0)
|
|
||||||
sysfatal("open: %r");
|
|
||||||
close(1);
|
|
||||||
if(open("/dev/cons", OWRITE) != 1)
|
|
||||||
sysfatal("open: %r");
|
|
||||||
dup(1, 2);
|
|
||||||
if((ctl = open("/dev/consctl", OWRITE)) >= 0)
|
|
||||||
write(ctl, "rawon", 5);
|
|
||||||
if(s = getenv("XPIXELS")){
|
if(s = getenv("XPIXELS")){
|
||||||
tty.xpixels = atoi(s);
|
tty.xpixels = atoi(s);
|
||||||
free(s);
|
free(s);
|
||||||
|
@ -1105,6 +1095,25 @@ rawon(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
rawon(void)
|
||||||
|
{
|
||||||
|
int ctl;
|
||||||
|
|
||||||
|
close(0);
|
||||||
|
if(open("/dev/cons", OREAD) != 0)
|
||||||
|
sysfatal("open: %r");
|
||||||
|
close(1);
|
||||||
|
if(open("/dev/cons", OWRITE) != 1)
|
||||||
|
sysfatal("open: %r");
|
||||||
|
dup(1, 2);
|
||||||
|
if((ctl = open("/dev/consctl", OWRITE)) >= 0){
|
||||||
|
write(ctl, "rawon", 5);
|
||||||
|
write(ctl, "winchon", 7); /* vt(1): interrupt note on window change */
|
||||||
|
}
|
||||||
|
getdim();
|
||||||
|
}
|
||||||
|
|
||||||
#pragma varargck type "k" char*
|
#pragma varargck type "k" char*
|
||||||
|
|
||||||
kfmt(Fmt *f)
|
kfmt(Fmt *f)
|
||||||
|
@ -1323,12 +1332,23 @@ Next1: switch(recvpkt()){
|
||||||
break;
|
break;
|
||||||
if(n < 0 && wasintr()){
|
if(n < 0 && wasintr()){
|
||||||
if(!raw) break;
|
if(!raw) break;
|
||||||
sendpkt("busbs", MSG_CHANNEL_REQUEST,
|
if(intr){
|
||||||
send.chan,
|
getdim();
|
||||||
"signal", 6,
|
sendpkt("busbuuuu", MSG_CHANNEL_REQUEST,
|
||||||
0,
|
send.chan,
|
||||||
"INT", 3);
|
"window-change", 13,
|
||||||
intr = 0;
|
0,
|
||||||
|
tty.cols,
|
||||||
|
tty.lines,
|
||||||
|
tty.xpixels,
|
||||||
|
tty.ypixels);
|
||||||
|
sendpkt("busbs", MSG_CHANNEL_REQUEST,
|
||||||
|
send.chan,
|
||||||
|
"signal", 6,
|
||||||
|
0,
|
||||||
|
"INT", 3);
|
||||||
|
intr = 0;
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(n <= 0)
|
if(n <= 0)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue