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
_stringsize(char * s)9 _stringsize(char *s)
10 {
11 	if(s == nil)
12 		s = "";
13 	return 4+strlen(s);
14 }
15 
16 static int
PUTSTRING(uchar * p,char * s)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
GETSTRING(uchar * p,char ** s)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
sizeW2M(Wsysmsg * m)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
convW2M(Wsysmsg * m,uchar * p,uint n)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
convM2W(uchar * p,uint n,Wsysmsg * m)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
readwsysmsg(int fd,uchar * buf,uint nbuf)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
drawfcallfmt(Fmt * fmt)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=%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");
414 	}
415 }
416