Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <mouse.h>
5 #include <cursor.h>
6 #include <drawfcall.h>
8 static int
9 _stringsize(char *s)
10 {
11 if(s == nil)
12 s = "";
13 return 4+strlen(s);
14 }
16 static int
17 PUTSTRING(uchar *p, char *s)
18 {
19 int n;
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 }
29 static int
30 GETSTRING(uchar *p, char **s)
31 {
32 int n;
34 GET(p, n);
35 memmove(p, p+4, n);
36 *s = (char*)p;
37 p[n] = 0;
38 return n+4;
39 }
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 }
102 uint
103 convW2M(Wsysmsg *m, uchar *p, uint n)
105 int nn;
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;
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;
207 return nn;
210 uint
211 convM2W(uchar *p, uint n, Wsysmsg *m)
213 int nn;
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;
315 return nn;
318 int
319 readwsysmsg(int fd, uchar *buf, uint nbuf)
321 int n;
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;
335 int
336 drawfcallfmt(Fmt *fmt)
338 Wsysmsg *m;
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=%d resized=%d",
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, m->mouse.xy.y);
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->label, m->winsize);
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->count, m->data);
402 case Twrdraw:
403 return fmtprint(fmt, "Twrdraw %d %.*H", m->count, m->count, m->data);
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");