9front - general discussion about 9front
 help / color / mirror / Atom feed
* [9front] patch: tweak plumb support
@ 2020-12-04 10:30 sirjofri+ml-9front
  2020-12-04 10:47 ` sirjofri+ml-9front
  0 siblings, 1 reply; 9+ messages in thread
From: sirjofri+ml-9front @ 2020-12-04 10:30 UTC (permalink / raw)
  To: 9front

[-- Attachment #1: Type: text/plain, Size: 563 bytes --]

Hello all,

this patch enables basic plumbing in tweak.

Tweak listens to plumb channel 'imageedit' and opens the files (currently only paths are supported, no action=showdata).

Furthermore, while reading data from files a message is printed in the footer and all input events are removed from the stack afterwards. This results in blocked input while loading. Without this adjustment, the image is loaded and every input event is queued until loading is done, resulting in multiple 'open' prompts, for example.

Feel free to test, submit, comment.

sirjofri

.

[-- Attachment #2: Type: text/plain, Size: 2243 bytes --]

diff -r 73caf2698436 sys/src/cmd/tweak.c
--- a/sys/src/cmd/tweak.c	Tue Dec 01 09:23:16 2020 +0100
+++ b/sys/src/cmd/tweak.c	Fri Dec 04 11:23:24 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,7 @@
 int		but1val = 0;
 int		but2val = 255;
 int		invert = 0;
+int		blockinput = 0;
 Image		*values[256];
 Image		*greyvalues[256];
 uchar		data[8192];
@@ -172,11 +176,22 @@
 void	tclose1(Thing*);
 
 void
+flushevents(ulong keys)
+{
+	Event e;
+	if(keys == 0)
+		return;
+	while(ecanread(keys))
+		eread(keys, &e);
+}
+
+void
 main(int argc, char *argv[])
 {
 	int i;
 	Event e;
 	Thing *t;
+	Plumbmsg *pm;
 
 	mag = Mag;
 	if(initdraw(error, 0, "tweak") < 0){
@@ -190,6 +205,7 @@
 			drawerror(display, "can't allocate image");
 	}
 	einit(Emouse|Ekeyboard);
+	eplumb(Eplumb, "imageedit");
 	eresized(0);
 	i = 1;
 	setjmp(err);
@@ -214,6 +230,42 @@
 			}
 			if(mouse.buttons & 4)
 				menu();
+			break;
+		case Eplumb:
+			pm = e.v;
+			if(pm->ndata == 0)
+				break;
+			file = malloc(pm->ndata+1);
+			if(file == 0){
+				mesg("malloc failed: %r");
+				goto Err;
+			}
+			strncpy(file, pm->data, pm->ndata);
+			file[pm->ndata] = 0;
+			free(pm->data);
+			pm->data = file;
+			switch(pm->data[0]){
+			case '/':
+				file = pm->data;
+				break;
+			default:
+				file = malloc(strlen(pm->wdir) + strlen(pm->data) + 2);
+				if(file == 0){
+					mesg("malloc failed: %r");
+					goto Err;
+				}
+	
+				strcpy(file, pm->wdir);
+				file[strlen(pm->wdir)] = '/';
+				strcpy(file+strlen(pm->wdir)+1, pm->data);
+			}
+			t = tget(file);
+			if(t)
+				drawthing(t, 1);
+			flushimage(display, 1);
+			file = 0;
+		   Err:
+			plumbfree(pm);
 		}
 }
 
@@ -531,6 +583,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 +615,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);

^ permalink raw reply	[flat|nested] 9+ messages in thread
* Re: [9front] patch: tweak plumb support
@ 2021-01-12 10:12 sirjofri
  2021-01-13 22:06 ` ori
  0 siblings, 1 reply; 9+ messages in thread
From: sirjofri @ 2021-01-12 10:12 UTC (permalink / raw)
  To: 9front

Hello,

Poke on this. Just a reminder.

sirjofri

.
21.12.2020 16:34:14 sirjofri+ml-9front@sirjofri.de:
> Hey all,
>
> this new patch version has only minor fixes compared to the previous
> version.  After more than a week not working on it I guess I'll just
> release this patch now, hoping it's good enough to be commited.
>
> Still open for improvements and discussion!
>
> sirjofri
>
> .
> 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 Tue Dec 08 15:40:04 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 Tue Dec 08 15:40:04 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 = 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 @@
>       drawerror(display, "can't allocate image");
>   }
>   einit(Emouse|Ekeyboard);
> + eplumb(Eplumb, "imageedit");
>   eresized(0);
>   i = 1;
>   setjmp(err);
> @@ -214,10 +268,42 @@
>       }
>       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)
> {
>   if(file)
> @@ -226,6 +312,7 @@
>     mesg("/dev/bitblt error: %s", s);
>   if(err[0])
>     longjmp(err, 1);
> + cleantmpfiles();
>   exits(s);
> }
>
> @@ -531,6 +618,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 +650,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);
> @@ -2041,6 +2137,7 @@
>     buttons(Down);
>     if(mouse.buttons == 4){
>       buttons(Up);
> +     cleantmpfiles();
>       exits(0);
>     }
>     buttons(Up);

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2021-01-13 22:37 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-04 10:30 [9front] patch: tweak plumb support 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
2020-12-21 15:34           ` sirjofri+ml-9front
2021-01-12 10:12 sirjofri
2021-01-13 22:06 ` ori

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