summaryrefslogtreecommitdiff
path: root/sys/src/9/port/devmouse.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-10-07 06:34:24 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2013-10-07 06:34:24 +0200
commit6c6bd66ed17d1c8eb70ad0966922a7f71c5b4a49 (patch)
treeda560d0519e3bed832921b18b98342753db8c263 /sys/src/9/port/devmouse.c
parentad1111cb3e40371de141af7d5e72467b7d0afec7 (diff)
devmouse: differential handling of /dev/mousein buttons
Diffstat (limited to 'sys/src/9/port/devmouse.c')
-rw-r--r--sys/src/9/port/devmouse.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/sys/src/9/port/devmouse.c b/sys/src/9/port/devmouse.c
index 2f8ffe6e2..f361dcb08 100644
--- a/sys/src/9/port/devmouse.c
+++ b/sys/src/9/port/devmouse.c
@@ -71,6 +71,7 @@ Mouseinfo mouse;
Cursorinfo cursor;
int mouseshifted;
Cursor curs;
+int mouseinbuttons;
void Cursortocursor(Cursor*);
int mousechanged(void*);
@@ -192,6 +193,9 @@ mouseopen(Chan *c, int omode)
case Qmousein:
if(!iseve())
error(Eperm);
+ c->aux = malloc(sizeof(Mousestate));
+ if(c->aux == nil)
+ error(Enomem);
break;
default:
incref(&mouse);
@@ -220,6 +224,9 @@ mouseclose(Chan *c)
mouse.open = 0;
else if(c->qid.path == Qmousein){
unlock(&mouse);
+ mouseinbuttons &= ~((Mousestate*)c->aux)->buttons;
+ free(c->aux); /* Mousestate */
+ c->aux = nil;
return;
}
if(--mouse.ref != 0){
@@ -368,6 +375,7 @@ mousewrite(Chan *c, void *va, long n, vlong)
Cmdtab *ct;
char buf[64];
int b, msec;
+ Mousestate *m;
p = va;
switch((ulong)c->qid.path){
@@ -448,6 +456,13 @@ mousewrite(Chan *c, void *va, long n, vlong)
msec = strtol(p, &p, 0);
if(msec == 0)
msec = TK2MS(MACHP(0)->ticks);
+ m = (Mousestate*)c->aux;
+ m->xy = pt;
+ m->msec = msec;
+ b ^= m->buttons;
+ m->buttons ^= b;
+ mouseinbuttons = (m->buttons & b) | (mouseinbuttons & ~b);
+ b = mouse.buttons & ~b;
if(buf[0] == 'A')
absmousetrack(pt.x, pt.y, b, msec);
else
@@ -598,6 +613,8 @@ absmousetrack(int x, int y, int b, int msec)
if(y >= gscreen->clipr.max.y)
y = gscreen->clipr.max.y;
+ b |= mouseinbuttons;
+
lastb = mouse.buttons;
mouse.xy = Pt(x, y);
mouse.buttons = b;