screenlock: use initdisplay(2), top the window (thanks stuart morrow)
Screenlock should use libdraw(2) to init the display and create the window, instead of looking at the screen file directly. Also, to prevent new windows from popping up over screenlock, bring it to the top periodically.
This commit is contained in:
parent
a5517fca5f
commit
319e625be0
1 changed files with 25 additions and 12 deletions
|
@ -17,6 +17,7 @@ usage(void)
|
|||
exits("usage");
|
||||
}
|
||||
|
||||
/* ^D, Delete, Enter, Backspace, ^U */
|
||||
void
|
||||
readline(char *buf, int nbuf)
|
||||
{
|
||||
|
@ -115,28 +116,39 @@ grabmouse(void*)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
top(void*)
|
||||
{
|
||||
int fd;
|
||||
|
||||
if((fd = open("/dev/wctl", OWRITE)) < 0)
|
||||
return;
|
||||
|
||||
for(;;){
|
||||
write(fd, "current", 7);
|
||||
sleep(500);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
lockscreen(void)
|
||||
{
|
||||
enum { Nfld = 5, Fldlen = 12, Cursorlen = 2*4 + 2*2*16, };
|
||||
enum { Cursorlen = 2*4 + 2*2*16 };
|
||||
char *s;
|
||||
char buf[Nfld*Fldlen], *flds[Nfld], newcmd[128], cbuf[Cursorlen];
|
||||
char newcmd[128], cbuf[Cursorlen];
|
||||
int fd, dx, dy;
|
||||
Image *i;
|
||||
Point p;
|
||||
Rectangle r;
|
||||
Tm *tm;
|
||||
|
||||
if((fd = open("/dev/screen", OREAD)) < 0)
|
||||
sysfatal("can't open /dev/screen: %r");
|
||||
if(read(fd, buf, Nfld*Fldlen) != Nfld*Fldlen)
|
||||
sysfatal("can't read /dev/screen: %r");
|
||||
close(fd);
|
||||
buf[sizeof buf-1] = 0;
|
||||
if(tokenize(buf, flds, Nfld) != Nfld)
|
||||
sysfatal("can't tokenize /dev/screen header");
|
||||
snprint(newcmd, sizeof newcmd, "-r %s %s %s %s",
|
||||
flds[1], flds[2], flds[3], flds[4]);
|
||||
display = initdisplay(nil, nil, nil);
|
||||
if(display == nil)
|
||||
sysfatal("can't open /dev/draw: %r");
|
||||
r = display->image->r;
|
||||
snprint(newcmd, sizeof newcmd, "-r %d %d %d %d",
|
||||
r.min.x, r.min.y, r.max.x, r.max.y);
|
||||
closedisplay(display);
|
||||
|
||||
newwindow(newcmd);
|
||||
if((fd = open("/dev/consctl", OWRITE)) >= 0)
|
||||
|
@ -179,6 +191,7 @@ lockscreen(void)
|
|||
flushimage(display, 1);
|
||||
|
||||
/* screen is now open and covered. grab mouse and hold on tight */
|
||||
procrfork(top, nil, 8*1024, RFFDG);
|
||||
procrfork(grabmouse, nil, 8*1024, RFFDG);
|
||||
procrfork(blanker, nil, 8*1024, RFFDG);
|
||||
|
||||
|
|
Loading…
Reference in a new issue