Commit Diff


commit - 9af9ceca26596d562a3ae89fda70bad9f8822ab0
commit + 8581c2b56763d7787604c8c833d2bd78bdc6a466
blob - d53baf81d840fdda6054baeb569183dfb8ba5113
blob + e39d2ea5898cf8112564fe506b4df49534d63daf
--- include/cursor.h
+++ include/cursor.h
@@ -12,6 +12,16 @@ struct	Cursor
 	uchar	set[2*16];
 };
 
+typedef struct Cursor2 Cursor2;
+struct	Cursor2
+{
+	Point	offset;
+	uchar	clr[4*32];
+	uchar	set[4*32];
+};
+
+void	scalecursor(Cursor2*, Cursor*);
+
 #if defined(__cplusplus)
 }
 #endif
blob - 3a012959f6edd579c69f0ddb4ffd3a4c7ebd6f3a
blob + 2f283bdf1d711a2fc07285992ad45aa6cb0b549e
--- include/draw.h
+++ include/draw.h
@@ -568,9 +568,10 @@ int	mousescrollsize(int);
  */
 struct Mouse;
 struct Cursor;
+struct Cursor2;
 int		_displaybouncemouse(Display *d, struct Mouse *m);
 int		_displayconnect(Display *d);
-int		_displaycursor(Display *d, struct Cursor *c);
+int		_displaycursor(Display *d, struct Cursor *c, struct Cursor2 *c2);
 int		_displayinit(Display *d, char *label, char *winsize);
 int		_displaylabel(Display *d, char *label);
 int		_displaymoveto(Display *d, Point p);
blob - fb339919d17807e14215faad87753424f0bb160e
blob + acab98c5e2aca940fabb72cf5c1d8621ee913a0f
--- include/drawfcall.h
+++ include/drawfcall.h
@@ -13,6 +13,9 @@ tag[1] Rmoveto
 tag[1] Tcursor cursor[]
 tag[1] Rcursor
 
+tag[1] Tcursor2 cursor[]
+tag[1] Rcursor2
+
 tag[1] Tbouncemouse x[4] y[4] button[4]
 tag[1] Rbouncemouse
 
@@ -89,6 +92,8 @@ enum {
 	Rtop,
 	Tresize = 26,
 	Rresize,
+	Tcursor2 = 28,
+	Rcursor2,
 	Tmax,
 };
 
@@ -104,6 +109,7 @@ struct Wsysmsg
 	Mouse mouse;
 	int resized;
 	Cursor cursor;
+	Cursor2 cursor2;
 	int arrowcursor;
 	Rune rune;
 	char *winsize;
blob - 09cb5c78c01438250ccaf83d984d785809006368
blob + e66bf1173aaf3e2db9711f8091931a3bebc7d5ec
--- include/event.h
+++ include/event.h
@@ -61,7 +61,9 @@ extern int	 emenuhit(int, Mouse*, Menu*);
 extern int	eatomouse(Mouse*, char*, int);
 extern Rectangle	getrect(int, Mouse*);
 struct Cursor;
+struct Cursor2;
 extern void	 esetcursor(struct Cursor*);
+extern void	 esetcursor2(struct Cursor*, struct Cursor2*);
 extern void	 emoveto(Point);
 extern Rectangle	egetrect(int, Mouse*);
 extern void		edrawgetrect(Rectangle, int);
blob - 3d5c975fe452796d089434d66f0424fd4da1340f
blob + c46d51e92cfc29d938be27bc422ec2721bd14a1e
--- include/mouse.h
+++ include/mouse.h
@@ -38,7 +38,9 @@ extern void		moveto(Mousectl*, Point);
 extern int			readmouse(Mousectl*);
 extern void		closemouse(Mousectl*);
 struct Cursor;
+struct Cursor2;
 extern void		setcursor(Mousectl*, struct Cursor*);
+extern void		setcursor2(Mousectl*, struct Cursor*, struct Cursor2*);
 extern void		drawgetrect(Rectangle, int);
 extern Rectangle	getrect(int, Mousectl*);
 extern int	 		menuhit(int, Mousectl*, Menu*, Screen*);
