Instead of setting up a static mapping which "directly" associates flags in the button int with X11 buttons, we determine the proper X11 button to use based on the kernel event recieved. Normally these are the same, but in the case of "mouse" buttons (which have are now also stored in usbdata->padkey_code) don't work properly since there are often "holes" in the button association.
Signed-off-by: Jason Gerecke <killert...@gmail.com> --- src/wcmConfig.c | 7 +---- src/wcmISDV4.c | 13 +++++++++ src/wcmUSB.c | 91 ++++++++++++++++++++++++++++----------------------------- 3 files changed, 59 insertions(+), 52 deletions(-) diff --git a/src/wcmConfig.c b/src/wcmConfig.c index 157d9d3..ffbd6ea 100644 --- a/src/wcmConfig.c +++ b/src/wcmConfig.c @@ -38,7 +38,6 @@ static int wcmAllocate(InputInfoPtr pInfo) WacomDevicePtr priv = NULL; WacomCommonPtr common = NULL; WacomToolPtr tool = NULL; - int i; priv = calloc(1, sizeof(WacomDeviceRec)); if (!priv) @@ -68,12 +67,8 @@ static int wcmAllocate(InputInfoPtr pInfo) priv->nPressCtrl [2] = 100; /* pressure curve x1 */ priv->nPressCtrl [3] = 100; /* pressure curve y1 */ - /* Default button and expresskey values, offset buttons 4 and higher - * by the 4 scroll buttons. */ - for (i=0; i<WCM_MAX_BUTTONS; i++) - priv->button_default[i] = (i < 3) ? i + 1 : i + 5; + /* Don't initialize buttons -- leave this up to wcmUSB/wcmISDV4 */ - priv->nbuttons = WCM_MAX_BUTTONS; /* Default number of buttons */ priv->wheel_default[WHEEL_REL_UP] = 5; priv->wheel_default[WHEEL_REL_DN] = 4; /* wheel events are set to 0, but the pad overwrites this default diff --git a/src/wcmISDV4.c b/src/wcmISDV4.c index 17f5326..cc3e73a 100644 --- a/src/wcmISDV4.c +++ b/src/wcmISDV4.c @@ -272,6 +272,19 @@ static Bool isdv4Init(InputInfoPtr pInfo, char* id, float *version) /*set the model */ common->wcmModel = &isdv4General; + /* set available buttons */ + if (IsPen(priv)) { + priv->nbuttons = 3; + priv->button_default[0] = 1; + priv->button_default[1] = 2; + priv->button_default[2] = 3; + } + else if (IsTouch(priv)) { + priv->nbuttons = 2; + priv->button_default[0] = 1; + priv->button_default[1] = 3; + } + return Success; } diff --git a/src/wcmUSB.c b/src/wcmUSB.c index 3ee5d8f..58a54af 100644 --- a/src/wcmUSB.c +++ b/src/wcmUSB.c @@ -370,27 +370,51 @@ static Bool usbWcmInit(InputInfoPtr pInfo, char* id, float *version) common->wcmResolX = common->wcmResolY = 1016; } - /* Find out supported button codes. */ - usbdata->npadkeys = 0; - for (i = 0; i < ARRAY_SIZE(padkey_codes); i++) - if (ISBITSET (common->wcmKeys, padkey_codes [i])) - usbdata->padkey_code [usbdata->npadkeys++] = padkey_codes [i]; + if (IsPad(priv)) { + /* Find out supported button codes. */ + usbdata->npadkeys = 0; + for (i = 0; i < ARRAY_SIZE(padkey_codes); i++) { + if (ISBITSET (common->wcmKeys, padkey_codes [i])) { + priv->button_default[usbdata->npadkeys] = (i < 3) ? i + 1 : i + 5; + usbdata->padkey_code [usbdata->npadkeys] = padkey_codes [i]; + usbdata->npadkeys++; + } + } + } - if (usbdata->npadkeys == 0) { + if (IsCursor(priv) || (IsPad(priv) && usbdata->npadkeys == 0)) { /* If no pad keys were detected, entertain the possibility that any * mouse buttons which exist may belong to the pad (e.g. Graphire4). * If we're wrong, this will over-state the capabilities of the pad * but that shouldn't actually cause problems. */ - for (i = ARRAY_SIZE(mouse_codes) - 1; i > 0; i--) + for (i = 0; i < ARRAY_SIZE(mouse_codes); i++) if (ISBITSET(common->wcmKeys, mouse_codes[i])) - break; + usbdata->padkey_code [usbdata->npadkeys++] = mouse_codes[i]; + + for (i=0; i<usbdata->npadkeys; i++) { + switch (usbdata->padkey_code[i]) { + case BTN_LEFT: priv->button_default[i] = 1; break; + case BTN_MIDDLE: priv->button_default[i] = 2; break; + case BTN_RIGHT: priv->button_default[i] = 3; break; + case BTN_BACK: priv->button_default[i] = 8; break; + case BTN_FORWARD: priv->button_default[i] = 9; break; + case BTN_SIDE: priv->button_default[i] = 8; break; + case BTN_EXTRA: priv->button_default[i] = 9; break; + } + } + } - /* Make sure room for fixed map mouse buttons. This - * means mappings may overlap with padkey_codes[]. - */ - if (i != 0) - usbdata->npadkeys = WCM_USB_MAX_MOUSE_BUTTONS; + if (IsPen(priv)) { + priv->button_default[0] = 1; + priv->button_default[1] = 2; + priv->button_default[2] = 3; + } + + if (IsTouch(priv)) { + /* We only simulate left and right click */ + priv->button_default[0] = 1; + priv->button_default[1] = 3; } /* nbuttons tracks maximum buttons on all tools (stylus/mouse). @@ -1323,42 +1347,17 @@ static int usbParseBTNEvent(WacomCommonPtr common, int change = 1; wcmUSBData *usbdata = common->private; - switch (event->code) + for (nkeys = 0; nkeys < usbdata->npadkeys; nkeys++) { - case BTN_LEFT: - ds->buttons = mod_buttons(ds->buttons, 0, event->value); - break; - - case BTN_MIDDLE: - ds->buttons = mod_buttons(ds->buttons, 1, event->value); - break; - - case BTN_RIGHT: - ds->buttons = mod_buttons(ds->buttons, 2, event->value); - break; - - case BTN_SIDE: - case BTN_BACK: - ds->buttons = mod_buttons(ds->buttons, 3, event->value); - break; - - case BTN_EXTRA: - case BTN_FORWARD: - ds->buttons = mod_buttons(ds->buttons, 4, event->value); + if (event->code == usbdata->padkey_code[nkeys]) + { + ds->buttons = mod_buttons(ds->buttons, nkeys, event->value); break; - - default: - for (nkeys = 0; nkeys < usbdata->npadkeys; nkeys++) - { - if (event->code == usbdata->padkey_code[nkeys]) - { - ds->buttons = mod_buttons(ds->buttons, nkeys, event->value); - break; - } - } - if (nkeys >= usbdata->npadkeys) - change = 0; + } } + if (nkeys >= usbdata->npadkeys) + change = 0; + return change; } -- 1.7.11.4 ------------------------------------------------------------------------------ Live Security Virtual Conference Exclusive live event will cover all the ways today's security and threat landscape has changed and how IT managers can respond. Discussions will include endpoint security, mobile security and the latest in malware threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ _______________________________________________ Linuxwacom-devel mailing list Linuxwacom-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel