Blame


1 257fb626 2006-06-25 devnull /* Copyright (c) 2006 Russ Cox */
2 257fb626 2006-06-25 devnull
3 257fb626 2006-06-25 devnull #include <u.h>
4 150f8802 2006-06-25 devnull #include <sys/select.h>
5 257fb626 2006-06-25 devnull #include <libc.h>
6 257fb626 2006-06-25 devnull #include <draw.h>
7 257fb626 2006-06-25 devnull #include <mouse.h>
8 257fb626 2006-06-25 devnull #include <cursor.h>
9 257fb626 2006-06-25 devnull #include <drawfcall.h>
10 257fb626 2006-06-25 devnull #include <mux.h>
11 257fb626 2006-06-25 devnull
12 257fb626 2006-06-25 devnull int chattydrawclient;
13 257fb626 2006-06-25 devnull
14 257fb626 2006-06-25 devnull static int drawgettag(Mux *mux, void *vmsg);
15 257fb626 2006-06-25 devnull static void* drawrecv(Mux *mux);
16 150f8802 2006-06-25 devnull static void* drawnbrecv(Mux *mux);
17 257fb626 2006-06-25 devnull static int drawsend(Mux *mux, void *vmsg);
18 257fb626 2006-06-25 devnull static int drawsettag(Mux *mux, void *vmsg, uint tag);
19 150f8802 2006-06-25 devnull static int canreadfd(int);
20 257fb626 2006-06-25 devnull
21 257fb626 2006-06-25 devnull int
22 257fb626 2006-06-25 devnull _displayconnect(Display *d)
23 257fb626 2006-06-25 devnull {
24 257fb626 2006-06-25 devnull int pid, p[2];
25 257fb626 2006-06-25 devnull
26 257fb626 2006-06-25 devnull fmtinstall('W', drawfcallfmt);
27 257fb626 2006-06-25 devnull fmtinstall('H', encodefmt);
28 257fb626 2006-06-25 devnull
29 257fb626 2006-06-25 devnull if(pipe(p) < 0)
30 257fb626 2006-06-25 devnull return -1;
31 257fb626 2006-06-25 devnull if((pid=fork()) < 0){
32 257fb626 2006-06-25 devnull close(p[0]);
33 257fb626 2006-06-25 devnull close(p[1]);
34 257fb626 2006-06-25 devnull return -1;
35 257fb626 2006-06-25 devnull }
36 257fb626 2006-06-25 devnull if(pid == 0){
37 257fb626 2006-06-25 devnull close(p[0]);
38 257fb626 2006-06-25 devnull dup(p[1], 0);
39 257fb626 2006-06-25 devnull dup(p[1], 1);
40 257fb626 2006-06-25 devnull /* execl("strace", "strace", "-o", "drawsrv.out", "drawsrv", nil); */
41 150f8802 2006-06-25 devnull execl("devdraw", "devdraw", nil);
42 150f8802 2006-06-25 devnull sysfatal("exec devdraw: %r");
43 257fb626 2006-06-25 devnull }
44 257fb626 2006-06-25 devnull close(p[1]);
45 257fb626 2006-06-25 devnull d->srvfd = p[0];
46 257fb626 2006-06-25 devnull return 0;
47 257fb626 2006-06-25 devnull }
48 257fb626 2006-06-25 devnull
49 257fb626 2006-06-25 devnull int
50 257fb626 2006-06-25 devnull _displaymux(Display *d)
51 257fb626 2006-06-25 devnull {
52 257fb626 2006-06-25 devnull if((d->mux = mallocz(sizeof(*d->mux), 1)) == nil)
53 257fb626 2006-06-25 devnull return -1;
54 257fb626 2006-06-25 devnull
55 257fb626 2006-06-25 devnull d->mux->mintag = 1;
56 257fb626 2006-06-25 devnull d->mux->maxtag = 255;
57 257fb626 2006-06-25 devnull d->mux->send = drawsend;
58 257fb626 2006-06-25 devnull d->mux->recv = drawrecv;
59 150f8802 2006-06-25 devnull d->mux->nbrecv = drawnbrecv;
60 257fb626 2006-06-25 devnull d->mux->gettag = drawgettag;
61 257fb626 2006-06-25 devnull d->mux->settag = drawsettag;
62 257fb626 2006-06-25 devnull d->mux->aux = d;
63 257fb626 2006-06-25 devnull muxinit(d->mux);
64 257fb626 2006-06-25 devnull
65 257fb626 2006-06-25 devnull return 0;
66 257fb626 2006-06-25 devnull }
67 257fb626 2006-06-25 devnull
68 257fb626 2006-06-25 devnull static int
69 257fb626 2006-06-25 devnull drawsend(Mux *mux, void *vmsg)
70 257fb626 2006-06-25 devnull {
71 257fb626 2006-06-25 devnull int n;
72 257fb626 2006-06-25 devnull uchar *msg;
73 257fb626 2006-06-25 devnull Display *d;
74 257fb626 2006-06-25 devnull
75 257fb626 2006-06-25 devnull msg = vmsg;
76 257fb626 2006-06-25 devnull GET(msg, n);
77 257fb626 2006-06-25 devnull d = mux->aux;
78 257fb626 2006-06-25 devnull return write(d->srvfd, msg, n);
79 257fb626 2006-06-25 devnull }
80 257fb626 2006-06-25 devnull
81 257fb626 2006-06-25 devnull static void*
82 150f8802 2006-06-25 devnull _drawrecv(Mux *mux, int nb)
83 257fb626 2006-06-25 devnull {
84 257fb626 2006-06-25 devnull int n;
85 257fb626 2006-06-25 devnull uchar buf[4], *p;
86 257fb626 2006-06-25 devnull Display *d;
87 150f8802 2006-06-25 devnull
88 257fb626 2006-06-25 devnull d = mux->aux;
89 150f8802 2006-06-25 devnull if(nb && !canreadfd(d->srvfd))
90 257fb626 2006-06-25 devnull return nil;
91 150f8802 2006-06-25 devnull if((n=readn(d->srvfd, buf, 4)) != 4)
92 150f8802 2006-06-25 devnull return nil;
93 257fb626 2006-06-25 devnull GET(buf, n);
94 257fb626 2006-06-25 devnull p = malloc(n);
95 257fb626 2006-06-25 devnull if(p == nil){
96 257fb626 2006-06-25 devnull fprint(2, "out of memory allocating %d in drawrecv\n", n);
97 257fb626 2006-06-25 devnull return nil;
98 257fb626 2006-06-25 devnull }
99 257fb626 2006-06-25 devnull memmove(p, buf, 4);
100 150f8802 2006-06-25 devnull if(readn(d->srvfd, p+4, n-4) != n-4)
101 257fb626 2006-06-25 devnull return nil;
102 257fb626 2006-06-25 devnull return p;
103 257fb626 2006-06-25 devnull }
104 257fb626 2006-06-25 devnull
105 150f8802 2006-06-25 devnull static void*
106 150f8802 2006-06-25 devnull drawrecv(Mux *mux)
107 150f8802 2006-06-25 devnull {
108 150f8802 2006-06-25 devnull return _drawrecv(mux, 0);
109 150f8802 2006-06-25 devnull }
110 150f8802 2006-06-25 devnull
111 150f8802 2006-06-25 devnull static void*
112 150f8802 2006-06-25 devnull drawnbrecv(Mux *mux)
113 150f8802 2006-06-25 devnull {
114 150f8802 2006-06-25 devnull return _drawrecv(mux, 1);
115 150f8802 2006-06-25 devnull }
116 150f8802 2006-06-25 devnull
117 257fb626 2006-06-25 devnull static int
118 257fb626 2006-06-25 devnull drawgettag(Mux *mux, void *vmsg)
119 257fb626 2006-06-25 devnull {
120 257fb626 2006-06-25 devnull USED(mux);
121 257fb626 2006-06-25 devnull uchar *msg;
122 257fb626 2006-06-25 devnull
123 257fb626 2006-06-25 devnull msg = vmsg;
124 257fb626 2006-06-25 devnull return msg[4];
125 257fb626 2006-06-25 devnull }
126 257fb626 2006-06-25 devnull
127 257fb626 2006-06-25 devnull static int
128 257fb626 2006-06-25 devnull drawsettag(Mux *mux, void *vmsg, uint tag)
129 257fb626 2006-06-25 devnull {
130 257fb626 2006-06-25 devnull USED(mux);
131 257fb626 2006-06-25 devnull uchar *msg;
132 257fb626 2006-06-25 devnull
133 257fb626 2006-06-25 devnull msg = vmsg;
134 257fb626 2006-06-25 devnull msg[4] = tag;
135 257fb626 2006-06-25 devnull return 0;
136 257fb626 2006-06-25 devnull }
137 257fb626 2006-06-25 devnull
138 257fb626 2006-06-25 devnull static int
139 257fb626 2006-06-25 devnull displayrpc(Display *d, Wsysmsg *tx, Wsysmsg *rx, void **freep)
140 257fb626 2006-06-25 devnull {
141 257fb626 2006-06-25 devnull int n, nn;
142 257fb626 2006-06-25 devnull void *tpkt, *rpkt;
143 257fb626 2006-06-25 devnull
144 257fb626 2006-06-25 devnull n = sizeW2M(tx);
145 257fb626 2006-06-25 devnull tpkt = malloc(n);
146 257fb626 2006-06-25 devnull if(freep)
147 257fb626 2006-06-25 devnull *freep = nil;
148 257fb626 2006-06-25 devnull if(tpkt == nil)
149 257fb626 2006-06-25 devnull return -1;
150 257fb626 2006-06-25 devnull tx->tag = 0;
151 257fb626 2006-06-25 devnull if(chattydrawclient)
152 257fb626 2006-06-25 devnull fprint(2, "<- %W\n", tx);
153 257fb626 2006-06-25 devnull nn = convW2M(tx, tpkt, n);
154 257fb626 2006-06-25 devnull if(nn != n){
155 257fb626 2006-06-25 devnull free(tpkt);
156 257fb626 2006-06-25 devnull werrstr("drawclient: sizeW2M convW2M mismatch");
157 257fb626 2006-06-25 devnull fprint(2, "%r\n");
158 257fb626 2006-06-25 devnull return -1;
159 257fb626 2006-06-25 devnull }
160 257fb626 2006-06-25 devnull rpkt = muxrpc(d->mux, tpkt);
161 257fb626 2006-06-25 devnull free(tpkt);
162 257fb626 2006-06-25 devnull if(rpkt == nil){
163 257fb626 2006-06-25 devnull werrstr("muxrpc: %r");
164 257fb626 2006-06-25 devnull return -1;
165 257fb626 2006-06-25 devnull }
166 257fb626 2006-06-25 devnull GET((uchar*)rpkt, n);
167 257fb626 2006-06-25 devnull nn = convM2W(rpkt, n, rx);
168 257fb626 2006-06-25 devnull if(nn != n){
169 257fb626 2006-06-25 devnull free(rpkt);
170 257fb626 2006-06-25 devnull werrstr("drawclient: convM2W packet size mismatch %d %d %.*H", n, nn, n, rpkt);
171 257fb626 2006-06-25 devnull fprint(2, "%r\n");
172 257fb626 2006-06-25 devnull return -1;
173 257fb626 2006-06-25 devnull }
174 257fb626 2006-06-25 devnull if(chattydrawclient)
175 257fb626 2006-06-25 devnull fprint(2, "-> %W\n", rx);
176 257fb626 2006-06-25 devnull if(rx->type == Rerror){
177 257fb626 2006-06-25 devnull werrstr("%s", rx->error);
178 257fb626 2006-06-25 devnull free(rpkt);
179 257fb626 2006-06-25 devnull return -1;
180 257fb626 2006-06-25 devnull }
181 257fb626 2006-06-25 devnull if(rx->type != tx->type+1){
182 257fb626 2006-06-25 devnull werrstr("packet type mismatch -- tx %d rx %d",
183 257fb626 2006-06-25 devnull tx->type, rx->type);
184 257fb626 2006-06-25 devnull free(rpkt);
185 257fb626 2006-06-25 devnull return -1;
186 257fb626 2006-06-25 devnull }
187 257fb626 2006-06-25 devnull if(freep)
188 257fb626 2006-06-25 devnull *freep = rpkt;
189 257fb626 2006-06-25 devnull else
190 257fb626 2006-06-25 devnull free(rpkt);
191 257fb626 2006-06-25 devnull return 0;
192 257fb626 2006-06-25 devnull }
193 257fb626 2006-06-25 devnull
194 257fb626 2006-06-25 devnull int
195 257fb626 2006-06-25 devnull _displayinit(Display *d, char *label, char *winsize)
196 257fb626 2006-06-25 devnull {
197 257fb626 2006-06-25 devnull Wsysmsg tx, rx;
198 257fb626 2006-06-25 devnull
199 257fb626 2006-06-25 devnull tx.type = Tinit;
200 150f8802 2006-06-25 devnull tx.label = label;
201 150f8802 2006-06-25 devnull tx.winsize = winsize;
202 257fb626 2006-06-25 devnull return displayrpc(d, &tx, &rx, nil);
203 257fb626 2006-06-25 devnull }
204 257fb626 2006-06-25 devnull
205 257fb626 2006-06-25 devnull int
206 257fb626 2006-06-25 devnull _displayrdmouse(Display *d, Mouse *m, int *resized)
207 257fb626 2006-06-25 devnull {
208 257fb626 2006-06-25 devnull Wsysmsg tx, rx;
209 257fb626 2006-06-25 devnull
210 257fb626 2006-06-25 devnull tx.type = Trdmouse;
211 257fb626 2006-06-25 devnull if(displayrpc(d, &tx, &rx, nil) < 0)
212 257fb626 2006-06-25 devnull return -1;
213 257fb626 2006-06-25 devnull *m = rx.mouse;
214 257fb626 2006-06-25 devnull *resized = rx.resized;
215 257fb626 2006-06-25 devnull return 0;
216 257fb626 2006-06-25 devnull }
217 257fb626 2006-06-25 devnull
218 257fb626 2006-06-25 devnull int
219 257fb626 2006-06-25 devnull _displayrdkbd(Display *d, Rune *r)
220 257fb626 2006-06-25 devnull {
221 257fb626 2006-06-25 devnull Wsysmsg tx, rx;
222 257fb626 2006-06-25 devnull
223 257fb626 2006-06-25 devnull tx.type = Trdkbd;
224 257fb626 2006-06-25 devnull if(displayrpc(d, &tx, &rx, nil) < 0)
225 257fb626 2006-06-25 devnull return -1;
226 257fb626 2006-06-25 devnull *r = rx.rune;
227 257fb626 2006-06-25 devnull return 0;
228 257fb626 2006-06-25 devnull }
229 257fb626 2006-06-25 devnull
230 257fb626 2006-06-25 devnull int
231 257fb626 2006-06-25 devnull _displaymoveto(Display *d, Point p)
232 257fb626 2006-06-25 devnull {
233 257fb626 2006-06-25 devnull Wsysmsg tx, rx;
234 257fb626 2006-06-25 devnull
235 257fb626 2006-06-25 devnull tx.type = Tmoveto;
236 257fb626 2006-06-25 devnull tx.mouse.xy = p;
237 257fb626 2006-06-25 devnull return displayrpc(d, &tx, &rx, nil);
238 257fb626 2006-06-25 devnull }
239 257fb626 2006-06-25 devnull
240 257fb626 2006-06-25 devnull int
241 257fb626 2006-06-25 devnull _displaycursor(Display *d, Cursor *c)
242 257fb626 2006-06-25 devnull {
243 257fb626 2006-06-25 devnull Wsysmsg tx, rx;
244 257fb626 2006-06-25 devnull
245 257fb626 2006-06-25 devnull tx.type = Tcursor;
246 257fb626 2006-06-25 devnull if(c == nil){
247 257fb626 2006-06-25 devnull memset(&tx.cursor, 0, sizeof tx.cursor);
248 257fb626 2006-06-25 devnull tx.arrowcursor = 1;
249 257fb626 2006-06-25 devnull }else{
250 257fb626 2006-06-25 devnull tx.arrowcursor = 0;
251 257fb626 2006-06-25 devnull tx.cursor = *c;
252 257fb626 2006-06-25 devnull }
253 257fb626 2006-06-25 devnull return displayrpc(d, &tx, &rx, nil);
254 257fb626 2006-06-25 devnull }
255 257fb626 2006-06-25 devnull
256 257fb626 2006-06-25 devnull int
257 257fb626 2006-06-25 devnull _displaybouncemouse(Display *d, Mouse *m)
258 257fb626 2006-06-25 devnull {
259 257fb626 2006-06-25 devnull Wsysmsg tx, rx;
260 257fb626 2006-06-25 devnull
261 257fb626 2006-06-25 devnull tx.type = Tbouncemouse;
262 257fb626 2006-06-25 devnull tx.mouse = *m;
263 257fb626 2006-06-25 devnull return displayrpc(d, &tx, &rx, nil);
264 257fb626 2006-06-25 devnull }
265 257fb626 2006-06-25 devnull
266 257fb626 2006-06-25 devnull int
267 257fb626 2006-06-25 devnull _displaylabel(Display *d, char *label)
268 257fb626 2006-06-25 devnull {
269 257fb626 2006-06-25 devnull Wsysmsg tx, rx;
270 257fb626 2006-06-25 devnull
271 257fb626 2006-06-25 devnull tx.type = Tlabel;
272 257fb626 2006-06-25 devnull tx.label = label;
273 257fb626 2006-06-25 devnull return displayrpc(d, &tx, &rx, nil);
274 257fb626 2006-06-25 devnull }
275 257fb626 2006-06-25 devnull
276 257fb626 2006-06-25 devnull char*
277 257fb626 2006-06-25 devnull _displayrdsnarf(Display *d)
278 257fb626 2006-06-25 devnull {
279 257fb626 2006-06-25 devnull void *p;
280 257fb626 2006-06-25 devnull char *s;
281 257fb626 2006-06-25 devnull Wsysmsg tx, rx;
282 257fb626 2006-06-25 devnull
283 257fb626 2006-06-25 devnull tx.type = Trdsnarf;
284 257fb626 2006-06-25 devnull if(displayrpc(d, &tx, &rx, &p) < 0)
285 257fb626 2006-06-25 devnull return nil;
286 257fb626 2006-06-25 devnull s = strdup(rx.snarf);
287 257fb626 2006-06-25 devnull free(p);
288 257fb626 2006-06-25 devnull return s;
289 257fb626 2006-06-25 devnull }
290 257fb626 2006-06-25 devnull
291 257fb626 2006-06-25 devnull int
292 257fb626 2006-06-25 devnull _displaywrsnarf(Display *d, char *snarf)
293 257fb626 2006-06-25 devnull {
294 257fb626 2006-06-25 devnull Wsysmsg tx, rx;
295 257fb626 2006-06-25 devnull
296 257fb626 2006-06-25 devnull tx.type = Twrsnarf;
297 257fb626 2006-06-25 devnull tx.snarf = snarf;
298 257fb626 2006-06-25 devnull return displayrpc(d, &tx, &rx, nil);
299 257fb626 2006-06-25 devnull }
300 257fb626 2006-06-25 devnull
301 257fb626 2006-06-25 devnull int
302 257fb626 2006-06-25 devnull _displayrddraw(Display *d, void *v, int n)
303 257fb626 2006-06-25 devnull {
304 257fb626 2006-06-25 devnull void *p;
305 257fb626 2006-06-25 devnull Wsysmsg tx, rx;
306 257fb626 2006-06-25 devnull
307 257fb626 2006-06-25 devnull tx.type = Trddraw;
308 257fb626 2006-06-25 devnull tx.count = n;
309 257fb626 2006-06-25 devnull if(displayrpc(d, &tx, &rx, &p) < 0)
310 257fb626 2006-06-25 devnull return -1;
311 257fb626 2006-06-25 devnull memmove(v, rx.data, rx.count);
312 257fb626 2006-06-25 devnull free(p);
313 257fb626 2006-06-25 devnull return rx.count;
314 257fb626 2006-06-25 devnull }
315 257fb626 2006-06-25 devnull
316 257fb626 2006-06-25 devnull int
317 257fb626 2006-06-25 devnull _displaywrdraw(Display *d, void *v, int n)
318 257fb626 2006-06-25 devnull {
319 257fb626 2006-06-25 devnull Wsysmsg tx, rx;
320 257fb626 2006-06-25 devnull
321 257fb626 2006-06-25 devnull tx.type = Twrdraw;
322 257fb626 2006-06-25 devnull tx.count = n;
323 257fb626 2006-06-25 devnull tx.data = v;
324 257fb626 2006-06-25 devnull if(displayrpc(d, &tx, &rx, nil) < 0)
325 257fb626 2006-06-25 devnull return -1;
326 257fb626 2006-06-25 devnull return rx.count;
327 257fb626 2006-06-25 devnull }
328 257fb626 2006-06-25 devnull
329 257fb626 2006-06-25 devnull int
330 257fb626 2006-06-25 devnull _displaytop(Display *d)
331 257fb626 2006-06-25 devnull {
332 257fb626 2006-06-25 devnull Wsysmsg tx, rx;
333 257fb626 2006-06-25 devnull
334 257fb626 2006-06-25 devnull tx.type = Ttop;
335 257fb626 2006-06-25 devnull return displayrpc(d, &tx, &rx, nil);
336 257fb626 2006-06-25 devnull }
337 257fb626 2006-06-25 devnull
338 257fb626 2006-06-25 devnull int
339 257fb626 2006-06-25 devnull _displayresize(Display *d, Rectangle r)
340 257fb626 2006-06-25 devnull {
341 257fb626 2006-06-25 devnull Wsysmsg tx, rx;
342 257fb626 2006-06-25 devnull
343 257fb626 2006-06-25 devnull tx.type = Tresize;
344 257fb626 2006-06-25 devnull tx.rect = r;
345 257fb626 2006-06-25 devnull return displayrpc(d, &tx, &rx, nil);
346 257fb626 2006-06-25 devnull }
347 257fb626 2006-06-25 devnull
348 150f8802 2006-06-25 devnull static int
349 150f8802 2006-06-25 devnull canreadfd(int fd)
350 150f8802 2006-06-25 devnull {
351 150f8802 2006-06-25 devnull fd_set rs, ws, xs;
352 150f8802 2006-06-25 devnull struct timeval tv;
353 150f8802 2006-06-25 devnull
354 150f8802 2006-06-25 devnull FD_ZERO(&rs);
355 150f8802 2006-06-25 devnull FD_ZERO(&ws);
356 150f8802 2006-06-25 devnull FD_ZERO(&xs);
357 150f8802 2006-06-25 devnull FD_SET(fd, &rs);
358 150f8802 2006-06-25 devnull FD_SET(fd, &xs);
359 150f8802 2006-06-25 devnull tv.tv_sec = 0;
360 150f8802 2006-06-25 devnull tv.tv_usec = 0;
361 150f8802 2006-06-25 devnull if(select(fd+1, &rs, &ws, &xs, &tv) < 0)
362 150f8802 2006-06-25 devnull return 0;
363 150f8802 2006-06-25 devnull if(FD_ISSET(fd, &rs) || FD_ISSET(fd, &xs))
364 150f8802 2006-06-25 devnull return 1;
365 150f8802 2006-06-25 devnull return 0;
366 150f8802 2006-06-25 devnull }
367 150f8802 2006-06-25 devnull