shithub: riscv

Download patch

ref: 6cbc226351d6c47ace019f6d62e7070deb7b4b5a
parent: 5cc1cb182065a0c1f5a32e36a71c9b1ac3083db5
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Dec 11 11:53:51 EST 2016

vncs: update devmouse code

--- a/sys/src/cmd/vnc/devmouse.c
+++ b/sys/src/cmd/vnc/devmouse.c
@@ -14,40 +14,31 @@
 
 struct Mousestate
 {
-	Point	xy;			/* mouse.xy */
-	int	buttons;		/* mouse.buttons */
+	Point	xy;		/* mouse.xy */
+	int	buttons;	/* mouse.buttons */
 	ulong	counter;	/* increments every update */
-	ulong	msec;	/* time of last event */
+	ulong	msec;		/* time of last event */
 };
 
 struct Mouseinfo
 {
+	Lock;
 	Mousestate;
-	int	dx;
-	int	dy;
-	int	track;		/* dx & dy updated */
-	int	redraw;		/* update cursor on screen */
 	ulong	lastcounter;	/* value when /dev/mouse read */
 	Rendez	r;
 	Ref;
-	QLock;
 	int	open;
-	int	acceleration;
-	int	maxacc;
-	Mousestate 	queue[16];	/* circular buffer of click events */
-	int	ri;	/* read index into queue */
-	int	wi;	/* write index into queue */
-	uchar	qfull;	/* queue is full */
+	Mousestate	queue[16];	/* circular buffer of click events */
+	ulong	ri;		/* read index into queue */
+	ulong	wi;		/* write index into queue */
 };
 
 Mouseinfo	mouse;
 Cursorinfo	cursor;
-int		mouseshifted;
 Cursor		curs;
 
 void	Cursortocursor(Cursor*);
 int	mousechanged(void*);
-static void mouseclock(void);
 
 enum{
 	Qdir,
@@ -65,13 +56,22 @@
 	"mousectl",	{Qmousectl},	0,			0222,
 };
 
