drawfcall.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=%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 }