blob - /dev/null
blob + 58f447b131d668c3ba6e912902653b17780697ed (mode 644)
--- /dev/null
+++ src/libdraw/cursor.c
@@ -0,0 +1,32 @@
+#include <u.h>
+#include <libc.h>
+#include <draw.h>
+#include <cursor.h>
+
+static uint8 expand[16] = {
+	0x00, 0x03, 0x0c, 0x0f,
+	0x30, 0x33, 0x3c, 0x3f,
+	0xc0, 0xc3, 0xcc, 0xcf,
+	0xf0, 0xf3, 0xfc, 0xff,
+};
+
+void
+scalecursor(Cursor2 *c2, Cursor *c)
+{
+	int y;
+
+	c2->offset.x = 2*c->offset.x;
+	c2->offset.y = 2*c->offset.y;
+	memset(c2->clr, 0, sizeof c2->clr);
+	memset(c2->set, 0, sizeof c2->set);
+	for(y = 0; y < 16; y++) {
+		c2->clr[8*y] = c2->clr[8*y+4] = expand[c->clr[2*y]>>4];
+		c2->set[8*y] = c2->set[8*y+4] = expand[c->set[2*y]>>4];
+		c2->clr[8*y+1] = c2->clr[8*y+5] = expand[c->clr[2*y]&15];
+		c2->set[8*y+1] = c2->set[8*y+5] = expand[c->set[2*y]&15];
+		c2->clr[8*y+2] = c2->clr[8*y+6] = expand[c->clr[2*y+1]>>4];
+		c2->set[8*y+2] = c2->set[8*y+6] = expand[c->set[2*y+1]>>4];
+		c2->clr[8*y+3] = c2->clr[8*y+7] = expand[c->clr[2*y+1]&15];
+		c2->set[8*y+3] = c2->set[8*y+7] = expand[c->set[2*y+1]&15];
+	}
+}
blob - f0c0943005f021b6165e14ccc661f696ec732a5a
blob + de20d3a3b4cde330ffdcf1a4fe5766af776f0d2f
--- src/libdraw/drawclient.c
+++ src/libdraw/drawclient.c
@@ -292,17 +292,22 @@ _displaymoveto(Display *d, Point p)
 }
 
 int
-_displaycursor(Display *d, Cursor *c)
+_displaycursor(Display *d, Cursor *c, Cursor2 *c2)
 {
 	Wsysmsg tx, rx;
 	
 	tx.type = Tcursor;
 	if(c == nil){
 		memset(&tx.cursor, 0, sizeof tx.cursor);
+		memset(&tx.cursor2, 0, sizeof tx.cursor2);
 		tx.arrowcursor = 1;
 	}else{
 		tx.arrowcursor = 0;
 		tx.cursor = *c;
+		if(c2 != nil)
+			tx.cursor2 = *c2;
+		else
+			scalecursor(&tx.cursor2, c);
 	}
 	return displayrpc(d, &tx, &rx, nil);
 }
blob - e2d3c642f629e4a373cd7e8ab912f04fc454d558
blob + e36413b6547c1ace2f8fad12ea4d0de32da0503f
--- src/libdraw/drawfcall.c
+++ src/libdraw/drawfcall.c
@@ -64,7 +64,7 @@ sizeW2M(Wsysmsg *m)
 	case Tmoveto:
 		return 4+1+1+4+4;
 	case Tcursor:
-		return 4+1+1+4+4+2*16+2*16+1;
+		return 4+1+1+4+4+2*16+2*16+4+4+4*32+4*32+1;
 	case Rerror:
 		return 4+1+1+_stringsize(m->error);
 	case Rrdkbd:
@@ -141,7 +141,11 @@ convW2M(Wsysmsg *m, uchar *p, uint n)
 		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;
+		PUT(p+78, m->cursor2.offset.x);
+		PUT(p+82, m->cursor2.offset.y);
+		memmove(p+86, m->cursor2.clr, sizeof m->cursor2.clr);
+		memmove(p+214, m->cursor2.set, sizeof m->cursor2.set);
+		p[342] = m->arrowcursor;
 		break;
 	case Rrdkbd:
 		PUT2(p+6, m->rune);
@@ -229,7 +233,11 @@ convM2W(uchar *p, uint n, Wsysmsg *m)
 		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];
+		GET(p+78, m->cursor2.offset.x);
+		GET(p+82, m->cursor2.offset.y);
+		memmove(m->cursor2.clr, p+86, sizeof m->cursor2.clr);
+		memmove(m->cursor2.set, p+214, sizeof m->cursor2.set);
+		m->arrowcursor = p[342];
 		break;
 	case Rrdkbd:
 		GET2(p+6, m->rune);
blob - f113d1f09a0a015459909235b3cecb145809c466
blob + b369c020020e51491281414351844e949b17e169
--- src/libdraw/event.c
+++ src/libdraw/event.c
@@ -416,7 +416,13 @@ emoveto(Point pt)
 void
 esetcursor(Cursor *c)
 {
-	_displaycursor(display, c);
+	_displaycursor(display, c, nil);
+}
+
+void
+esetcursor2(Cursor *c, Cursor2 *c2)
+{
+	_displaycursor(display, c, c2);
 }
 
 int
blob - ddb0e83322641b543a22793fc07870a7c3212f83
blob + 003bf3ceca678459456fb3bb98eec4e6d8f029ac
--- src/libdraw/mkfile
+++ src/libdraw/mkfile
@@ -14,6 +14,7 @@ OFILES=\
 	cloadimage.$O\
 	computil.$O\
 	creadimage.$O\
+	cursor.$O\
 	debug.$O\
 	defont.$O\
 	draw.$O\
blob - ad1a069b1af560c6c618e1ffadc45227eda1303b
blob + fc486be4367e1da2a069e1b3376eadc74438f331
--- src/libdraw/mouse.c
+++ src/libdraw/mouse.c
@@ -85,6 +85,12 @@ initmouse(char *file, Image *i)
 void
 setcursor(Mousectl *mc, Cursor *c)
 {
-	_displaycursor(mc->display, c);
+	_displaycursor(mc->display, c, nil);
 }
 
+void
+setcursor2(Mousectl *mc, Cursor *c, Cursor2 *c2)
+{
+	_displaycursor(mc->display, c, c2);
+}
+