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 Trdkbd:
52 case Rlabel:
53 case Rinit:
54 case Trdsnarf:
55 case Rwrsnarf:
56 case Ttop:
57 case Rtop:
58 case Rresize:
59 return 4+1+1;
60 case Rrdmouse:
61 return 4+1+1+4+4+4+4+1;
62 case Tbouncemouse:
63 return 4+1+1+4+4+4;
64 case Tmoveto:
65 return 4+1+1+4+4;
66 case Tcursor:
67 return 4+1+1+4+4+2*16+2*16+1;
68 case Rerror:
69 return 4+1+1+_stringsize(m->error);
70 case Rrdkbd:
71 return 4+1+1+2;
72 case Tlabel:
73 return 4+1+1+_stringsize(m->label);
74 case Tinit:
75 return 4+1+1
76 +_stringsize(m->winsize)
77 +_stringsize(m->label);
78 case Rrdsnarf:
79 case Twrsnarf:
80 return 4+1+1+_stringsize(m->snarf);
81 case Rrddraw:
82 case Twrdraw:
83 return 4+1+1+4+m->count;
84 case Trddraw:
85 case Rwrdraw:
86 return 4+1+1+4;
87 case Tresize:
88 return 4+1+1+4*4;
89 }
90 }
92 uint
93 convW2M(Wsysmsg *m, uchar *p, uint n)
94 {
95 int nn;
97 nn = sizeW2M(m);
98 if(n < nn || nn == 0 || n < 6)
99 return 0;
100 PUT(p, nn);
101 p[4] = m->tag;
102 p[5] = m->type;
104 switch(m->type){
105 default:
106 return 0;
107 case Trdmouse:
108 case Rbouncemouse:
109 case Rmoveto:
110 case Rcursor:
111 case Trdkbd:
112 case Rlabel:
113 case Rinit:
114 case Trdsnarf:
115 case Rwrsnarf:
116 case Ttop:
117 case Rtop:
118 case Rresize:
119 break;
120 case Rerror:
121 PUTSTRING(p+6, m->error);
122 break;
123 case Rrdmouse:
124 PUT(p+6, m->mouse.xy.x);
125 PUT(p+10, m->mouse.xy.y);
126 PUT(p+14, m->mouse.buttons);
127 PUT(p+18, m->mouse.msec);
128 p[19] = m->resized;
129 break;
130 case Tbouncemouse:
131 PUT(p+6, m->mouse.xy.x);
132 PUT(p+10, m->mouse.xy.y);
133 PUT(p+14, m->mouse.buttons);
134 break;
135 case Tmoveto:
136 PUT(p+6, m->mouse.xy.x);
137 PUT(p+10, m->mouse.xy.y);
138 break;
139 case Tcursor:
140 PUT(p+6, m->cursor.offset.x);
141 PUT(p+10, m->cursor.offset.y);
142 memmove(p+14, m->cursor.clr, sizeof m->cursor.clr);
143 memmove(p+46, m->cursor.set, sizeof m->cursor.set);
144 p[78] = m->arrowcursor;
145 break;
146 case Rrdkbd:
147 PUT2(p+6, m->rune);
148 break;
149 case Tlabel:
150 PUTSTRING(p+6, m->label);
151 break;
152 case Tinit:
153 p += 6;
154 p += PUTSTRING(p, m->winsize);
155 p += PUTSTRING(p, m->label);
156 break;
157 case Rrdsnarf:
158 case Twrsnarf:
159 PUTSTRING(p+6, m->snarf);
160 break;
161 case Rrddraw:
162 case Twrdraw:
163 PUT(p+6, m->count);
164 memmove(p+10, m->data, m->count);
165 break;
166 case Trddraw:
167 case Rwrdraw:
168 PUT(p+6, m->count);
169 break;
170 case Tresize:
171 PUT(p+6, m->rect.min.x);
172 PUT(p+10, m->rect.min.y);
173 PUT(p+14, m->rect.max.x);
174 PUT(p+18, m->rect.max.y);
175 break;
177 return nn;
180 uint
181 convM2W(uchar *p, uint n, Wsysmsg *m)
183 int nn;
185 if(n < 6)
186 return 0;
187 GET(p, nn);
188 if(nn > n)
189 return 0;
190 m->tag = p[4];
191 m->type = p[5];
192 switch(m->type){
193 default:
194 return 0;
195 case Trdmouse:
196 case Rbouncemouse:
197 case Rmoveto:
198 case Rcursor:
199 case Trdkbd:
200 case Rlabel:
201 case Rinit:
202 case Trdsnarf:
203 case Rwrsnarf:
204 case Ttop:
205 case Rtop:
206 case Rresize:
207 break;
208 case Rerror:
209 GETSTRING(p+6, &m->error);
210 break;
211 case Rrdmouse:
212 GET(p+6, m->mouse.xy.x);
213 GET(p+10, m->mouse.xy.y);
214 GET(p+14, m->mouse.buttons);
215 GET(p+18, m->mouse.msec);
216 m->resized = p[19];
217 break;
218 case Tbouncemouse:
219 GET(p+6, m->mouse.xy.x);
220 GET(p+10, m->mouse.xy.y);
221 GET(p+14, m->mouse.buttons);
222 break;
223 case Tmoveto:
224 GET(p+6, m->mouse.xy.x);
225 GET(p+10, m->mouse.xy.y);
226 break;
227 case Tcursor:
228 GET(p+6, m->cursor.offset.x);
229 GET(p+10, m->cursor.offset.y);
230 memmove(m->cursor.clr, p+14, sizeof m->cursor.clr);
231 memmove(m->cursor.set, p+46, sizeof m->cursor.set);
232 m->arrowcursor = p[78];
233 break;
234 case Rrdkbd:
235 GET2(p+6, m->rune);
236 break;
237 case Tlabel:
238 GETSTRING(p+6, &m->label);
239 break;
240 case Tinit:
241 p += 6;
242 p += GETSTRING(p, &m->winsize);
243 p += GETSTRING(p, &m->label);
244 break;
245 case Rrdsnarf:
246 case Twrsnarf:
247 GETSTRING(p+6, &m->snarf);
248 break;
249 case Rrddraw:
250 case Twrdraw:
251 GET(p+6, m->count);
252 m->data = p+10;
253 break;
254 case Trddraw:
255 case Rwrdraw:
256 GET(p+6, m->count);
257 break;
258 case Tresize:
259 GET(p+6, m->rect.min.x);
260 GET(p+10, m->rect.min.y);
261 GET(p+14, m->rect.max.x);
262 GET(p+18, m->rect.max.y);
263 break;
265 return nn;
268 int
269 readwsysmsg(int fd, uchar *buf, uint nbuf)
271 int n;
273 if(nbuf < 6)
274 return -1;
275 if(readn(fd, buf, 4) != 4)
276 return -1;
277 GET(buf, n);
278 if(n > nbuf)
279 return -1;
280 if(readn(fd, buf+4, n-4) != n-4)
281 return -1;
282 return n;
285 int
286 drawfcallfmt(Fmt *fmt)
288 Wsysmsg *m;
290 m = va_arg(fmt->args, Wsysmsg*);
291 fmtprint(fmt, "tag=%d ", m->tag);
292 switch(m->type){
293 default:
294 return fmtprint(fmt, "unknown msg %d", m->type);
295 case Rerror:
296 return fmtprint(fmt, "Rerror error='%s'", m->error);
297 case Trdmouse:
298 return fmtprint(fmt, "Trdmouse");
299 case Rrdmouse:
300 return fmtprint(fmt, "Rrdmouse x=%d y=%d buttons=%d msec=%d resized=%d",
301 m->mouse.xy.x, m->mouse.xy.y,
302 m->mouse.buttons, m->mouse.msec, m->resized);
303 case Tbouncemouse:
304 return fmtprint(fmt, "Tbouncemouse x=%d y=%d buttons=%d",
305 m->mouse.xy.x, m->mouse.xy.y, m->mouse.buttons);
306 case Rbouncemouse:
307 return fmtprint(fmt, "Rbouncemouse");
308 case Tmoveto:
309 return fmtprint(fmt, "Tmoveto x=%d y=%d", m->mouse.xy.x, m->mouse.xy.y);
310 case Rmoveto:
311 return fmtprint(fmt, "Rmoveto");
312 case Tcursor:
313 return fmtprint(fmt, "Tcursor arrow=%d", m->arrowcursor);
314 case Rcursor:
315 return fmtprint(fmt, "Rcursor");
316 case Trdkbd:
317 return fmtprint(fmt, "Trdkbd");
318 case Rrdkbd:
319 return fmtprint(fmt, "Rrdkbd rune=%C", m->rune);
320 case Tlabel:
321 return fmtprint(fmt, "Tlabel label='%s'", m->label);
322 case Rlabel:
323 return fmtprint(fmt, "Rlabel");
324 case Tinit:
325 return fmtprint(fmt, "Tinit label='%s' winsize='%s'", m->label, m->winsize);
326 case Rinit:
327 return fmtprint(fmt, "Rinit");
328 case Trdsnarf:
329 return fmtprint(fmt, "Trdsnarf");
330 case Rrdsnarf:
331 return fmtprint(fmt, "Rrdsnarf snarf='%s'", m->snarf);
332 case Twrsnarf:
333 return fmtprint(fmt, "Twrsnarf snarf='%s'", m->snarf);
334 case Rwrsnarf:
335 return fmtprint(fmt, "Rwrsnarf");
336 case Trddraw:
337 return fmtprint(fmt, "Trddraw %d", m->count);
338 case Rrddraw:
339 return fmtprint(fmt, "Rrddraw %d %.*H", m->count, m->count, m->data);
340 case Twrdraw:
341 return fmtprint(fmt, "Twrdraw %d %.*H", m->count, m->count, m->data);
342 case Rwrdraw:
343 return fmtprint(fmt, "Rwrdraw %d", m->count);
344 case Ttop:
345 return fmtprint(fmt, "Ttop");
346 case Rtop:
347 return fmtprint(fmt, "Rtop");
348 case Tresize:
349 return fmtprint(fmt, "Tresize %R", m->rect);
350 case Rresize:
351 return fmtprint(fmt, "Rresize");