]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/page.c
python: update python build configuration to new ape capabilities like getaddrinfo...
[plan9front.git] / sys / src / cmd / page.c
index 648c0fd0f73f251edbc14918f24e7fac4bf3bd79..c7170cc3e2d83cd5afd5dd58c4e2d415ddf09018 100644 (file)
@@ -11,6 +11,7 @@ struct Page {
        char    *label;
 
        QLock;
+       char    *ext;
        void    *data;
        int     (*open)(Page *);
 
@@ -60,6 +61,7 @@ enum {
        Cprev,
        Czerox,
        Cwrite,
+       Cext,
        Cdummy2,
        Cquit,
 };
@@ -82,6 +84,7 @@ struct {
        [Cprev]         "prev",         Kleft, Kbs, 0,
        [Czerox]        "zerox",        'z', 0, 0,
        [Cwrite]        "write",        'w', 0, 0,
+       [Cext]          "ext",          'x', 0, 0,
        [Cdummy2]       "",             0, 0, 0,
        [Cquit]         "quit",         'q', Kdel, Keof,
 };
@@ -113,6 +116,7 @@ Cursor reading = {
         0x00, 0x00, 0x01, 0xb6, 0x01, 0xb6, 0x00, 0x00, }
 };
 
+void showpage1(Page *);
 void showpage(Page *);
 void drawpage(Page *);
 Point pagesize(Page *);
@@ -146,7 +150,7 @@ addpage(Page *up, char *label, int (*popen)(Page *), void *pdata, int fd)
        qunlock(&pagelock);
 
        if(up && current == up)
-               showpage(p);
+               showpage1(p);
        return p;
 }
 
@@ -285,8 +289,14 @@ popenimg(Page *p)
        }
 
        seek(fd, 0, 0);
-       if(p->data)
-               pipeline(fd, "%s", (char*)p->data);
+       if(p->data){
+               p->ext = p->data;
+               if(strcmp(p->ext, "ico") == 0)
+                       snprint(nam, sizeof(nam), "%s -c", p->ext);
+               else
+                       snprint(nam, sizeof(nam), "%s -t9", p->ext);
+               pipeline(fd, "%s", nam);
+       }
 
        /*
         * dont keep the file descriptor arround if it can simply
@@ -322,7 +332,7 @@ popentape(Page *p)
 
        seek(p->fd, 0, 0);
        snprint(mnt, sizeof(mnt), "/n/tapefs.%.12d%.8lux", getpid(), (ulong)p);
-       snprint(cmd, sizeof(cmd), "%s -m %s /fd/0", p->data, mnt);
+       snprint(cmd, sizeof(cmd), "%s -m %s /fd/0", (char*)p->data, mnt);
        switch(rfork(RFPROC|RFMEM|RFFDG|RFREND)){
        case -1:
                close(p->fd);
@@ -485,7 +495,7 @@ popengs(Page *p)
                goto Err1;
        }
 
-       argv[0] = p->data;
+       argv[0] = (char*)p->data;
        switch(rfork(RFPROC|RFMEM|RFFDG|RFREND|RFNOWAIT)){
        case -1:
                goto Err2;
@@ -663,11 +673,13 @@ popenfile(Page *p)
        "application/x-compress",       popenfilter,    "uncompress",
        "application/x-gzip",           popenfilter,    "gunzip",
        "application/x-bzip2",          popenfilter,    "bunzip2",
-       "image/gif",                    popenimg,       "gif -t9",
-       "image/jpeg",                   popenimg,       "jpg -t9",
-       "image/png",                    popenimg,       "png -t9",
-       "image/ppm",                    popenimg,       "ppm -t9",
-       "image/bmp",                    popenimg,       "bmp -t9",
+       "image/gif",                    popenimg,       "gif",
+       "image/jpeg",                   popenimg,       "jpg",
+       "image/png",                    popenimg,       "png",
+       "image/ppm",                    popenimg,       "ppm",
+       "image/bmp",                    popenimg,       "bmp",
+       "image/tga",                    popenimg,       "tga",
+       "image/x-icon",                 popenimg,       "ico",
        "image/p9bit",                  popenimg,       nil,
        };
 
@@ -677,6 +689,7 @@ popenfile(Page *p)
 
        fd = p->fd;
        p->fd = -1;
+       p->ext = nil;
        file = p->data;
        p->data = nil;
        if(fd < 0){
@@ -806,7 +819,8 @@ loadpage(Page *p)
        int fd;
 
        if(p->open && p->image == nil){
-               if((fd = openpage(p)) >= 0){
+               fd = openpage(p);
+               if(fd >= 0){
                        pagegen++;
                        if((p->image = readimage(display, fd, 1)) == nil)
                                fprint(2, "readimage: %r\n");
@@ -1114,8 +1128,13 @@ cmdmenugen(int i)
        return cmds[i].m;
 }
 
+/*
+ * spawn new proc to load a run of pages starting with p
+ * the display should *not* be locked as it gets called
+ * from recursive page load.
+ */
 void
