diff -r b24b6b01d46a lib/vgadb --- a/lib/vgadb Tue Dec 29 19:38:59 2020 +0000 +++ b/lib/vgadb Wed Jan 06 10:56:36 2021 +0100 @@ -1772,6 +1772,19 @@ hsync=- vsync=- lcd=1 +t61_60=1400x1050 # 60Hz + clock=108 + shb=1448 ehb=1560 ht=1688 + vrs=1051 vre=1054 vt=1066 + hsync=- vsync=- + lcd=1 +t61_50=1400x1050 #50 Hz + clock=89.97 + shb=1448 ehb=1560 ht=1688 + vrs=1051 vre=1054 vt=1066 + hsync=- vsync=- + lcd=1 + # # NEC LCD2190uXp # diff -r b24b6b01d46a rc/bin/juke --- a/rc/bin/juke Tue Dec 29 19:38:59 2020 +0000 +++ b/rc/bin/juke Wed Jan 06 10:56:36 2021 +0100 @@ -26,7 +26,7 @@ sname=$2 shift case -* - echo usage: juke [-d level] [-tw] [-s srv] [-h srvhost] >[1=2] + echo Usage: classical [-d level] [-t] [-h srvhost] exit usage } shift diff -r b24b6b01d46a sys/man/1/tweak --- a/sys/man/1/tweak Tue Dec 29 19:38:59 2020 +0000 +++ b/sys/man/1/tweak Wed Jan 06 10:56:36 2021 +0100 @@ -155,6 +155,16 @@ Quit .IR tweak . The program will complain once about modified but unwritten files. +.PP +.I Tweak +listens to the +.I plumber +channel +.B imageedit +for filenames as well as image data. Plumbed image data is stored as files in +.B /tmp +and is automatically cleaned when exiting +.IR tweak . .SH SOURCE .B /sys/src/cmd/tweak.c .SH "SEE ALSO" diff -r b24b6b01d46a sys/man/2/9pfid --- a/sys/man/2/9pfid Tue Dec 29 19:38:59 2020 +0000 +++ b/sys/man/2/9pfid Wed Jan 06 10:56:36 2021 +0100 @@ -14,6 +14,17 @@ .PP .ft L .nf +.ta \w'\fL 'u +\w'\fLuvlong 'u +typedef struct Qid +{ + uvlong path; + ulong vers; + uchar type; +} Qid; +.fi +.PP +.ft L +.nf .ta \w'\fL 'u +\w'\fLulong 'u typedef struct Fid { diff -r b24b6b01d46a sys/src/cmd/tweak.c --- a/sys/src/cmd/tweak.c Tue Dec 29 19:38:59 2020 +0000 +++ b/sys/src/cmd/tweak.c Wed Jan 06 10:56:36 2021 +0100 @@ -3,8 +3,11 @@ #include #include #include +#include #include +#define Eplumb 128 + typedef struct Thing Thing; struct Thing @@ -157,6 +160,8 @@ int but1val = 0; int but2val = 255; int invert = 0; +int blockinput = 0; +int tmpindex = 0; Image *values[256]; Image *greyvalues[256]; uchar data[8192]; @@ -172,12 +177,60 @@ void tclose1(Thing*); void +flushevents(ulong keys) +{ + Event e; + if(keys == 0) + return; + while(ecanread(keys)) + eread(keys, &e); +} + +char* +pshowdata(Plumbmsg *pm) +{ + int fd; + char *file; + file = smprint("/tmp/tweaktmp.%d.%d", getpid(), tmpindex++); + if(file == 0) + sysfatal("malloc failed: %r"); + fd = create(file, OWRITE|OEXCL, 0600); + if(fd < 0){ + free(file); + mesg("cannot create tmpfile."); + return nil; + } + if(write(fd, pm->data, pm->ndata) != pm->ndata){ + mesg("error writing tmpfile: %r"); + close(fd); + free(file); + return nil; + } + close(fd); + return file; +} + +char* +pfilename(Plumbmsg *pm) +{ + char *file; + if(pm->data[0] == '/') + file = smprint("%.*s", pm->ndata, pm->data); + else + file = smprint("%s/%.*s", pm->wdir, pm->ndata, pm->data); + return cleanname(file); +} + +void main(int argc, char *argv[]) { int i; Event e; Thing *t; + Plumbmsg *pm; + char *s; + srand(time(0)); mag = Mag; if(initdraw(error, 0, "tweak") < 0){ fprint(2, "tweak: initdraw failed: %r\n"); @@ -190,6 +243,7 @@ drawerror(display, "can't allocate image"); } einit(Emouse|Ekeyboard); + eplumb(Eplumb, "imageedit"); eresized(0); i = 1; setjmp(err); @@ -214,10 +268,42 @@ } if(mouse.buttons & 4) menu(); + break; + case Eplumb: + pm = e.v; + if(pm->ndata == 0) + break; + s = plumblookup(pm->attr, "action"); + if(s && strcmp(s, "showdata") == 0) + file = pshowdata(pm); + else + file = pfilename(pm); + if(!file){ + mesg("invalid plumb data"); + plumbfree(pm); + break; + } + plumbfree(pm); + t = tget(file); + if(t) + drawthing(t, 1); + flushimage(display, 1); + file = 0; } } void +cleantmpfiles(void) +{ + char *s; + for(tmpindex--; tmpindex >= 0; tmpindex--){ + s = smprint("/tmp/tweaktmp.%d.%d", getpid(), tmpindex); + remove(s); + free(s); + } +} + +void error(Display*, char *s) { if(file) @@ -226,6 +312,7 @@ mesg("/dev/bitblt error: %s", s); if(err[0]) longjmp(err, 1); + cleantmpfiles(); exits(s); } @@ -531,6 +618,12 @@ nt->tr.max.y = nt->tr.min.y + nl; nt->er.max.y = nt->tr.max.y + Border; text(nt); + + mesg(""); + if(blockinput){ + flushevents(Emouse|Ekeyboard); + blockinput = 0; + } } int @@ -557,6 +650,9 @@ uchar buf[256]; char *data; + mesg("reading %s", file); + blockinput = 1; + buf[0] = '\0'; errstr((char*)buf, sizeof buf); /* flush pending error message */ memmove(oerr, err, sizeof err); @@ -2041,6 +2137,7 @@ buttons(Down); if(mouse.buttons == 4){ buttons(Up); + cleantmpfiles(); exits(0); } buttons(Up);