tweak: support showdata plumb action (thanks sirjofri)

front
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
.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"

View File

@ -3,8 +3,11 @@
#include <draw.h>
#include <cursor.h>
#include <event.h>
#include <plumb.h>
#include <bio.h>
#define Eplumb 128
typedef struct Thing Thing;
struct Thing
@ -157,6 +160,8 @@ int mag;
int but1val = 0;
int but2val = 255;
int invert = 0;
int blockinput = 0;
int tmpindex = 0;
Image *values[256];
Image *greyvalues[256];
uchar data[8192];
@ -171,13 +176,61 @@ void buttons(int);
void drawall(void);
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 @@ main(int argc, char *argv[])
drawerror(display, "can't allocate image");
}
einit(Emouse|Ekeyboard);
eplumb(Eplumb, "imageedit");
eresized(0);
i = 1;
setjmp(err);
@ -214,9 +268,41 @@ main(int argc, char *argv[])
}
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)
{
@ -226,6 +312,7 @@ error(Display*, char *s)
mesg("/dev/bitblt error: %s", s);
if(err[0])
longjmp(err, 1);
cleantmpfiles();
exits(s);
}
@ -531,6 +618,12 @@ drawthing(Thing *nt, int link)
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 @@ tget(char *file)
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 @@ menu(void)
buttons(Down);
if(mouse.buttons == 4){
buttons(Up);
cleantmpfiles();
exits(0);
}
buttons(Up);