shithub: drawfs

Download patch

ref: d831cb7c1deb4699a6465eb76cca5c5158233325
parent: 15fb95683835a788826d0826f28e88fcd68ea85d
author: sirjofri <sirjofri@sirjofri.de>
date: Mon Jan 6 18:08:04 EST 2025

first working drawmgr prototype, readme

--- /dev/null
+++ b/Readme.md
@@ -1,0 +1,31 @@
+# drawfs
+
+**This project is in early development stages. Expect lots of bugs!**
+
+## Usage notes
+
+### Run drawfs
+
+- It's best to just use `cd drawfs && t.rc`, but you can do it manually:
+- `cd drawfs`
+- `X.out -n test`
+- `mount /srv/drawfs.test /dev`
+- run a graphical program, tested with `clock`
+
+### Run drawmgr in a separate window
+
+- `cd drawmgr`
+- `X.out -n test`
+- for now, 'q' and 'Del' exit the program
+- 'r' is supposed to refresh the screen manually
+
+## Planned features
+
+- `mousefs`: mouse(3) replacement
+- `consfs`: limited cons(3) replacement, for keyboard input
+- maybe more
+
+## Known Bugs
+
+- only one and the first drawfs client can connect
+- after drawing, the screen image isn't updated
--- a/drawmgr/drawmgr.c
+++ b/drawmgr/drawmgr.c
@@ -1,6 +1,8 @@
 #include <u.h>
 #include <libc.h>
 #include <draw.h>
+#include <event.h>
+#include <keyboard.h>
 
 void
 usage(void)
@@ -10,9 +12,23 @@
 }
 
 int drawdispfd;
-int drawcmdfd;
 
 void
+refreshimage(void)
+{
+	Image *timg;
+	
+	seek(drawdispfd, 0, 0);
+	timg = readimage(display, drawdispfd, 0);
+	if (!timg) {
+		fprint(2, "refreshimage: %r\n");
+		return;
+	}
+	draw(screen, rectaddpt(timg->r, screen->r.min), timg, nil, ZP);
+	freeimage(timg);
+}
+
+void
 eresized(int new)
 {
 	Image *tmpimg;
@@ -22,6 +38,7 @@
 	if (new && getwindow(display, Refnone) < 0)
 		sysfatal("can't reattach to window: %r");
 	
+	/*
 	size.x = Dx(screen->r);
 	size.y = Dy(screen->r);
 	
@@ -29,19 +46,52 @@
 	BPLONG(buf+1, size.x);
 	BPLONG(buf+5, size.y);
 	write(drawcmdfd, buf, 1+4+4);
+	*/
 	
-	seek(drawdispfd, 0, 0);
-	tmpimg = readimage(display, drawdispfd, 0);
-	if (!tmpimg)
-		sysfatal("%r");
-	draw(screen, screen->r, tmpimg, nil, ZP);
-	freeimage(tmpimg);
+	refreshimage();
 }
 
 void
-main(int argc, char **argv)
+initdrawfs(char *name)
 {
 	char file[256];
+	int drawfd;
+	
+	if (strlen(name) + strlen("/srv/drawfs..cmd") + 2 > 256)
+		sysfatal("error: name too long: %s\n", name);
+	
+	snprint(file, sizeof file, "/srv/drawfs.%s.cmd", name);
+	drawfd = open(file, ORDWR);
+	if (drawfd < 0)
+		sysfatal("drawfs: %r");
+	if (mount(drawfd, -1, "/mnt/drawcmd", MREPL, "") < 0)
+		sysfatal("mount drawfs: %r");
+	
+	drawdispfd = open("/mnt/drawcmd/display", OREAD);
+	if (drawdispfd < 0)
+		sysfatal("display file: %r");
+}
+
+int
+keyinput(Event *ev)
+{
+	switch (ev->kbdc) {
+	case Kdel:
+	case 'q':
+		return 1;
+	case 'r':
+		refreshimage();
+		break;
+	}
+	return 0;
+}
+
+void
+main(int argc, char **argv)
+{
+	Event ev;
+	int e;
+	
 	char *name = nil;
 	
 	ARGBEGIN{
@@ -56,21 +106,25 @@
 	if (!name || !name[0])
 		usage();
 	
-	if (strlen(name) + strlen("/srv/drawfs..display") + 2 > 256)
-		sysfatal("error: name too long: %s\n", name);
+	rfork(RFNAMEG);
 	
-	snprint(file, sizeof file, "/srv/drawfs.%s.display", name);
-	drawdispfd = open(file, OREAD);
-	if (drawdispfd < 0)
-		sysfatal("%r");
+	initdrawfs(name);
 	
-	snprint(file, sizeof file, "/srv/drawfs.%s.cmd", name);
-	drawcmdfd = open(file, ORDWR);
-	if (drawcmdfd < 0)
-		sysfatal("%r");
-	
 	if (initdraw(nil, nil, "drawmgr") < 0)
 		sysfatal("initdraw: %r");
 	
+	einit(Emouse|Ekeyboard);
+	
 	eresized(0);
+	
+	for (;;) {
+		e = event(&ev);
+		switch (e) {
+		case Ekeyboard:
+			if (keyinput(&ev))
+				exits(nil);
+			break;
+		}
+		eresized(0);
+	}
 }
--