tweak: support showdata plumb action (thanks sirjofri)

This commit is contained in:
Sigrid 2021-01-16 18:30:50 +01:00
parent 58b3f96f98
commit 0f3ef52fd7
2 changed files with 107 additions and 0 deletions

View file

@ -155,6 +155,16 @@ If the image is the unmagnified file, also close any magnified views of that fil
Quit Quit
.IR tweak . .IR tweak .
The program will complain once about modified but unwritten files. 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 .SH SOURCE
.B /sys/src/cmd/tweak.c .B /sys/src/cmd/tweak.c
.SH "SEE ALSO" .SH "SEE ALSO"

View file

@ -3,8 +3,11 @@
#include <draw.h> #include <draw.h>
#include <cursor.h> #include <cursor.h>
#include <event.h> #include <event.h>
#include <plumb.h>
#include <bio.h> #include <bio.h>
#define Eplumb 128
typedef struct Thing Thing; typedef struct Thing Thing;
struct Thing struct Thing
@ -157,6 +160,8 @@ int mag;
int but1val = 0; int but1val = 0;
int but2val = 255; int but2val = 255;
int invert = 0; int invert = 0;
int blockinput = 0;
int tmpindex = 0;
Image *values[256]; Image *values[256];
Image *greyvalues[256]; Image *greyvalues[256];
uchar data[8192]; uchar data[8192];
@ -171,13 +176,61 @@ void buttons(int);
void drawall(void); void drawall(void);
void tclose1(Thing*); 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 void
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
int i; int i;
Event e; Event e;
Thing *t; Thing *t;
Plumbmsg *pm;
char *s;
srand(time(0));
mag = Mag; mag = Mag;
if(initdraw(error, 0, "tweak") < 0){ if(initdraw(error, 0, "tweak") < 0){
fprint(2, "tweak: initdraw failed: %r\n"); fprint(2, "tweak: initdraw failed: %r\n");
@ -190,6 +243,7 @@ main(int argc, char *argv[])
drawerror(display, "can't allocate image"); drawerror(display, "can't allocate image");
} }
einit(Emouse|Ekeyboard); einit(Emouse|Ekeyboard);
eplumb(Eplumb, "imageedit");
eresized(0); eresized(0);
i = 1; i = 1;
setjmp(err); setjmp(err);
@ -214,9 +268,41 @@ main(int argc, char *argv[])
} }
if(mouse.buttons & 4) if(mouse.buttons & 4)
menu(); 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 void
error(Display*, char *s) error(Display*, char *s)
{ {
@ -226,6 +312,7 @@ error(Display*, char *s)
mesg("/dev/bitblt error: %s", s); mesg("/dev/bitblt error: %s", s);
if(err[0]) if(err[0])
longjmp(err, 1); longjmp(err, 1);
cleantmpfiles();
exits(s); exits(s);
} }
@ -531,6 +618,12 @@ drawthing(Thing *nt, int link)
nt->tr.max.y = nt->tr.min.y + nl; nt->tr.max.y = nt->tr.min.y + nl;
nt->er.max.y = nt->tr.max.y + Border; nt->er.max.y = nt->tr.max.y + Border;
text(nt); text(nt);
mesg("");
if(blockinput){
flushevents(Emouse|Ekeyboard);
blockinput = 0;
}
} }
int int
@ -557,6 +650,9 @@ tget(char *file)
uchar buf[256]; uchar buf[256];
char *data; char *data;
mesg("reading %s", file);
blockinput = 1;
buf[0] = '\0'; buf[0] = '\0';
errstr((char*)buf, sizeof buf); /* flush pending error message */ errstr((char*)buf, sizeof buf); /* flush pending error message */
memmove(oerr, err, sizeof err); memmove(oerr, err, sizeof err);
@ -2041,6 +2137,7 @@ menu(void)
buttons(Down); buttons(Down);
if(mouse.buttons == 4){ if(mouse.buttons == 4){
buttons(Up); buttons(Up);
cleantmpfiles();
exits(0); exits(0);
} }
buttons(Up); buttons(Up);