plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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 }