mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-12 11:10:07 +00:00
libdraw: connect to devdraw via $wsysid when set
This commit is contained in:
parent
41547af3f6
commit
dbf57689c4
3 changed files with 85 additions and 1 deletions
|
@ -25,6 +25,9 @@ tag[1] Rrdkbd rune[2]
|
||||||
tag[1] Tlabel label[s]
|
tag[1] Tlabel label[s]
|
||||||
tag[1] Rlabel
|
tag[1] Rlabel
|
||||||
|
|
||||||
|
tag[1] Tctxt wsysid[s]
|
||||||
|
tag[1] Rctxt
|
||||||
|
|
||||||
tag[1] Tinit winsize[s] label[s] font[s]
|
tag[1] Tinit winsize[s] label[s] font[s]
|
||||||
tag[1] Rinit
|
tag[1] Rinit
|
||||||
|
|
||||||
|
@ -94,6 +97,8 @@ enum {
|
||||||
Rresize,
|
Rresize,
|
||||||
Tcursor2 = 28,
|
Tcursor2 = 28,
|
||||||
Rcursor2,
|
Rcursor2,
|
||||||
|
Tctxt = 30,
|
||||||
|
Rctxt,
|
||||||
Tmax,
|
Tmax,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -116,6 +121,7 @@ struct Wsysmsg
|
||||||
char *label;
|
char *label;
|
||||||
char *snarf;
|
char *snarf;
|
||||||
char *error;
|
char *error;
|
||||||
|
char *id;
|
||||||
uchar *data;
|
uchar *data;
|
||||||
uint count;
|
uint count;
|
||||||
Rectangle rect;
|
Rectangle rect;
|
||||||
|
|
|
@ -22,11 +22,69 @@ static int canreadfd(int);
|
||||||
int
|
int
|
||||||
_displayconnect(Display *d)
|
_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('W', drawfcallfmt);
|
||||||
fmtinstall('H', encodefmt);
|
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)
|
if(pipe(p) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
if((pid=fork()) < 0){
|
if((pid=fork()) < 0){
|
||||||
|
@ -36,6 +94,10 @@ _displayconnect(Display *d)
|
||||||
}
|
}
|
||||||
if(pid == 0){
|
if(pid == 0){
|
||||||
char *devdraw;
|
char *devdraw;
|
||||||
|
|
||||||
|
devdraw = getenv("DEVDRAW");
|
||||||
|
if(devdraw == nil)
|
||||||
|
devdraw = "devdraw";
|
||||||
close(p[0]);
|
close(p[0]);
|
||||||
dup(p[1], 0);
|
dup(p[1], 0);
|
||||||
dup(p[1], 1);
|
dup(p[1], 1);
|
||||||
|
|
|
@ -51,6 +51,7 @@ sizeW2M(Wsysmsg *m)
|
||||||
case Rcursor2:
|
case Rcursor2:
|
||||||
case Trdkbd:
|
case Trdkbd:
|
||||||
case Rlabel:
|
case Rlabel:
|
||||||
|
case Rctxt:
|
||||||
case Rinit:
|
case Rinit:
|
||||||
case Trdsnarf:
|
case Trdsnarf:
|
||||||
case Rwrsnarf:
|
case Rwrsnarf:
|
||||||
|
@ -74,6 +75,9 @@ sizeW2M(Wsysmsg *m)
|
||||||
return 4+1+1+2;
|
return 4+1+1+2;
|
||||||
case Tlabel:
|
case Tlabel:
|
||||||
return 4+1+1+_stringsize(m->label);
|
return 4+1+1+_stringsize(m->label);
|
||||||
|
case Tctxt:
|
||||||
|
return 4+1+1
|
||||||
|
+_stringsize(m->id);
|
||||||
case Tinit:
|
case Tinit:
|
||||||
return 4+1+1
|
return 4+1+1
|
||||||
+_stringsize(m->winsize)
|
+_stringsize(m->winsize)
|
||||||
|
@ -114,6 +118,7 @@ convW2M(Wsysmsg *m, uchar *p, uint n)
|
||||||
case Rcursor2:
|
case Rcursor2:
|
||||||
case Trdkbd:
|
case Trdkbd:
|
||||||
case Rlabel:
|
case Rlabel:
|
||||||
|
case Rctxt:
|
||||||
case Rinit:
|
case Rinit:
|
||||||
case Trdsnarf:
|
case Trdsnarf:
|
||||||
case Rwrsnarf:
|
case Rwrsnarf:
|
||||||
|
@ -164,6 +169,9 @@ convW2M(Wsysmsg *m, uchar *p, uint n)
|
||||||
case Tlabel:
|
case Tlabel:
|
||||||
PUTSTRING(p+6, m->label);
|
PUTSTRING(p+6, m->label);
|
||||||
break;
|
break;
|
||||||
|
case Tctxt:
|
||||||
|
PUTSTRING(p+6, m->id);
|
||||||
|
break;
|
||||||
case Tinit:
|
case Tinit:
|
||||||
p += 6;
|
p += 6;
|
||||||
p += PUTSTRING(p, m->winsize);
|
p += PUTSTRING(p, m->winsize);
|
||||||
|
@ -214,6 +222,7 @@ convM2W(uchar *p, uint n, Wsysmsg *m)
|
||||||
case Rcursor2:
|
case Rcursor2:
|
||||||
case Trdkbd:
|
case Trdkbd:
|
||||||
case Rlabel:
|
case Rlabel:
|
||||||
|
case Rctxt:
|
||||||
case Rinit:
|
case Rinit:
|
||||||
case Trdsnarf:
|
case Trdsnarf:
|
||||||
case Rwrsnarf:
|
case Rwrsnarf:
|
||||||
|
@ -264,6 +273,9 @@ convM2W(uchar *p, uint n, Wsysmsg *m)
|
||||||
case Tlabel:
|
case Tlabel:
|
||||||
GETSTRING(p+6, &m->label);
|
GETSTRING(p+6, &m->label);
|
||||||
break;
|
break;
|
||||||
|
case Tctxt:
|
||||||
|
GETSTRING(p+6, &m->id);
|
||||||
|
break;
|
||||||
case Tinit:
|
case Tinit:
|
||||||
p += 6;
|
p += 6;
|
||||||
p += GETSTRING(p, &m->winsize);
|
p += GETSTRING(p, &m->winsize);
|
||||||
|
@ -352,6 +364,10 @@ drawfcallfmt(Fmt *fmt)
|
||||||
return fmtprint(fmt, "Tlabel label='%s'", m->label);
|
return fmtprint(fmt, "Tlabel label='%s'", m->label);
|
||||||
case Rlabel:
|
case Rlabel:
|
||||||
return fmtprint(fmt, "Rlabel");
|
return fmtprint(fmt, "Rlabel");
|
||||||
|
case Tctxt:
|
||||||
|
return fmtprint(fmt, "Tctxt id='%s'", m->id);
|
||||||
|
case Rctxt:
|
||||||
|
return fmtprint(fmt, "Rctxt");
|
||||||
case Tinit:
|
case Tinit:
|
||||||
return fmtprint(fmt, "Tinit label='%s' winsize='%s'", m->label, m->winsize);
|
return fmtprint(fmt, "Tinit label='%s' winsize='%s'", m->label, m->winsize);
|
||||||
case Rinit:
|
case Rinit:
|
||||||
|
|
Loading…
Reference in a new issue