tdrawfcall.c - plan9port - [fork] Plan 9 from user space | |
git clone git://src.adamsgaard.dk/plan9port | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
tdrawfcall.c (8403B) | |
--- | |
1 #include <u.h> | |
2 #include <libc.h> | |
3 #include <draw.h> | |
4 #include <mouse.h> | |
5 #include <cursor.h> | |
6 #include <drawfcall.h> | |
7 | |
8 static int | |
9 _stringsize(char *s) | |
10 { | |
11 if(s == nil) | |
12 s = ""; | |
13 return 4+strlen(s); | |
14 } | |
15 | |
16 static int | |
17 PUTSTRING(uchar *p, char *s) | |
18 { | |
19 int n; | |
20 | |
21 if(s == nil) | |
22 s = ""; | |
23 n = strlen(s); | |
24 PUT(p, n); | |
25 memmove(p+4, s, n); | |
26 return n+4; | |
27 } | |
28 | |
29 static int | |
30 GETSTRING(uchar *p, char **s) | |
31 { | |
32 int n; | |
33 | |
34 GET(p, n); | |
35 memmove(p, p+4, n); | |
36 *s = (char*)p; | |
37 p[n] = 0; | |
38 return n+4; | |
39 } | |
40 | |
41 uint | |
42 sizeW2M(Wsysmsg *m) | |
43 { | |
44 switch(m->type){ | |
45 default: | |
46 return 0; | |
47 case Trdmouse: | |
48 case Rbouncemouse: | |
49 case Rmoveto: | |
50 case Rcursor: | |
51 case Rcursor2: | |
52 case Trdkbd: | |
53 case Trdkbd4: | |
54 case Rlabel: | |
55 case Rctxt: | |
56 case Rinit: | |
57 case Trdsnarf: | |
58 case Rwrsnarf: | |
59 case Ttop: | |
60 case Rtop: | |
61 case Rresize: | |
62 return 4+1+1; | |
63 case Rrdmouse: | |
64 return 4+1+1+4+4+4+4+1; | |
65 case Tbouncemouse: | |
66 return 4+1+1+4+4+4; | |
67 case Tmoveto: | |
68 return 4+1+1+4+4; | |
69 case Tcursor: | |
70 return 4+1+1+4+4+2*16+2*16+1; | |
71 case Tcursor2: | |
72 return 4+1+1+4+4+2*16+2*16+4+4+4*32+4*32+1; | |
73 case Rerror: | |
74 return 4+1+1+_stringsize(m->error); | |
75 case Rrdkbd: | |
76 return 4+1+1+2; | |
77 case Rrdkbd4: | |
78 return 4+1+1+4; | |
79 case Tlabel: | |
80 return 4+1+1+_stringsize(m->label); | |
81 case Tctxt: | |
82 return 4+1+1 | |
83 +_stringsize(m->id); | |
84 case Tinit: | |
85 return 4+1+1 | |
86 +_stringsize(m->winsize) | |
87 +_stringsize(m->label); | |
88 case Rrdsnarf: | |
89 case Twrsnarf: | |
90 return 4+1+1+_stringsize(m->snarf); | |
91 case Rrddraw: | |
92 case Twrdraw: | |
93 return 4+1+1+4+m->count; | |
94 case Trddraw: | |
95 case Rwrdraw: | |
96 return 4+1+1+4; | |
97 case Tresize: | |
98 return 4+1+1+4*4; | |
99 } | |
100 } | |
101 | |
102 uint | |
103 convW2M(Wsysmsg *m, uchar *p, uint n) | |
104 { | |
105 int nn; | |
106 | |
107 nn = sizeW2M(m); | |
108 if(n < nn || nn == 0 || n < 6) | |
109 return 0; | |
110 PUT(p, nn); | |
111 p[4] = m->tag; | |
112 p[5] = m->type; | |
113 | |
114 switch(m->type){ | |
115 default: | |
116 return 0; | |
117 case Trdmouse: | |
118 case Rbouncemouse: | |
119 case Rmoveto: | |
120 case Rcursor: | |
121 case Rcursor2: | |
122 case Trdkbd: | |
123 case Trdkbd4: | |
124 case Rlabel: | |
125 case Rctxt: | |
126 case Rinit: | |
127 case Trdsnarf: | |
128 case Rwrsnarf: | |
129 case Ttop: | |
130 case Rtop: | |
131 case Rresize: | |
132 break; | |
133 case Rerror: | |
134 PUTSTRING(p+6, m->error); | |
135 break; | |
136 case Rrdmouse: | |
137 PUT(p+6, m->mouse.xy.x); | |
138 PUT(p+10, m->mouse.xy.y); | |
139 PUT(p+14, m->mouse.buttons); | |
140 PUT(p+18, m->mouse.msec); | |
141 p[19] = m->resized; | |
142 break; | |
143 case Tbouncemouse: | |
144 PUT(p+6, m->mouse.xy.x); | |
145 PUT(p+10, m->mouse.xy.y); | |
146 PUT(p+14, m->mouse.buttons); | |
147 break; | |
148 case Tmoveto: | |
149 PUT(p+6, m->mouse.xy.x); | |
150 PUT(p+10, m->mouse.xy.y); | |
151 break; | |
152 case Tcursor: | |
153 PUT(p+6, m->cursor.offset.x); | |
154 PUT(p+10, m->cursor.offset.y); | |
155 memmove(p+14, m->cursor.clr, sizeof m->cursor.clr); | |
156 memmove(p+46, m->cursor.set, sizeof m->cursor.set); | |
157 p[78] = m->arrowcursor; | |
158 break; | |
159 case Tcursor2: | |
160 PUT(p+6, m->cursor.offset.x); | |
161 PUT(p+10, m->cursor.offset.y); | |
162 memmove(p+14, m->cursor.clr, sizeof m->cursor.clr); | |
163 memmove(p+46, m->cursor.set, sizeof m->cursor.set); | |
164 PUT(p+78, m->cursor2.offset.x); | |
165 PUT(p+82, m->cursor2.offset.y); | |
166 memmove(p+86, m->cursor2.clr, sizeof m->cursor2.clr); | |
167 memmove(p+214, m->cursor2.set, sizeof m->cursor2.set); | |
168 p[342] = m->arrowcursor; | |
169 break; | |
170 case Rrdkbd: | |
171 PUT2(p+6, m->rune); | |
172 break; | |
173 case Rrdkbd4: | |
174 PUT(p+6, m->rune); | |
175 break; | |
176 case Tlabel: | |
177 PUTSTRING(p+6, m->label); | |
178 break; | |
179 case Tctxt: | |
180 PUTSTRING(p+6, m->id); | |
181 break; | |
182 case Tinit: | |
183 p += 6; | |
184 p += PUTSTRING(p, m->winsize); | |
185 p += PUTSTRING(p, m->label); | |
186 break; | |
187 case Rrdsnarf: | |
188 case Twrsnarf: | |
189 PUTSTRING(p+6, m->snarf); | |
190 break; | |
191 case Rrddraw: | |
192 case Twrdraw: | |
193 PUT(p+6, m->count); | |
194 memmove(p+10, m->data, m->count); | |
195 break; | |
196 case Trddraw: | |
197 case Rwrdraw: | |
198 PUT(p+6, m->count); | |
199 break; | |
200 case Tresize: | |
201 PUT(p+6, m->rect.min.x); | |
202 PUT(p+10, m->rect.min.y); | |
203 PUT(p+14, m->rect.max.x); | |
204 PUT(p+18, m->rect.max.y); | |
205 break; | |
206 } | |
207 return nn; | |
208 } | |
209 | |
210 uint | |
211 convM2W(uchar *p, uint n, Wsysmsg *m) | |
212 { | |
213 int nn; | |
214 | |
215 if(n < 6) | |
216 return 0; | |
217 GET(p, nn); | |
218 if(nn > n) | |
219 return 0; | |
220 m->tag = p[4]; | |
221 m->type = p[5]; | |
222 switch(m->type){ | |
223 default: | |
224 return 0; | |
225 case Trdmouse: | |
226 case Rbouncemouse: | |
227 case Rmoveto: | |
228 case Rcursor: | |
229 case Rcursor2: | |
230 case Trdkbd: | |
231 case Trdkbd4: | |
232 case Rlabel: | |
233 case Rctxt: | |
234 case Rinit: | |
235 case Trdsnarf: | |
236 case Rwrsnarf: | |
237 case Ttop: | |
238 case Rtop: | |
239 case Rresize: | |
240 break; | |
241 case Rerror: | |
242 GETSTRING(p+6, &m->error); | |
243 break; | |
244 case Rrdmouse: | |
245 GET(p+6, m->mouse.xy.x); | |
246 GET(p+10, m->mouse.xy.y); | |
247 GET(p+14, m->mouse.buttons); | |
248 GET(p+18, m->mouse.msec); | |
249 m->resized = p[19]; | |
250 break; | |
251 case Tbouncemouse: | |
252 GET(p+6, m->mouse.xy.x); | |
253 GET(p+10, m->mouse.xy.y); | |
254 GET(p+14, m->mouse.buttons); | |
255 break; | |
256 case Tmoveto: | |
257 GET(p+6, m->mouse.xy.x); | |
258 GET(p+10, m->mouse.xy.y); | |
259 break; | |
260 case Tcursor: | |
261 GET(p+6, m->cursor.offset.x); | |
262 GET(p+10, m->cursor.offset.y); | |
263 memmove(m->cursor.clr, p+14, sizeof m->cursor.clr); | |
264 memmove(m->cursor.set, p+46, sizeof m->cursor.set); | |
265 m->arrowcursor = p[78]; | |
266 break; | |
267 case Tcursor2: | |
268 GET(p+6, m->cursor.offset.x); | |
269 GET(p+10, m->cursor.offset.y); | |
270 memmove(m->cursor.clr, p+14, sizeof m->cursor.clr); | |
271 memmove(m->cursor.set, p+46, sizeof m->cursor.set); | |
272 GET(p+78, m->cursor2.offset.x); | |
273 GET(p+82, m->cursor2.offset.y); | |
274 memmove(m->cursor2.clr, p+86, sizeof m->cursor2.clr); | |
275 memmove(m->cursor2.set, p+214, sizeof m->cursor2.set); | |
276 m->arrowcursor = p[342]; | |
277 break; | |
278 case Rrdkbd: | |
279 GET2(p+6, m->rune); | |
280 break; | |
281 case Rrdkbd4: | |
282 GET(p+6, m->rune); | |
283 break; | |
284 case Tlabel: | |
285 GETSTRING(p+6, &m->label); | |
286 break; | |
287 case Tctxt: | |
288 GETSTRING(p+6, &m->id); | |
289 break; | |
290 case Tinit: | |
291 p += 6; | |
292 p += GETSTRING(p, &m->winsize); | |
293 p += GETSTRING(p, &m->label); | |
294 break; | |
295 case Rrdsnarf: | |
296 case Twrsnarf: | |
297 GETSTRING(p+6, &m->snarf); | |
298 break; | |
299 case Rrddraw: | |
300 case Twrdraw: | |
301 GET(p+6, m->count); | |
302 m->data = p+10; | |
303 break; | |
304 case Trddraw: | |
305 case Rwrdraw: | |
306 GET(p+6, m->count); | |
307 break; | |
308 case Tresize: | |
309 GET(p+6, m->rect.min.x); | |
310 GET(p+10, m->rect.min.y); | |
311 GET(p+14, m->rect.max.x); | |
312 GET(p+18, m->rect.max.y); | |
313 break; | |
314 } | |
315 return nn; | |
316 } | |
317 | |
318 int | |
319 readwsysmsg(int fd, uchar *buf, uint nbuf) | |
320 { | |
321 int n; | |
322 | |
323 if(nbuf < 6) | |
324 return -1; | |
325 if(readn(fd, buf, 4) != 4) | |
326 return -1; | |
327 GET(buf, n); | |
328 if(n > nbuf) | |
329 return -1; | |
330 if(readn(fd, buf+4, n-4) != n-4) | |
331 return -1; | |
332 return n; | |
333 } | |
334 | |
335 int | |
336 drawfcallfmt(Fmt *fmt) | |
337 { | |
338 Wsysmsg *m; | |
339 | |
340 m = va_arg(fmt->args, Wsysmsg*); | |
341 fmtprint(fmt, "tag=%d ", m->tag); | |
342 switch(m->type){ | |
343 default: | |
344 return fmtprint(fmt, "unknown msg %d", m->type); | |
345 case Rerror: | |
346 return fmtprint(fmt, "Rerror error='%s'", m->error); | |
347 case Trdmouse: | |
348 return fmtprint(fmt, "Trdmouse"); | |
349 case Rrdmouse: | |
350 return fmtprint(fmt, "Rrdmouse x=%d y=%d buttons=%d msec… | |
351 m->mouse.xy.x, m->mouse.xy.y, | |
352 m->mouse.buttons, m->mouse.msec, m->resized); | |
353 case Tbouncemouse: | |
354 return fmtprint(fmt, "Tbouncemouse x=%d y=%d buttons=%d", | |
355 m->mouse.xy.x, m->mouse.xy.y, m->mouse.buttons); | |
356 case Rbouncemouse: | |
357 return fmtprint(fmt, "Rbouncemouse"); | |
358 case Tmoveto: | |
359 return fmtprint(fmt, "Tmoveto x=%d y=%d", m->mouse.xy.x,… | |
360 case Rmoveto: | |
361 return fmtprint(fmt, "Rmoveto"); | |
362 case Tcursor: | |
363 return fmtprint(fmt, "Tcursor arrow=%d", m->arrowcursor); | |
364 case Tcursor2: | |
365 return fmtprint(fmt, "Tcursor2 arrow=%d", m->arrowcursor… | |
366 case Rcursor: | |
367 return fmtprint(fmt, "Rcursor"); | |
368 case Rcursor2: | |
369 return fmtprint(fmt, "Rcursor2"); | |
370 case Trdkbd: | |
371 return fmtprint(fmt, "Trdkbd"); | |
372 case Rrdkbd: | |
373 return fmtprint(fmt, "Rrdkbd rune=%C", m->rune); | |
374 case Trdkbd4: | |
375 return fmtprint(fmt, "Trdkbd4"); | |
376 case Rrdkbd4: | |
377 return fmtprint(fmt, "Rrdkbd4 rune=%C", m->rune); | |
378 case Tlabel: | |
379 return fmtprint(fmt, "Tlabel label='%s'", m->label); | |
380 case Rlabel: | |
381 return fmtprint(fmt, "Rlabel"); | |
382 case Tctxt: | |
383 return fmtprint(fmt, "Tctxt id='%s'", m->id); | |
384 case Rctxt: | |
385 return fmtprint(fmt, "Rctxt"); | |
386 case Tinit: | |
387 return fmtprint(fmt, "Tinit label='%s' winsize='%s'", m-… | |
388 case Rinit: | |
389 return fmtprint(fmt, "Rinit"); | |
390 case Trdsnarf: | |
391 return fmtprint(fmt, "Trdsnarf"); | |
392 case Rrdsnarf: | |
393 return fmtprint(fmt, "Rrdsnarf snarf='%s'", m->snarf); | |
394 case Twrsnarf: | |
395 return fmtprint(fmt, "Twrsnarf snarf='%s'", m->snarf); | |
396 case Rwrsnarf: | |
397 return fmtprint(fmt, "Rwrsnarf"); | |
398 case Trddraw: | |
399 return fmtprint(fmt, "Trddraw %d", m->count); | |
400 case Rrddraw: | |
401 return fmtprint(fmt, "Rrddraw %d %.*H", m->count, m->cou… | |
402 case Twrdraw: | |
403 return fmtprint(fmt, "Twrdraw %d %.*H", m->count, m->cou… | |
404 case Rwrdraw: | |
405 return fmtprint(fmt, "Rwrdraw %d", m->count); | |
406 case Ttop: | |
407 return fmtprint(fmt, "Ttop"); | |
408 case Rtop: | |
409 return fmtprint(fmt, "Rtop"); | |
410 case Tresize: | |
411 return fmtprint(fmt, "Tresize %R", m->rect); | |
412 case Rresize: | |
413 return fmtprint(fmt, "Rresize"); | |
414 } | |
415 } |