char *label;
QLock;
+ char *ext;
void *data;
int (*open)(Page *);
Cprev,
Czerox,
Cwrite,
+ Cext,
Cdummy2,
Cquit,
};
[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,
};
0x00, 0x00, 0x01, 0xb6, 0x01, 0xb6, 0x00, 0x00, }
};
+void showpage1(Page *);
void showpage(Page *);
void drawpage(Page *);
Point pagesize(Page *);
qunlock(&pagelock);
if(up && current == up)
- showpage(p);
+ showpage1(p);
return 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
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);
goto Err1;
}
- argv[0] = p->data;
+ argv[0] = (char*)p->data;
switch(rfork(RFPROC|RFMEM|RFFDG|RFREND|RFNOWAIT)){
case -1:
goto Err2;
"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,
};
fd = p->fd;
p->fd = -1;
+ p->ext = nil;
file = p->data;
p->data = nil;
if(fd < 0){
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");
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;
}
}
+/* 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)
{
if(p == nil)
return;
- esetcursor(&reading);
+ drawlock(0);
qlock(p);
if((fd = openpage(p)) < 0)
goto Out;
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){
qunlock(p);
}
}
- unlockdisplay(display);
+ drawlock(0);
}
int cohort = -1;
exits("usage");
}
-int
+void
docmd(int i, Mouse *m)
{
char buf[NPATH], *s;
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:
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){
}
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)
}
}
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
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)){
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;
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))
if(prevpage(current))
pos.y = 0;
qunlock(current);
- if(!docmd(Cprev, &m))
- continue;
+ docmd(Cprev, &m);
break;
case Kdown:
if(current == nil || !canqlock(current))
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++)
(cmds[i].k3 == e.kbdc))
break;
if(i < nelem(cmds)){
- if(!docmd(i, &m))
- continue;
+ docmd(i, &m);
break;
}
if((e.kbdc < 0x20) ||
(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;