summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-06-02 23:45:38 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2013-06-02 23:45:38 +0200
commit97c4381dc4279de6f9a463069f22df9e06162747 (patch)
treebe4c4c2b6a71c5e493f1c022e7bee86ec2736789
parent6c4d8f8b11bf04959c920c0720a60949db038a65 (diff)
nusb/kb: map button 4 to middle button 2 (for logitech 5 button mouse)
-rw-r--r--sys/src/cmd/nusb/kb/kb.c47
1 files changed, 22 insertions, 25 deletions
diff --git a/sys/src/cmd/nusb/kb/kb.c b/sys/src/cmd/nusb/kb/kb.c
index 0313a465e..4961a169b 100644
--- a/sys/src/cmd/nusb/kb/kb.c
+++ b/sys/src/cmd/nusb/kb/kb.c
@@ -43,20 +43,6 @@ struct KDev
};
/*
- * Map for the logitech bluetooth mouse with 8 buttons and wheels.
- * { ptr ->mouse}
- * { 0x01, 0x01 }, // left
- * { 0x04, 0x02 }, // middle
- * { 0x02, 0x04 }, // right
- * { 0x40, 0x08 }, // up
- * { 0x80, 0x10 }, // down
- * { 0x10, 0x08 }, // side up
- * { 0x08, 0x10 }, // side down
- * { 0x20, 0x02 }, // page
- * besides wheel and regular up/down report the 4th byte as 1/-1
- */
-
-/*
* scan codes >= 0x80 are extended (E0 XX)
*/
#define isext(sc) ((sc) >= 0x80)
@@ -378,6 +364,7 @@ struct Ptr
int z;
int b;
+ int m;
int absx;
int absy;
@@ -422,14 +409,15 @@ ptrparse(int t, int f, int g[], int l[], int, void *a)
switch(l[Usage]){
case 0x090001:
- m = 1;
- goto Button;
case 0x090002:
- m = 4;
- goto Button;
case 0x090003:
- m = 2;
- Button:
+ case 0x090004:
+ case 0x090005:
+ case 0x090006:
+ case 0x090007:
+ case 0x090008:
+ m = 1<<(l[Usage] - 0x090001);
+ p->m |= m;
p->b &= ~m;
if(v != 0)
p->b |= m;
@@ -460,9 +448,6 @@ ptrparse(int t, int f, int g[], int l[], int, void *a)
p->z = v;
p->absz += v;
}
- p->b &= ~(8|16);
- if(p->z != 0)
- p->b |= (p->z > 0) ? 8 : 16;
break;
}
}
@@ -474,7 +459,7 @@ ptrwork(void* a)
{
char err[ERRMAX];
char mbuf[80];
- int c, nerrs;
+ int c, b, nerrs;
KDev* f = a;
Ptr p;
@@ -511,7 +496,19 @@ ptrwork(void* a)
p.e = p.p + c;
repparse(f->rep, f->rep+f->nrep, ptrparse, &p);
- seprint(mbuf, mbuf+sizeof(mbuf), "m%11d %11d %11d", p.x, p.y, p.b);
+ if(debug)
+ fprint(2, "ptr: b=%x m=%x x=%d y=%d z=%d\n", p.b, p.m, p.x, p.y, p.z);
+
+ /* map buttons */
+ b = p.b & 1;
+ if(p.b & (4|8))
+ b |= 2;
+ if(p.b & 2)
+ b |= 4;
+ if(p.z != 0)
+ b |= (p.z > 0) ? 8 : 16;
+
+ seprint(mbuf, mbuf+sizeof(mbuf), "m%11d %11d %11d", p.x, p.y, b);
if(write(f->infd, mbuf, strlen(mbuf)) < 0)
kbfatal(f, "mousein i/o");
}