-showpage(Page *p)
+showpage1(Page *p)
 {
        static int nproc;
        int oviewgen;
@@ -1137,6 +1156,28 @@ showpage(Page *p)
        }
 }
 
+/* recursive display lock, called from main proc only */
+void
+drawlock(int dolock){
+       static int ref = 0;
+       if(dolock){
+               if(ref++ == 0)
+                       lockdisplay(display);
+       } else {
+               if(--ref == 0)
+                       unlockdisplay(display);
+       }
+}
+
+
+void
+showpage(Page *p)
+{
+       drawlock(0);
+       showpage1(p);
+       drawlock(1);
+}
+
 void
 shownext(void)
 {
@@ -1167,7 +1208,7 @@ zerox(Page *p)
 
        if(p == nil)
                return;
-       esetcursor(&reading);
+       drawlock(0);
        qlock(p);
        if((fd = openpage(p)) < 0)
                goto Out;
@@ -1183,15 +1224,61 @@ zerox(Page *p)
        close(fd);
 Out:
        qunlock(p);
-       esetcursor(nil);
+       drawlock(1);
 }
 
+void
+showext(Page *p)
+{
+       char buf[128], label[64], *argv[4];
+       Point ps;
+       int fd;
+
+       if(p->ext == nil)
+               return;
+       snprint(label, sizeof(label), "%s %s", p->ext, p->label);
+       if(p->image){
+               ps = subpt(p->image->r.max, p->image->r.min);
+               ps.x += 24;
+               ps.y += 24;
+       } else
+               ps = subpt(screen->r.max, screen->r.min);
+       drawlock(0);
+       if((fd = p->fd) < 0){
+               if(p->open != popenfile)
+                       return;
+               fd = open((char*)p->data, OREAD);
+       } else {
+               fd = dup(fd, -1);
+               seek(fd, 0, 0);
+       }
+       if(rfork(RFPROC|RFMEM|RFFDG|RFNOTEG|RFNAMEG|RFNOWAIT) == 0){
+               snprint(buf, sizeof(buf), "-pid %d -dx %d -dy %d", getpid(), ps.x, ps.y);
+               if(newwindow(buf) != -1){
+                       dupfds(fd, 1, 2, -1);
+                       if((fd = open("/dev/label", OWRITE)) >= 0){
+                               write(fd, label, strlen(label));
+                               close(fd);
+                       }
+                       argv[0] = "rc";
+                       argv[1] = "-c";
+                       argv[2] = p->ext;
+                       argv[3] = nil;
+                       exec("/bin/rc", argv);
+               }
+               exits(0);
+       }
+       close(fd);
+       drawlock(1);
+}
+
+
 void
 eresized(int new)
 {
        Page *p;
 
-       lockdisplay(display);
+       drawlock(1);
        if(new && getwindow(display, Refnone) == -1)
                sysfatal("getwindow: %r");
        if(p = current){
@@ -1200,7 +1287,7 @@ eresized(int new)
                        qunlock(p);
                }
        }
-       unlockdisplay(display);
+       drawlock(0);
 }
 
 int cohort = -1;
@@ -1225,7 +1312,7 @@ usage(void)
        exits("usage");
 }
 
-int
+void
 docmd(int i, Mouse *m)
 {
        char buf[NPATH], *s;
@@ -1240,11 +1327,11 @@ docmd(int i, Mouse *m)
                rotate = 0;
        Unload:
                viewgen++;
-               unlockdisplay(display);
-               esetcursor(&reading);
+               drawlock(0);
                unloadpages(0);
-               showpage(current);
-               return 0;
+               showpage1(current);
+               drawlock(1);
+               break;
        case Cupsidedown:
                rotate += 90;
        case Crotate90:
@@ -1266,7 +1353,7 @@ docmd(int i, Mouse *m)
        case Czoomin:
        case Czoomout:
                if(current == nil || !canqlock(current))
-                       return 1;
+                       break;
                o = subpt(m->xy, screen->r.min);
                if(i == Czoomin){
                        if(zoom < 0x40000000){
@@ -1281,10 +1368,10 @@ docmd(int i, Mouse *m)
                }
                drawpage(current);
                qunlock(current);
-               return 1;
+               break;
        case Cwrite:
                if(current == nil || !canqlock(current))
-                       return 1;
+                       break;
                if(current->image){
                        s = nil;
                        if(current->up && current->up != root)
@@ -1306,23 +1393,25 @@ docmd(int i, Mouse *m)
                        }
                }
                qunlock(current);
-               return 1;
+               break;
+       case Cext:
+               if(current == nil || !canqlock(current))
+                       break;
+               showext(current);
+               qunlock(current);
+               break;
        case Cnext:
-               unlockdisplay(display);
                shownext();
-               return 0;
+               break;
        case Cprev:
-               unlockdisplay(display);
                showprev();
-               return 0;
+               break;
        case Czerox:
-               unlockdisplay(display);
                zerox(current);
-               return 0;
+               break;
        case Cquit:
                exits(0);
        }
