aboutsummaryrefslogtreecommitdiff
path: root/src/libdraw/drawfcall.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libdraw/drawfcall.c')
-rw-r--r--src/libdraw/drawfcall.c367
1 files changed, 367 insertions, 0 deletions
diff --git a/src/libdraw/drawfcall.c b/src/libdraw/drawfcall.c
new file mode 100644
index 00000000..09a54f91
--- /dev/null
+++ b/src/libdraw/drawfcall.c
@@ -0,0 +1,367 @@
+#include <u.h>
+#include <libc.h>
+#include <draw.h>
+#include <mouse.h>
+#include <cursor.h>
+#include <drawfcall.h>
+
+#define PUT(p, x) \
+ (p)[0] = ((x) >> 24)&0xFF, \
+ (p)[1] = ((x) >> 16)&0xFF, \
+ (p)[2] = ((x) >> 8)&0xFF, \
+ (p)[3] = (x)&0xFF
+
+#define GET(p, x) \
+ ((x) = (((p)[0] << 24) | ((p)[1] << 16) | ((p)[2] << 8) | ((p)[3])))
+
+#define PUT2(p, x) \
+ (p)[0] = ((x) >> 8)&0xFF, \
+ (p)[1] = (x)&0xFF
+
+#define GET2(p, x) \
+ ((x) = (((p)[0] << 8) | ((p)[1])))
+
+static int
+_stringsize(char *s)
+{
+ return 4+strlen(s);
+}
+
+static int
+PUTSTRING(uchar *p, char *s)
+{
+ int n;
+
+ if(s == nil)
+ s = "";
+ n = strlen(s);
+ PUT(p, n);
+ memmove(p+4, s, n);
+ return n+4;
+}
+
+static int
+GETSTRING(uchar *p, char **s)
+{
+ int n;
+
+ GET(p, n);
+ memmove(p, p+4, n);
+ *s = (char*)p;
+ p[n] = 0;
+ return n+4;
+}
+
+uint
+sizeW2M(Wsysmsg *m)
+{
+ switch(m->type){
+ default:
+ return 0;
+ case Trdmouse:
+ case Rbouncemouse:
+ case Rmoveto:
+ case Rcursor:
+ case Trdkbd:
+ case Rlabel:
+ case Rinit:
+ case Trdsnarf:
+ case Rwrsnarf:
+ case Ttop:
+ case Rtop:
+ case Rresize:
+ return 4+1+1;
+ case Rrdmouse:
+ return 4+1+1+4+4+4+4+1;
+ case Tbouncemouse:
+ return 4+1+1+4+4+4;
+ case Tmoveto:
+ return 4+1+1+4+4;
+ case Tcursor:
+ return 4+1+1+4+4+2*16+2*16+1;
+ case Rerror:
+ return 4+1+1+_stringsize(m->error);
+ case Rrdkbd:
+ return 4+1+1+2;
+ case Tlabel:
+ return 4+1+1+_stringsize(m->label);
+ case Tinit:
+ return 4+1+1
+ +_stringsize(m->winsize)
+ +_stringsize(m->label);
+ case Rrdsnarf:
+ case Twrsnarf:
+ return 4+1+1+_stringsize(m->snarf);
+ case Rrddraw:
+ case Twrdraw:
+ return 4+1+1+4+m->count;
+ case Trddraw:
+ case Rwrdraw:
+ return 4+1+1+4;
+ case Tresize:
+ return 4+1+1+4*4;
+ }
+}
+
+uint
+convW2M(Wsysmsg *m, uchar *p, uint n)
+{
+ int nn;
+
+ nn = sizeW2M(m);
+ if(n < nn || nn == 0 || n < 6)
+ return 0;
+ PUT(p, nn);
+ p[4] = m->tag;
+ p[5] = m->type;
+
+ switch(m->type){
+ default:
+ return 0;
+ case Trdmouse:
+ case Rbouncemouse:
+ case Rmoveto:
+ case Rcursor:
+ case Trdkbd:
+ case Rlabel:
+ case Rinit:
+ case Trdsnarf:
+ case Rwrsnarf:
+ case Ttop:
+ case Rtop:
+ case Rresize:
+ break;
+ case Rerror:
+ PUTSTRING(p+6, m->error);
+ break;
+ case Rrdmouse:
+ PUT(p+6, m->mouse.xy.x);
+ PUT(p+10, m->mouse.xy.y);
+ PUT(p+14, m->mouse.buttons);
+ PUT(p+18, m->mouse.msec);
+ p[19] = m->resized;
+ break;
+ case Tbouncemouse:
+ PUT(p+6, m->mouse.xy.x);
+ PUT(p+10, m->mouse.xy.y);
+ PUT(p+14, m->mouse.buttons);
+ break;
+ case Tmoveto:
+ PUT(p+6, m->mouse.xy.x);
+ PUT(p+10, m->mouse.xy.y);
+ break;
+ case Tcursor:
+ PUT(p+6, m->cursor.offset.x);
+ PUT(p+10, m->cursor.offset.y);
+ memmove(p+14, m->cursor.clr, sizeof m->cursor.clr);
+ memmove(p+46, m->cursor.set, sizeof m->cursor.set);
+ p[78] = m->arrowcursor;
+ break;
+ case Rrdkbd:
+ PUT2(p+6, m->rune);
+ break;
+ case Tlabel:
+ PUTSTRING(p+6, m->label);
+ break;
+ case Tinit:
+ p += 6;
+ p += PUTSTRING(p, m->winsize);
+ p += PUTSTRING(p, m->label);
+ break;
+ case Rrdsnarf:
+ case Twrsnarf:
+ PUTSTRING(p+6, m->snarf);
+ break;
+ case Rrddraw:
+ case Twrdraw:
+ PUT(p+6, m->count);
+ memmove(p+10, m->data, m->count);
+ break;
+ case Trddraw:
+ case Rwrdraw:
+ PUT(p+6, m->count);
+ break;
+ case Tresize:
+ PUT(p+6, m->rect.min.x);
+ PUT(p+10, m->rect.min.y);
+ PUT(p+14, m->rect.max.x);
+ PUT(p+18, m->rect.max.y);
+ break;
+ }
+ return nn;
+}
+
+uint
+convM2W(uchar *p, uint n, Wsysmsg *m)
+{
+ int nn;
+
+ if(n < 6)
+ return 0;
+ GET(p, nn);
+ if(nn > n)
+ return 0;
+ m->tag = p[4];
+ m->type = p[5];
+ switch(m->type){
+ default:
+ return 0;
+ case Trdmouse:
+ case Rbouncemouse:
+ case Rmoveto:
+ case Rcursor:
+ case Trdkbd:
+ case Rlabel:
+ case Rinit:
+ case Trdsnarf:
+ case Rwrsnarf:
+ case Ttop:
+ case Rtop:
+ case Rresize:
+ break;
+ case Rerror:
+ GETSTRING(p+6, &m->error);
+ break;
+ case Rrdmouse:
+ GET(p+6, m->mouse.xy.x);
+ GET(p+10, m->mouse.xy.y);
+ GET(p+14, m->mouse.buttons);
+ GET(p+18, m->mouse.msec);
+ m->resized = p[19];
+ break;
+ case Tbouncemouse:
+ GET(p+6, m->mouse.xy.x);
+ GET(p+10, m->mouse.xy.y);
+ GET(p+14, m->mouse.buttons);
+ break;
+ case Tmoveto:
+ GET(p+6, m->mouse.xy.x);
+ GET(p+10, m->mouse.xy.y);
+ break;
+ case Tcursor:
+ GET(p+6, m->cursor.offset.x);
+ GET(p+10, m->cursor.offset.y);
+ memmove(m->cursor.clr, p+14, sizeof m->cursor.clr);
+ memmove(m->cursor.set, p+46, sizeof m->cursor.set);
+ m->arrowcursor = p[78];
+ break;
+ case Rrdkbd:
+ GET2(p+6, m->rune);
+ break;
+ case Tlabel:
+ GETSTRING(p+6, &m->label);
+ break;
+ case Tinit:
+ p += 6;
+ p += GETSTRING(p, &m->winsize);
+ p += GETSTRING(p, &m->label);
+ break;
+ case Rrdsnarf:
+ case Twrsnarf:
+ GETSTRING(p+6, &m->snarf);
+ break;
+ case Rrddraw:
+ case Twrdraw:
+ GET(p+6, m->count);
+ m->data = p+10;
+ break;
+ case Trddraw:
+ case Rwrdraw:
+ GET(p+6, m->count);
+ break;
+ case Tresize:
+ GET(p+6, m->rect.min.x);
+ GET(p+10, m->rect.min.y);
+ GET(p+14, m->rect.max.x);
+ GET(p+18, m->rect.max.y);
+ break;
+ }
+ return nn;
+}
+
+int
+readwsysmsg(int fd, uchar *buf, uint nbuf)
+{
+ int n;
+
+ if(nbuf < 6)
+ return -1;
+ if(readn(fd, buf, 4) != 4)
+ return -1;
+ GET(buf, n);
+ if(n > nbuf)
+ return -1;
+ if(readn(fd, buf+4, n-4) != n-4)
+ return -1;
+ return n;
+}
+
+int
+drawfcallfmt(Fmt *fmt)
+{
+ Wsysmsg *m;
+
+ m = va_arg(fmt->args, Wsysmsg*);
+ fmtprint(fmt, "tag=%d ", m->tag);
+ switch(m->type){
+ default:
+ return fmtprint(fmt, "unknown msg %d", m->type);
+ case Rerror:
+ return fmtprint(fmt, "Rerror error='%s'", m->error);
+ case Trdmouse:
+ return fmtprint(fmt, "Trdmouse");
+ case Rrdmouse:
+ return fmtprint(fmt, "Rrdmouse x=%d y=%d buttons=%d msec=%d resized=%d",
+ m->mouse.xy.x, m->mouse.xy.y,
+ m->mouse.buttons, m->mouse.msec, m->resized);
+ case Tbouncemouse:
+ return fmtprint(fmt, "Tbouncemouse x=%d y=%d buttons=%d",
+ m->mouse.xy.x, m->mouse.xy.y, m->mouse.buttons);
+ case Rbouncemouse:
+ return fmtprint(fmt, "Rbouncemouse");
+ case Tmoveto:
+ return fmtprint(fmt, "Tmoveto x=%d y=%d", m->mouse.xy.x, m->mouse.xy.y);
+ case Rmoveto:
+ return fmtprint(fmt, "Rmoveto");
+ case Tcursor:
+ return fmtprint(fmt, "Tcursor arrow=%d", m->arrowcursor);
+ case Rcursor:
+ return fmtprint(fmt, "Rcursor");
+ case Trdkbd:
+ return fmtprint(fmt, "Trdkbd");
+ case Rrdkbd:
+ return fmtprint(fmt, "Rrdkbd rune=%C", m->rune);
+ case Tlabel:
+ return fmtprint(fmt, "Tlabel label='%s'", m->label);
+ case Rlabel:
+ return fmtprint(fmt, "Rlabel");
+ case Tinit:
+ return fmtprint(fmt, "Tinit label='%s' winsize='%s'", m->label, m->winsize);
+ case Rinit:
+ return fmtprint(fmt, "Rinit");
+ case Trdsnarf:
+ return fmtprint(fmt, "Trdsnarf");
+ case Rrdsnarf:
+ return fmtprint(fmt, "Rrdsnarf snarf='%s'", m->snarf);
+ case Twrsnarf:
+ return fmtprint(fmt, "Twrsnarf snarf='%s'", m->snarf);
+ case Rwrsnarf:
+ return fmtprint(fmt, "Rwrsnarf");
+ case Trddraw:
+ return fmtprint(fmt, "Trddraw %d", m->count);
+ case Rrddraw:
+ return fmtprint(fmt, "Rrddraw %d %.*H", m->count, m->count, m->data);
+ case Twrdraw:
+ return fmtprint(fmt, "Twrdraw %d %.*H", m->count, m->count, m->data);
+ case Rwrdraw:
+ return fmtprint(fmt, "Rwrdraw %d", m->count);
+ case Ttop:
+ return fmtprint(fmt, "Ttop");
+ case Rtop:
+ return fmtprint(fmt, "Rtop");
+ case Tresize:
+ return fmtprint(fmt, "Tresize %R", m->rect);
+ case Rresize:
+ return fmtprint(fmt, "Rresize");
+ }
+}