commit - 41547af3f614061dd2c94bb52ae118f146925743
commit + dbf57689c45611b8da9e269c24e409ee33a877d5
blob - acab98c5e2aca940fabb72cf5c1d8621ee913a0f
blob + 8b9656d55db5b68c589522f75517bea2fdf1463c
--- include/drawfcall.h
+++ include/drawfcall.h
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
Rresize,
Tcursor2 = 28,
Rcursor2,
+ Tctxt = 30,
+ Rctxt,
Tmax,
};
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
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;
}
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
case Rcursor2:
case Trdkbd:
case Rlabel:
+ case Rctxt:
case Rinit:
case Trdsnarf:
case Rwrsnarf:
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)
case Rcursor2:
case Trdkbd:
case Rlabel:
+ case Rctxt:
case Rinit:
case Trdsnarf:
case Rwrsnarf:
break;
case Tlabel:
PUTSTRING(p+6, m->label);
+ break;
+ case Tctxt:
+ PUTSTRING(p+6, m->id);
break;
case Tinit:
p += 6;
case Rcursor2:
case Trdkbd:
case Rlabel:
+ case Rctxt:
case Rinit:
case Trdsnarf:
case Rwrsnarf:
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);
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: