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