Commit Diff


commit - 41547af3f614061dd2c94bb52ae118f146925743
commit + dbf57689c45611b8da9e269c24e409ee33a877d5
blob - acab98c5e2aca940fabb72cf5c1d8621ee913a0f
blob + 8b9656d55db5b68c589522f75517bea2fdf1463c
--- include/drawfcall.h
+++ include/drawfcall.h
@@ -25,6 +25,9 @@ tag[1] Rrdkbd rune[2]
 tag[1] Tlabel label[s]
 tag[1] Rlabel 
 
+tag[1] Tctxt wsysid[s]
+tag[1] Rctxt
+
 tag[1] Tinit winsize[s] label[s] font[s]
 tag[1] Rinit
 
@@ -94,6 +97,8 @@ enum {
 	Rresize,
 	Tcursor2 = 28,
 	Rcursor2,
+	Tctxt = 30,
+	Rctxt,
 	Tmax,
 };
 
@@ -116,6 +121,7 @@ struct Wsysmsg
 	char *label;
 	char *snarf;
 	char *error;
+	char *id;
 	uchar *data;
 	uint count;
 	Rectangle rect;
blob - ef0356b8b0d2c38ef83d7b4372f689dd8b68f5fc
blob + 9376f9c00958cf19f755850320077dfe11a96a09
--- src/libdraw/drawclient.c
+++ src/libdraw/drawclient.c
@@ -22,10 +22,68 @@ static int canreadfd(int);
 int
 _displayconnect(Display *d)
 {
-	int pid, p[2];
+	int pid, p[2], fd, nbuf, n;
+	char *wsysid, *addr, *id;
+	uchar *buf;
+	Wsysmsg w;
 
 	fmtinstall('W', drawfcallfmt);
 	fmtinstall('H', encodefmt);
+
+	wsysid = getenv("wsysid");
+	if(wsysid != nil) {
+		// Connect to running devdraw service.
+		// wsysid=devdrawname/id
+		id = strchr(wsysid, '/');
+		if(id == nil) {
+			werrstr("invalid $wsysid");
+			return -1;
+		}
+		*id++ = '\0';
+		addr = smprint("unix!%s/%s", getns(), wsysid);
+		if(addr == nil)
+			return -1;
+		fd = dial(addr, 0, 0, 0);
+		free(addr);
+		if(fd < 0)
+			return -1;
+		nbuf = strlen(id) + 500;
+		buf = malloc(nbuf);
+		if(buf == nil) {
+			close(fd);
+			return -1;
+		}
+		memset(&w, 0, sizeof w);
+		w.type = Tctxt;
+		w.id = id;
+		n = convW2M(&w, buf, nbuf);
+		if(write(fd, buf, n) != n) {
+			close(fd);
+			werrstr("wsys short write: %r");
+			return -1;
+		}
+		n = readwsysmsg(fd, buf, nbuf);
+		if(n < 0) {
+			close(fd);
+			werrstr("wsys short read: %r");
+			return -1;
+		}
+		if(convM2W(buf, n, &w) <= 0) {
+			close(fd);
+			werrstr("wsys decode error");
+			return -1;
+		}
+		if(w.type != Rctxt) {
+			close(fd);
+			if(w.type == Rerror)
+				werrstr("%s", w.error);
+			else
+				werrstr("wsys rpc phase error (%d)", w.type);
+			return -1;
+		}
+		d->srvfd = fd;
+		return 0;
+	}
 
 	if(pipe(p) < 0)
 		return -1;
@@ -36,6 +94,10 @@ _displayconnect(Display *d)
 	}
 	if(pid == 0){
 		char *devdraw;
+
+		devdraw = getenv("DEVDRAW");
+		if(devdraw == nil)
+			devdraw = "devdraw";
 		close(p[0]);
 		dup(p[1], 0);
 		dup(p[1], 1);
blob - c74b3fafb6d22d56d621fee72a74ade97db7ce87
blob + eea140956f54bba15c9d5a34954527879b72752a
--- src/libdraw/drawfcall.c
+++ src/libdraw/drawfcall.c
@@ -51,6 +51,7 @@ sizeW2M(Wsysmsg *m)
 	case Rcursor2:
 	case Trdkbd:
 	case Rlabel:
+	case Rctxt:
 	case Rinit:
 	case Trdsnarf:
 	case Rwrsnarf:
@@ -74,6 +75,9 @@ sizeW2M(Wsysmsg *m)
 		return 4+1+1+2;
 	case Tlabel:
 		return 4+1+1+_stringsize(m->label);
+	case Tctxt:
+		return 4+1+1
+			+_stringsize(m->id);
 	case Tinit:
 		return 4+1+1
 			+_stringsize(m->winsize)
@@ -114,6 +118,7 @@ convW2M(Wsysmsg *m, uchar *p, uint n)
 	case Rcursor2:
 	case Trdkbd:
 	case Rlabel:
+	case Rctxt:
 	case Rinit:
 	case Trdsnarf:
 	case Rwrsnarf:
@@ -163,6 +168,9 @@ convW2M(Wsysmsg *m, uchar *p, uint n)
 		break;
 	case Tlabel:
 		PUTSTRING(p+6, m->label);
+		break;
+	case Tctxt:
+		PUTSTRING(p+6, m->id);
 		break;
 	case Tinit:
 		p += 6;
@@ -214,6 +222,7 @@ convM2W(uchar *p, uint n, Wsysmsg *m)
 	case Rcursor2:
 	case Trdkbd:
 	case Rlabel:
+	case Rctxt:
 	case Rinit:
 	case Trdsnarf:
 	case Rwrsnarf:
@@ -264,6 +273,9 @@ convM2W(uchar *p, uint n, Wsysmsg *m)
 	case Tlabel:
 		GETSTRING(p+6, &m->label);
 		break;
+	case Tctxt:
+		GETSTRING(p+6, &m->id);
+		break;
 	case Tinit:
 		p += 6;
 		p += GETSTRING(p, &m->winsize);
@@ -352,6 +364,10 @@ drawfcallfmt(Fmt *fmt)
 		return fmtprint(fmt, "Tlabel label='%s'", m->label);
 	case Rlabel:
 		return fmtprint(fmt, "Rlabel");
+	case Tctxt:
+		return fmtprint(fmt, "Tctxt id='%s'", m->id);
+	case Rctxt:
+		return fmtprint(fmt, "Rctxt");
 	case Tinit:
 		return fmtprint(fmt, "Tinit label='%s' winsize='%s'", m->label, m->winsize);
 	case Rinit: