URI:
       tdrawfcall.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tdrawfcall.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 }