diff -r 73caf2698436 sys/src/cmd/tweak.c --- a/sys/src/cmd/tweak.c Tue Dec 01 09:23:16 2020 +0100 +++ b/sys/src/cmd/tweak.c Fri Dec 04 11:23:24 2020 +0100 @@ -3,8 +3,11 @@ #include #include #include +#include #include +#define Eplumb 128 + typedef struct Thing Thing; struct Thing @@ -157,6 +160,7 @@ int but1val = 0; int but2val = 255; int invert = 0; +int blockinput = 0; Image *values[256]; Image *greyvalues[256]; uchar data[8192]; @@ -172,11 +176,22 @@ void tclose1(Thing*); void +flushevents(ulong keys) +{ + Event e; + if(keys == 0) + return; + while(ecanread(keys)) + eread(keys, &e); +} + +void main(int argc, char *argv[]) { int i; Event e; Thing *t; + Plumbmsg *pm; mag = Mag; if(initdraw(error, 0, "tweak") < 0){ @@ -190,6 +205,7 @@ drawerror(display, "can't allocate image"); } einit(Emouse|Ekeyboard); + eplumb(Eplumb, "imageedit"); eresized(0); i = 1; setjmp(err); @@ -214,6 +230,42 @@ } if(mouse.buttons & 4) menu(); + break; + case Eplumb: + pm = e.v; + if(pm->ndata == 0) + break; + file = malloc(pm->ndata+1); + if(file == 0){ + mesg("malloc failed: %r"); + goto Err; + } + strncpy(file, pm->data, pm->ndata); + file[pm->ndata] = 0; + free(pm->data); + pm->data = file; + switch(pm->data[0]){ + case '/': + file = pm->data; + break; + default: + file = malloc(strlen(pm->wdir) + strlen(pm->data) + 2); + if(file == 0){ + mesg("malloc failed: %r"); + goto Err; + } + + strcpy(file, pm->wdir); + file[strlen(pm->wdir)] = '/'; + strcpy(file+strlen(pm->wdir)+1, pm->data); + } + t = tget(file); + if(t) + drawthing(t, 1); + flushimage(display, 1); + file = 0; + Err: + plumbfree(pm); } } @@ -531,6 +583,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 +615,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);