-       return 1;
 }
 
 void
@@ -1385,23 +1474,26 @@ main(int argc, char *argv[])
        ground = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x777777FF);
        display->locking = 1;
        unlockdisplay(display);
+       drawlock(1);
+
        einit(Ekeyboard|Emouse);
        eplumb(Eplumb, "image");
        memset(&m, 0, sizeof(m));
        if((nullfd = open("/dev/null", ORDWR)) < 0)
                sysfatal("open: %r");
        current = root = addpage(nil, "", nil, nil, -1);
-
        if(*argv == nil && !imode)
                addpage(root, "stdin", popenfile, strdup("/fd/0"), -1);
        for(; *argv; argv++)
                addpage(root, shortname(*argv), popenfile, strdup(*argv), -1);
 
        for(;;){
+               drawlock(0);
                i=event(&e);
+               drawlock(1);
+
                switch(i){
                case Emouse:
-                       lockdisplay(display);
                        m = e.mouse;
                        if(m.buttons & 1){
                                if(current &&  canqlock(current)){
@@ -1418,8 +1510,7 @@ main(int argc, char *argv[])
                                o = m.xy;
                                i = emenuhit(2, &m, &cmdmenu);
                                m.xy = o;
-                               if(!docmd(i, &m))
-                                       continue;
+                               docmd(i, &m);
                        } else if(m.buttons & 4){
                                if(root->down){
                                        Page *x;
@@ -1428,15 +1519,11 @@ main(int argc, char *argv[])
                                        pagemenu.lasthit = pageindex(current);
                                        x = pageat(emenuhit(3, &m, &pagemenu));
                                        qunlock(&pagelock);
-                                       unlockdisplay(display);
                                        showpage(x);
-                                       continue;
                                }
                        }
-                       unlockdisplay(display);
                        break;
                case Ekeyboard:
-                       lockdisplay(display);
                        switch(e.kbdc){
                        case Kup:
                                if(current == nil || !canqlock(current))
@@ -1449,8 +1536,7 @@ main(int argc, char *argv[])
                                if(prevpage(current))
                                        pos.y = 0;
                                qunlock(current);
-                               if(!docmd(Cprev, &m))
-                                       continue;
+                               docmd(Cprev, &m);
                                break;
                        case Kdown:
                                if(current == nil || !canqlock(current))
@@ -1464,8 +1550,7 @@ main(int argc, char *argv[])
                                if(nextpage(current))
                                        pos.y = 0;
                                qunlock(current);
-                               if(!docmd(Cnext, &m))
-                                       continue;
+                               docmd(Cnext, &m);
                                break;
                        default:
                                for(i = 0; i<nelem(cmds); i++)
@@ -1474,8 +1559,7 @@ main(int argc, char *argv[])
                                           (cmds[i].k3 == e.kbdc))
                                                break;
                                if(i < nelem(cmds)){
-                                       if(!docmd(i, &m))
-                                               continue;
+                                       docmd(i, &m);
                                        break;
                                }
                                if((e.kbdc < 0x20) || 
@@ -1483,14 +1567,9 @@ main(int argc, char *argv[])
                                   (e.kbdc & 0xFF00) == Spec)
                                        break;
                                snprint(buf, sizeof(buf), "%C", (Rune)e.kbdc);
-                               i = eenter("Go to", buf, sizeof(buf), &m);
-                               if(i > 0){
-                                       unlockdisplay(display);
+                               if(eenter("Go to", buf, sizeof(buf), &m) > 0)
                                        showpage(findpage(buf));
-                                       continue;
-                               }
                        }
-                       unlockdisplay(display);
                        break;
                case Eplumb:
                        pm = e.v;