]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/screenlock.c
merge
[plan9front.git] / sys / src / cmd / screenlock.c
index c127c2193da445bb872b6db438eec923bef9b2c3..9ac9fa06442b68315f1bc7e2e351f614019a7568 100644 (file)
@@ -17,6 +17,7 @@ usage(void)
        exits("usage");
 }
 
+/* ^D, Delete, Enter, Backspace, ^U */
 void
 readline(char *buf, int nbuf)
 {
@@ -24,7 +25,7 @@ readline(char *buf, int nbuf)
        int i;
 
        i = 0;
-       while(i < nbuf-1)
+       while(i < nbuf-1){
                if(read(0, &c, 1) != 1 || c == '\04' || c == '\177'){
                        i = 0;
                        break;
@@ -36,6 +37,8 @@ readline(char *buf, int nbuf)
                        i = 0;
                else
                        buf[i++] = c;
+               blank = time(0);
+       }
        buf[i] = '\0';
 }
 
@@ -62,8 +65,6 @@ checkpassword(void)
                        break;
 
                auth_freeAI(ai);
-               blank = time(0);
-
                border(screen, screen->r, 8, display->black, ZP);
                flushimage(display, 1);
        }
@@ -80,7 +81,7 @@ blanker(void *)
                return;
 
        for(;;){
-               if(((ulong)time(0) - (ulong)blank) >= 5){
+               if(blank != 0 && ((ulong)time(0) - (ulong)blank) >= 5){
                        blank = 0;
                        write(fd, "blank", 5);
                }
@@ -91,8 +92,8 @@ blanker(void *)
 void
 grabmouse(void*)
 {
+       int fd, x, y;
        char ibuf[256], obuf[256];
-       int fd;
 
        if((fd = open("/dev/mouse", ORDWR)) < 0)
                sysfatal("can't open /dev/mouse: %r");
@@ -102,34 +103,52 @@ grabmouse(void*)
                screen->r.min.y + Dy(screen->r)/2);
 
        while(read(fd, ibuf, sizeof ibuf) > 0){
-               if(!debug)
-                       fprint(fd, "%s", obuf);
-               blank = time(0);
+               ibuf[12] = 0;
+               ibuf[24] = 0;
+               x = atoi(ibuf+1);
+               y = atoi(ibuf+13);
+               if(x != screen->r.min.x + Dx(screen->r)/2 ||
+                  y != screen->r.min.y + Dy(screen->r)/2){
+                       if(!debug)
+                               fprint(fd, "%s", obuf);
+                       blank = time(0);
+               }
+       }
+}
+
+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 %d %d",
-               flds[1], flds[2], atoi(flds[3]), atoi(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)
@@ -146,6 +165,7 @@ lockscreen(void)
 
        if(initdraw(nil, nil, "screenlock") < 0)
                sysfatal("initdraw failed");
+       screen = _screen->image;        /* fullscreen */
 
        if((fd = open(pic, OREAD)) >= 0){
                if((i = readimage(display, fd, 0)) != nil){
@@ -171,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);