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);
+ }
}
--
⑨