]> git.lizzy.rs Git - plan9front.git/commitdiff
tweak: support showdata plumb action (thanks sirjofri)
authorSigrid <ftrvxmtrx@gmail.com>
Sat, 16 Jan 2021 17:30:50 +0000 (18:30 +0100)
committerSigrid <ftrvxmtrx@gmail.com>
Sat, 16 Jan 2021 17:30:50 +0000 (18:30 +0100)
sys/man/1/tweak
sys/src/cmd/tweak.c

index e3f1950384dad3bd4734cb0dd9dae83529bc0a98..0c20e70408c2598d3036023acb9a5aa52fa19193 100644 (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"
index ef42568893634877f6b077a9c6f3e1f48ae74db1..0044686f95a64438e74c9ed444b9c283d11757df 100644 (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);