Making use of the new mouse button information present in my "feature/pad-mousebutton" libwacom branch on github. After building the list of buttons the old-fashioned way (which lets us get away with the libwacom database being less complete than the kernel database) we add any mouse buttons that libwacom is aware of.
Signed-off-by: Jason Gerecke <killert...@gmail.com> --- This patch uses the libwacom RFC patch I posted to the list on August 2nd. With no activity on that particular patch, here's how xf86-input-wacom would look making use of it. Again, please provide any feedback on this or the previously-mentioned libwacom patch if you have concerns about how this integration works. configure.ac | 3 +++ src/Makefile.am | 3 ++- src/wcmUSB.c | 50 ++++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 45 insertions(+), 11 deletions(-) diff --git a/configure.ac b/configure.ac index 916c69e..f16d032 100644 --- a/configure.ac +++ b/configure.ac @@ -58,6 +58,9 @@ PKG_CHECK_MODULES(X11, x11 xi xrandr xinerama) # Obtain compiler/linker options for libudev used by ISDV4 code PKG_CHECK_MODULES(UDEV, libudev) +# Obtain compiler/linker options for libwacom +PKG_CHECK_MODULES(WACOM, [libwacom >= 0.6]) + # X Server SDK location is required to install wacom header files # This location is also relayed in the xorg-wacom.pc file sdkdir=`$PKG_CONFIG --variable=sdkdir xorg-server` diff --git a/src/Makefile.am b/src/Makefile.am index b9fecc6..956af83 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -32,6 +32,7 @@ include common.mk @DRIVER_NAME@_drv_ladir = @inputdir@ AM_CPPFLAGS=-I$(top_srcdir)/include/ -AM_CFLAGS = $(XORG_CFLAGS) $(CWARNFLAGS) $(UDEV_CFLAGS) +AM_CFLAGS = $(XORG_CFLAGS) $(CWARNFLAGS) $(UDEV_CFLAGS) $(WACOM_CFLAGS) +LIBS = $(WACOM_LIBS) @DRIVER_NAME@_drv_la_SOURCES = $(DRIVER_SOURCES) diff --git a/src/wcmUSB.c b/src/wcmUSB.c index 58a54af..f2dac68 100644 --- a/src/wcmUSB.c +++ b/src/wcmUSB.c @@ -28,6 +28,8 @@ #include <sys/utsname.h> #include <linux/version.h> +#include <libwacom/libwacom.h> + #define MAX_USB_EVENTS 32 typedef struct { @@ -371,6 +373,9 @@ static Bool usbWcmInit(InputInfoPtr pInfo, char* id, float *version) } if (IsPad(priv)) { + WacomDeviceDatabase* db = libwacom_database_new(); + WacomDevice* dev = libwacom_new_from_usbid(db, sID.vendor, sID.product, NULL); + /* Find out supported button codes. */ usbdata->npadkeys = 0; for (i = 0; i < ARRAY_SIZE(padkey_codes); i++) { @@ -380,14 +385,40 @@ static Bool usbWcmInit(InputInfoPtr pInfo, char* id, float *version) usbdata->npadkeys++; } } - } - 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. - */ + /* Look for mouse buttons */ + for (i = 0; dev && i < libwacom_get_num_buttons(dev); i++) { + WacomButtonFlags flags = libwacom_get_button_flag(dev, 'A' + i); + switch (flags & WACOM_BUTTON_MOUSEBUTTON) { + case WMOUSE_LEFT: + priv->button_default[i] = 1; + usbdata->padkey_code[i] = BTN_LEFT; + usbdata->npadkeys++; + break; + case WMOUSE_MIDDLE: + priv->button_default[i] = 2; + usbdata->padkey_code[i] = BTN_MIDDLE; + usbdata->npadkeys++; + break; + case WMOUSE_RIGHT: + priv->button_default[i] = 3; + usbdata->padkey_code[i] = BTN_RIGHT; + usbdata->npadkeys++; + break; + case WMOUSE_BACK: + priv->button_default[i] = 8; + usbdata->padkey_code[i] = BTN_BACK; + usbdata->npadkeys++; + break; + case WMOUSE_FORWARD: + priv->button_default[i] = 9; + usbdata->padkey_code[i] = BTN_FORWARD; + usbdata->npadkeys++; + break; + } + } + } + else if (IsCursor(priv)) { for (i = 0; i < ARRAY_SIZE(mouse_codes); i++) if (ISBITSET(common->wcmKeys, mouse_codes[i])) usbdata->padkey_code [usbdata->npadkeys++] = mouse_codes[i]; @@ -404,14 +435,13 @@ static Bool usbWcmInit(InputInfoPtr pInfo, char* id, float *version) } } } - - if (IsPen(priv)) { + else if (IsPen(priv)) { priv->button_default[0] = 1; priv->button_default[1] = 2; priv->button_default[2] = 3; } - if (IsTouch(priv)) { + else if (IsTouch(priv)) { /* We only simulate left and right click */ priv->button_default[0] = 1; priv->button_default[1] = 3; -- 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