-static uchar buttonmap[8] = {
-	0, 1, 2, 3, 4, 5, 6, 7,
+Cursor	arrow = {
+	{ -1, -1 },
+	{ 0xFF, 0xFF, 0x80, 0x01, 0x80, 0x02, 0x80, 0x0C,
+	  0x80, 0x10, 0x80, 0x10, 0x80, 0x08, 0x80, 0x04,
+	  0x80, 0x02, 0x80, 0x01, 0x80, 0x02, 0x8C, 0x04,
+	  0x92, 0x08, 0x91, 0x10, 0xA0, 0xA0, 0xC0, 0x40,
+	},
+	{ 0x00, 0x00, 0x7F, 0xFE, 0x7F, 0xFC, 0x7F, 0xF0,
+	  0x7F, 0xE0, 0x7F, 0xE0, 0x7F, 0xF0, 0x7F, 0xF8,
+	  0x7F, 0xFC, 0x7F, 0xFE, 0x7F, 0xFC, 0x73, 0xF8,
+	  0x61, 0xF0, 0x60, 0xE0, 0x40, 0x40, 0x00, 0x00,
+	},
 };
-static int mouseswap;
 
-extern	Memimage*	gscreen;
-extern	void mousewarpnote(Point);
+extern Memimage* gscreen;
+extern void mousewarpnote(Point);
 
 static void
 mousereset(void)
@@ -83,7 +83,9 @@
 static void
 mouseinit(void)
 {
-	cursoron(1);
+	curs = arrow;
+	Cursortocursor(&arrow);
+	cursoron();
 }
 
 static Chan*
@@ -95,12 +97,7 @@
 static Walkqid*
 mousewalk(Chan *c, Chan *nc, char **name, int nname)
 {
-	Walkqid *wq;
-
-	wq = devwalk(c, nc, name, nname, mousedir, nelem(mousedir), devgen);
-	if(wq != nil && wq->clone != c && (wq->clone->qid.type&QTDIR)==0)
-		incref(&mouse);
-	return wq;
+	return devwalk(c, nc, name, nname, mousedir, nelem(mousedir), devgen);
 }
 
 static int
@@ -112,29 +109,27 @@
 static Chan*
 mouseopen(Chan *c, int omode)
 {
+	int mode;
+
+	mode = openmode(omode);
 	switch((ulong)c->qid.path){
 	case Qdir:
 		if(omode != OREAD)
 			error(Eperm);
 		break;
-	case Qmouse:
-		lock(&mouse);
-		if(mouse.open){
-			unlock(&mouse);
-			error(Einuse);
-		}
-		mouse.open = 1;
-		mouse.ref++;
-		unlock(&mouse);
-		break;
 	case Qmousein:
 	case Qmousectl:
-		error(Egreg);	/* dummy */
+		error(Egreg);
 		break;
-	default:
+	case Qmouse:
+		if(_tas(&mouse.open) != 0)
+			error(Einuse);
+		mouse.lastcounter = mouse.counter;
+		/* wet floor */
+	case Qcursor:
 		incref(&mouse);
 	}
-	c->mode = openmode(omode);
+	c->mode = mode;
 	c->flag |= COPEN;
 	c->offset = 0;
 	return c;
@@ -141,25 +136,21 @@
 }
 
 static void
-mousecreate(Chan*, char*, int, ulong)
-{
-	error(Eperm);
-}
-
-static void
 mouseclose(Chan *c)
 {
-	if((c->qid.type&QTDIR)==0 && (c->flag&COPEN)){
-		lock(&mouse);
-		if(c->qid.path == Qmouse)
-			mouse.open = 0;
-		if(--mouse.ref == 0){
-			cursoroff(1);
-			curs = arrow;
-			Cursortocursor(&arrow);
-			cursoron(1);
-		}
-		unlock(&mouse);
+	if((c->qid.type&QTDIR)!=0 || (c->flag&COPEN)==0)
+		return;
+	switch((ulong)c->qid.path){
+	case Qmouse:
+		mouse.open = 0;
+		/* wet floor */
+	case Qcursor:
+		if(decref(&mouse) != 0)
+			return;
+		cursoroff();
+		curs = arrow;
+		Cursortocursor(&arrow);
+		cursoron();
 	}
 }
 
@@ -167,12 +158,10 @@
 static long
 mouseread(Chan *c, void *va, long n, vlong off)
 {
-	char buf[4*12+1];
+	char buf[1+4*12+1];
 	uchar *p;
-	static int map[8] = {0, 4, 2, 6, 1, 5, 3, 7 };
 	ulong offset = off;
 	Mousestate m;
-	int b;
 
 	p = va;
 	switch((ulong)c->qid.path){
@@ -185,12 +174,10 @@
 		if(n < 2*4+2*2*16)
 			error(Eshort);
 		n = 2*4+2*2*16;
-		lock(&cursor);
 		BPLONG(p+0, curs.offset.x);
 		BPLONG(p+4, curs.offset.y);
 		memmove(p+8, curs.clr, 2*16);
 		memmove(p+40, curs.set, 2*16);
-		unlock(&cursor);
 		return n;
 
 	case Qmouse:
@@ -197,35 +184,18 @@
 		while(mousechanged(0) == 0)
 			rendsleep(&mouse.r, mousechanged, 0);
 
-		mouse.qfull = 0;
-
-		/*
-		 * No lock of the indicies is necessary here, because ri is only
-		 * updated by us, and there is only one mouse reader
-		 * at a time.  I suppose that more than one process
-		 * could try to read the fd at one time, but such behavior
-		 * is degenerate and already violates the calling
-		 * conventions for sleep above.
-		 */
-		if(mouse.ri != mouse.wi){
-			m = mouse.queue[mouse.ri];
-			if(++mouse.ri == nelem(mouse.queue))
-				mouse.ri = 0;
-		} else {
-			lock(&cursor);
-	
+		lock(&mouse);
+		if(mouse.ri != mouse.wi)
+			m = mouse.queue[mouse.ri++ % nelem(mouse.queue)];
+		else
 			m = mouse.Mousestate;
-			unlock(&cursor);
-		}
+		unlock(&mouse);
 
-		b = buttonmap[m.buttons&7];
-		/* put buttons 4 and 5 back in */
-		b |= m.buttons & (3<<3);
-		sprint(buf, "m%11d %11d %11d %11lud",
-			m.xy.x, m.xy.y,
-			b,
-			m.msec);
+		sprint(buf, "m%11d %11d %11d %11lud ",
+			m.xy.x, m.xy.y, m.buttons, m.msec);
+
 		mouse.lastcounter = m.counter;
+
 		if(n > 1+4*12)
 			n = 1+4*12;
 		memmove(va, buf, n);
@@ -234,49 +204,6 @@
 	return 0;
 }
 
-static void
-setbuttonmap(char* map)
-{
-	int i, x, one, two, three;
-
-	one = two = three = 0;
-	for(i = 0; i < 3; i++){
-		if(map[i] == 0)
-			error(Ebadarg);
-		if(map[i] == '1'){
-			if(one)
-				error(Ebadarg);
-			one = 1<<i;
-		}
-		else if(map[i] == '2'){
-			if(two)
-				error(Ebadarg);
-			two = 1<<i;
-		}
-		else if(map[i] == '3'){
-			if(three)
-				error(Ebadarg);
-			three = 1<<i;
-		}
-		else
-			error(Ebadarg);
-	}
-	if(map[i])
-		error(Ebadarg);
-
-	memset(buttonmap, 0, 8);
-	for(i = 0; i < 8; i++){
-		x = 0;
-		if(i & 1)
-			x |= one;
-		if(i & 2)
-			x |= two;
-		if(i & 4)
-			x |= three;
-		buttonmap[x] = i;
-	}
-}
-
 static long
 mousewrite(Chan *c, void *va, long n, vlong)
 {
@@ -290,7 +217,7 @@
 		error(Eisdir);
 
 	case Qcursor:
-		cursoroff(1);
+		cursoroff();
 		if(n < 2*4+2*2*16){
 			curs = arrow;
 			Cursortocursor(&arrow);
@@ -302,11 +229,7 @@
 			memmove(curs.set, p+40, 2*16);
 			Cursortocursor(&curs);
 		}
-		qlock(&mouse);
-		mouse.redraw = 1;
-		mouseclock();
-		qunlock(&mouse);
-		cursoron(1);
+		cursoron();
 		return n;
 
 	case Qmouse:
@@ -314,17 +237,13 @@
 			n = sizeof buf -1;
 		memmove(buf, va, n);
 		buf[n] = 0;
-		p = 0;
-		pt.x = strtoul(buf+1, &p, 0);
-		if(p == 0)
+
+		pt.x = strtol(buf+1, &p, 0);
+		if(*p == 0)
 			error(Eshort);
-		pt.y = strtoul(p, 0, 0);
-		qlock(&mouse);
-		if(ptinrect(pt, gscreen->r)){
-			mousetrack(pt.x, pt.y, mouse.buttons, nsec()/(1000*1000LL));
-			mousewarpnote(pt);
-		}
-		qunlock(&mouse);
+		pt.y = strtol(p, 0, 0);
+		absmousetrack(pt.x, pt.y, mouse.buttons, nsec()/(1000*1000LL));
+		mousewarpnote(pt);
 		return n;
 	}
 
@@ -342,7 +261,7 @@
 	mousewalk,
 	mousestat,
 	mouseopen,
-	mousecreate,
+	devcreate,
 	mouseclose,
 	mouseread,
 	devbread,
@@ -361,75 +280,42 @@
 	unlock(&cursor);
 }
 
-static int
-scale(int x)
+void
+absmousetrack(int x, int y, int b, ulong msec)
 {
-	int sign = 1;
+	int lastb;
 
-	if(x < 0){
-		sign = -1;
-		x = -x;
-	}
-	switch(x){
-	case 0:
-	case 1:
-	case 2:
-	case 3:
-		break;
-	case 4:
-		x = 6 + (mouse.acceleration>>2);
-		break;
-	case 5:
-		x = 9 + (mouse.acceleration>>1);
-		break;
-	default:
-		x *= mouse.maxacc;
-		break;
-	}
-	return sign*x;
-}
+	if(gscreen==nil)
+		return;
 
-static void
-mouseclock(void)
-{
-	lock(&cursor);
-	if(mouse.redraw){
-		mouse.redraw = 0;
-		cursoroff(0);
-		mouse.redraw = cursoron(0);
-	}
-	unlock(&cursor);
-}
+	if(x < gscreen->clipr.min.x)
+		x = gscreen->clipr.min.x;
+	if(x >= gscreen->clipr.max.x)
+		x = gscreen->clipr.max.x-1;
+	if(y < gscreen->clipr.min.y)
+		y = gscreen->clipr.min.y;
+	if(y >= gscreen->clipr.max.y)
+		y = gscreen->clipr.max.y-1;
 
-/*
- *  called at interrupt level to update the structure and
- *  awaken any waiting procs.
- */
-void
-mousetrack(int x, int y, int b, int msec)
-{
-	int lastb;
 
-	lastb = mouse.buttons;
+	lock(&mouse);
 	mouse.xy = Pt(x, y);
+	lastb = mouse.buttons;
 	mouse.buttons = b;
-	mouse.redraw = 1;
-	mouse.counter++;
 	mouse.msec = msec;
+	mouse.counter++;
 
 	/*
-	 * if the queue fills, we discard the entire queue and don't
-	 * queue any more events until a reader polls the mouse.
+	 * if the queue fills, don't queue any more events until a
+	 * reader polls the mouse.
 	 */
-	if(!mouse.qfull && lastb != b){	/* add to ring */
-		mouse.queue[mouse.wi] = mouse.Mousestate;
-		if(++mouse.wi == nelem(mouse.queue))
-			mouse.wi = 0;
-		if(mouse.wi == mouse.ri)
-			mouse.qfull = 1;
-	}
+	if(b != lastb && (mouse.wi-mouse.ri) < nelem(mouse.queue))
+		mouse.queue[mouse.wi++ % nelem(mouse.queue)] = mouse.Mousestate;
+	unlock(&mouse);
+
 	rendwakeup(&mouse.r);
-	mouseclock();
+
+	cursoron();
 }
 
 int
@@ -442,14 +328,4 @@
 mousexy(void)
 {
 	return mouse.xy;
-}
-
-void
-mouseaccelerate(int x)
-{
-	mouse.acceleration = x;
-	if(mouse.acceleration < 3)
-		mouse.maxacc = 2;
-	else
-		mouse.maxacc = mouse.acceleration;
 }
--- a/sys/src/cmd/vnc/screen.c
+++ b/sys/src/cmd/vnc/screen.c
@@ -39,20 +39,6 @@
 static Memimage		*cursorclear;
 static Cursor		screencursor;
 
-Cursor	arrow = {
-	{ -1, -1 },
-	{ 0xFF, 0xFF, 0x80, 0x01, 0x80, 0x02, 0x80, 0x0C,
-	  0x80, 0x10, 0x80, 0x10, 0x80, 0x08, 0x80, 0x04,
-	  0x80, 0x02, 0x80, 0x01, 0x80, 0x02, 0x8C, 0x04,
-	  0x92, 0x08, 0x91, 0x10, 0xA0, 0xA0, 0xC0, 0x40,
-	},
-	{ 0x00, 0x00, 0x7F, 0xFE, 0x7F, 0xFC, 0x7F, 0xF0,
-	  0x7F, 0xE0, 0x7F, 0xE0, 0x7F, 0xF0, 0x7F, 0xF8,
-	  0x7F, 0xFC, 0x7F, 0xFE, 0x7F, 0xFC, 0x73, 0xF8,
-	  0x61, 0xF0, 0x60, 0xE0, 0x40, 0x40, 0x00, 0x00,
-	},
-};
-
 void
 screeninit(int x, int y, char *chanstr)
 {
@@ -230,26 +216,16 @@
 	memmove(cursclr, curs->clr, CURSORDIM*CURSORDIM/8);
 }
 
-int
-cursoron(int dolock)
+void
+cursoron(void)
 {
-	if(dolock)
-		lock(&cursor);
 	cursorpos = mousexy();
-	if(dolock)
-		unlock(&cursor);
-
-	return 0;
 }
 
 void
-cursoroff(int dolock)
+cursoroff(void)
 {
-	if(dolock)
-		lock(&cursor);
 	cursorpos = offscreen;
-	if(dolock)
-		unlock(&cursor);
 }
 
 void
--- a/sys/src/cmd/vnc/screen.h
+++ b/sys/src/cmd/vnc/screen.h
@@ -12,8 +12,8 @@
 extern Point		cursorpos;
 
 Point 		mousexy(void);
-int		cursoron(int);
-void		cursoroff(int);
+void		cursoron(void);
+void		cursoroff(void);
 void		setcursor(Cursor*);
 void		flushmemscreen(Rectangle r);
 Rectangle	cursorrect(void);
@@ -28,7 +28,7 @@
 #define		TK2SEC(x)	0
 extern void	blankscreen(int);
 void		screeninit(int x, int y, char *chanstr);
-void		mousetrack(int x, int y, int b, int msec);
+void		absmousetrack(int x, int y, int b, ulong msec);
 uchar		*attachscreen(Rectangle*, ulong*, int*, int*, int*);
 
 void		fsinit(char *mntpt, int x, int y, char *chanstr);
--- a/sys/src/cmd/vnc/vncs.c
+++ b/sys/src/cmd/vnc/vncs.c
@@ -802,7 +802,7 @@
 			buttons = vncrdchar(v);
 			x = vncrdshort(v);
 			y = vncrdshort(v);
-			mousetrack(x, y, buttons, nsec()/(1000*1000LL));
+			absmousetrack(x, y, buttons, nsec()/(1000*1000LL));
 			break;
 
 		/* send cut text */