From: sirjofri+ml-9front@sirjofri.de
To: 9front@9front.org
Subject: Re: [9front] patch: tweak plumb support
Date: Mon, 07 Dec 2020 21:26:34 +0100 [thread overview]
Message-ID: <DACAF7F21957A42D9986FA6B72317231@sirjofri.de> (raw)
In-Reply-To: <BB61CF73F57F046491F302C46570C266@eigenstate.org>
[-- Attachment #1: Type: text/plain, Size: 1154 bytes --]
Hey all,
> I wonder if this'd better be done with a more complex plumb rule,
I'm currently working on some kind of "plumb channel selector menu".
The general mechanics work as expected, I'm on fine tuning. I'll
present it when it's done (although I already showed a little on
discord).
> I don't think leaving trash in /tmp is really acceptable :/
>
> + file = smprint("/tmp/tweaktmp.%d", rand());
>
> Use the pid, that way you know nobody else is using it,
> and you can get rid of the retry loop.
yep, done. I got lots of feedback by kvik (very much thank you!) who
already pointed that out.
The now included patch considers kviks annotations, roughly:
- moves plumb message handling to two separate functions (showdata and
filenames)
- cleanup /tmp-files on exit
- better filename creation with %.*s (although I still think basic
filename handling should/could be included in plumb.h, many
applications need to deal with plumb filename messages).
- fd == 0 is a valid file descriptor. Changed to fd < 0
I hope this looks better now. I verified it worked using showdata
plumbs as well as file plumbs, and tmpfile cleanup.
sirjofri
.
[-- Attachment #2: Type: text/plain, Size: 3597 bytes --]
diff -r 2647ea8b9793 sys/man/1/tweak
--- a/sys/man/1/tweak Sun Dec 06 21:52:01 2020 +0100
+++ b/sys/man/1/tweak Mon Dec 07 21:17:12 2020 +0100
@@ -155,6 +155,16 @@
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"
diff -r 2647ea8b9793 sys/src/cmd/tweak.c
--- a/sys/src/cmd/tweak.c Sun Dec 06 21:52:01 2020 +0100
+++ b/sys/src/cmd/tweak.c Mon Dec 07 21:17:12 2020 +0100
@@ -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 but1val = 0;
int but2val = 255;
int invert = 0;
+int blockinput = 0;
+int tmpindex = 0;
Image *values[256];
Image *greyvalues[256];
uchar data[8192];
@@ -172,12 +177,60 @@
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 = cleanname(smprint("%.*s", pm->ndata, pm->data));
+ else
+ file = cleanname(smprint("%s/%.*s", pm->wdir, pm->ndata, pm->data));
+ return 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 @@
drawerror(display, "can't allocate image");
}
einit(Emouse|Ekeyboard);
+ eplumb(Eplumb, "imageedit");
eresized(0);
i = 1;
setjmp(err);
@@ -214,6 +268,27 @@
}
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;
}
}
@@ -531,6 +606,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 +638,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);
@@ -1992,6 +2076,17 @@
}
void
+cleantmpfiles(void)
+{
+ char *s;
+ for(tmpindex--; tmpindex >= 0; tmpindex--){
+ s = smprint("/tmp/tweaktmp.%d.%d", getpid(), tmpindex);
+ remove(s);
+ free(s);
+ }
+}
+
+void
menu(void)
{
Thing *t;
@@ -2041,6 +2136,7 @@
buttons(Down);
if(mouse.buttons == 4){
buttons(Up);
+ cleantmpfiles();
exits(0);
}
buttons(Up);
next prev parent reply other threads:[~2020-12-07 20:29 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-04 10:30 sirjofri+ml-9front
2020-12-04 10:47 ` sirjofri+ml-9front
2020-12-05 15:13 ` sirjofri+ml-9front
2020-12-07 9:44 ` sirjofri+ml-9front
2020-12-07 15:43 ` ori
2020-12-07 20:26 ` sirjofri+ml-9front [this message]
2020-12-21 15:34 ` sirjofri+ml-9front
2021-01-12 10:12 sirjofri
2021-01-13 22:06 ` ori
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=DACAF7F21957A42D9986FA6B72317231@sirjofri.de \
--to=sirjofri+ml-9front@sirjofri.de \
--cc=9front@9front.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).