tweak: support showdata plumb action (thanks sirjofri)
This commit is contained in:
parent
58b3f96f98
commit
0f3ef52fd7
2 changed files with 107 additions and 0 deletions
|
@ -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"
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue