9front - general discussion about 9front
 help / color / mirror / Atom feed
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);

  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).