From: Ping Cheng <[email protected]> Date: Wed, 17 Mar 2010 17:43:53 -0700 Subject: [PATCH 1/2] Make keys into wcmKeys
Tool type and other device/tool specific characters can be retrieved through the supported events, defined in keys, from the kernel. Make this variable an attribute of common so we only need to retrieve it once in wcmPreInit Ping Cheng <[email protected]> --- src/wcmConfig.c | 13 ++++++------- src/wcmISDV4.c | 20 +++++++++++--------- src/wcmUSB.c | 28 +++++++++++----------------- src/wcmValidateDevice.c | 30 +++++++++++++++--------------- src/xf86Wacom.h | 16 ++++++++-------- src/xf86WacomDefs.h | 3 ++- 6 files changed, 53 insertions(+), 57 deletions(-) diff --git a/src/wcmConfig.c b/src/wcmConfig.c index 0bc0436..8f0eadb 100644 --- a/src/wcmConfig.c +++ b/src/wcmConfig.c @@ -1,6 +1,6 @@ /* * Copyright 1995-2002 by Frederic Lepied, France. <[email protected]> - * Copyright 2002-2009 by Ping Cheng, Wacom. <[email protected]> + * Copyright 2002-2010 by Ping Cheng, Wacom. <[email protected]> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -333,7 +333,6 @@ static LocalDevicePtr wcmPreInit(InputDriverPtr drv, IDevPtr dev, int flags) const char* type; char* device; int need_hotplug = 0; - unsigned long keys[NBITS(KEY_MAX)]; int tablet_id = 0; gWacomModule.wcmDrv = drv; @@ -384,11 +383,11 @@ static LocalDevicePtr wcmPreInit(InputDriverPtr drv, IDevPtr dev, int flags) } /* initialize supported keys */ - wcmDeviceTypeKeys(local, keys, &tablet_id); - need_hotplug = wcmNeedAutoHotplug(local, &type, keys); + wcmDeviceTypeKeys(local, &tablet_id); + need_hotplug = wcmNeedAutoHotplug(local, &type); /* check if the type is valid for those don't need hotplug */ - if(!need_hotplug && !wcmIsAValidType(type, keys)) + if(!need_hotplug && !wcmIsAValidType(local, type)) goto SetupProc_fail; /* check if the same device file has been added already */ @@ -413,7 +412,7 @@ static LocalDevicePtr wcmPreInit(InputDriverPtr drv, IDevPtr dev, int flags) /* Process the common options. */ xf86ProcessCommonOptions(local, local->options); - if (!wcmParseOptions(local, keys)) + if (!wcmParseOptions(local)) goto SetupProc_fail; /* mark the device configured */ @@ -422,7 +421,7 @@ static LocalDevicePtr wcmPreInit(InputDriverPtr drv, IDevPtr dev, int flags) if (need_hotplug) { priv->isParent = 1; - wcmHotplugOthers(local, keys); + wcmHotplugOthers(local); } if (local->fd != -1) diff --git a/src/wcmISDV4.c b/src/wcmISDV4.c index 8d96216..e10816e 100644 --- a/src/wcmISDV4.c +++ b/src/wcmISDV4.c @@ -1,6 +1,6 @@ /* * Copyright 1995-2002 by Frederic Lepied, France. <[email protected]> - * Copyright 2002-2009 by Ping Cheng, Wacom Technology. <[email protected]> + * Copyright 2002-2010 by Ping Cheng, Wacom Technology. <[email protected]> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -633,12 +633,14 @@ static int wcmWaitForTablet(LocalDevicePtr local, char* answer, int size) * device ID. This matching only works for wacom devices (serial ID of * WACf), all others are simply assumed to be pen + erasor. */ -int isdv4ProbeKeys(LocalDevicePtr local, unsigned long *keys) +int isdv4ProbeKeys(LocalDevicePtr local) { int id, i; int tablet_id = 0; struct serial_struct tmp; const char *device = xf86SetStrOption(local->options, "Device", NULL); + WacomDevicePtr priv = (WacomDevicePtr)local->private; + WacomCommonPtr common = priv->common; if (ioctl(local->fd, TIOCGSERIAL, &tmp) < 0) return 0; @@ -667,23 +669,23 @@ int isdv4ProbeKeys(LocalDevicePtr local, unsigned long *keys) /* we have tried memset. it doesn't work */ for (i=0; i<NBITS(KEY_MAX); i++) - keys[i] = 0; + common->wcmKeys[i] = 0; /* default to penabled */ - keys[LONG(BTN_TOOL_PEN)] |= BIT(BTN_TOOL_PEN); - keys[LONG(BTN_TOOL_RUBBER)] |= BIT(BTN_TOOL_RUBBER); + common->wcmKeys[LONG(BTN_TOOL_PEN)] |= BIT(BTN_TOOL_PEN); + common->wcmKeys[LONG(BTN_TOOL_RUBBER)] |= BIT(BTN_TOOL_RUBBER); /* id < 0x008 are only penabled */ if (id > 0x007) - keys[LONG(BTN_TOOL_DOUBLETAP)] |= BIT(BTN_TOOL_DOUBLETAP); + common->wcmKeys[LONG(BTN_TOOL_DOUBLETAP)] |= BIT(BTN_TOOL_DOUBLETAP); if (id > 0x0a) - keys[LONG(BTN_TOOL_TRIPLETAP)] |= BIT(BTN_TOOL_TRIPLETAP); + common->wcmKeys[LONG(BTN_TOOL_TRIPLETAP)] |= BIT(BTN_TOOL_TRIPLETAP); /* no pen 2FGT */ if (id == 0x010) { - keys[LONG(BTN_TOOL_PEN)] &= ~BIT(BTN_TOOL_PEN); - keys[LONG(BTN_TOOL_RUBBER)] &= ~BIT(BTN_TOOL_RUBBER); + common->wcmKeys[LONG(BTN_TOOL_PEN)] &= ~BIT(BTN_TOOL_PEN); + common->wcmKeys[LONG(BTN_TOOL_RUBBER)] &= ~BIT(BTN_TOOL_RUBBER); } /* 0x9a and 0x9f are only detected by communicating diff --git a/src/wcmUSB.c b/src/wcmUSB.c index 7532551..503052a 100644 --- a/src/wcmUSB.c +++ b/src/wcmUSB.c @@ -1,6 +1,6 @@ /* * Copyright 1995-2002 by Frederic Lepied, France. <[email protected]> - * Copyright 2002-2009 by Ping Cheng, Wacom Technology. <[email protected]> + * Copyright 2002-2009 by Ping Cheng, Wacom Technology. <[email protected]> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -429,7 +429,6 @@ static Bool usbWcmInit(LocalDevicePtr local, char* id, float *version) { int i; struct input_id sID; - unsigned long keys[NBITS(KEY_MAX)] = {0}; WacomDevicePtr priv = (WacomDevicePtr)local->private; WacomCommonPtr common = priv->common; @@ -440,13 +439,6 @@ static Bool usbWcmInit(LocalDevicePtr local, char* id, float *version) ioctl(local->fd, EVIOCGID, &sID); ioctl(local->fd, EVIOCGNAME(sizeof(id)), id); - /* retrieve tool type, device type and buttons from the kernel */ - if (ioctl(local->fd, EVIOCGBIT(EV_KEY,sizeof(keys)),keys) < 0) - { - xf86Msg(X_ERROR, "%s: unable to ioctl key bits.\n", local->name); - return FALSE; - } - /* vendor is wacom */ if (sID.vendor == WACOM_VENDOR_ID) { @@ -482,18 +474,18 @@ static Bool usbWcmInit(LocalDevicePtr local, char* id, float *version) * BTN_LEFT and BTN_RIGHT, which are always fixed. */ common->npadkeys = 0; for (i = 0; i < sizeof (padkey_codes) / sizeof (padkey_codes [0]); i++) - if (ISBITSET (keys, padkey_codes [i])) + if (ISBITSET (common->wcmKeys, padkey_codes [i])) common->padkey_code [common->npadkeys++] = padkey_codes [i]; - if (ISBITSET (keys, BTN_TASK)) + if (ISBITSET (common->wcmKeys, BTN_TASK)) common->nbuttons = 10; - else if (ISBITSET (keys, BTN_BACK)) + else if (ISBITSET (common->wcmKeys, BTN_BACK)) common->nbuttons = 9; - else if (ISBITSET (keys, BTN_FORWARD)) + else if (ISBITSET (common->wcmKeys, BTN_FORWARD)) common->nbuttons = 8; - else if (ISBITSET (keys, BTN_EXTRA)) + else if (ISBITSET (common->wcmKeys, BTN_EXTRA)) common->nbuttons = 7; - else if (ISBITSET (keys, BTN_SIDE)) + else if (ISBITSET (common->wcmKeys, BTN_SIDE)) common->nbuttons = 6; else common->nbuttons = 5; @@ -1066,12 +1058,14 @@ static void usbParseChannel(LocalDevicePtr local, int channel) * on success or 0 on failure. * For USB devices, we simply copy the information the kernel gives us. */ -int usbProbeKeys(LocalDevicePtr local, unsigned long *keys) +int usbProbeKeys(LocalDevicePtr local) { struct input_id wacom_id; + WacomDevicePtr priv = (WacomDevicePtr)local->private; + WacomCommonPtr common = priv->common; if (ioctl(local->fd, EVIOCGBIT(EV_KEY, (sizeof(unsigned long) - * NBITS(KEY_MAX))), keys) < 0) + * NBITS(KEY_MAX))), common->wcmKeys) < 0) { xf86Msg(X_ERROR, "%s: wcmDeviceTypeKeys unable to " "ioctl USB key bits.\n", local->name); diff --git a/src/wcmValidateDevice.c b/src/wcmValidateDevice.c index 9597d61..5e49193 100644 --- a/src/wcmValidateDevice.c +++ b/src/wcmValidateDevice.c @@ -1,5 +1,5 @@ /* - * Copyright 2009 by Ping Cheng, Wacom. <[email protected]> + * Copyright 2009 - 2010 by Ping Cheng, Wacom. <[email protected]> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -134,9 +134,11 @@ static struct }; /* validate tool type for device/product */ -Bool wcmIsAValidType(const char* type, unsigned long* keys) +Bool wcmIsAValidType(LocalDevicePtr local, const char* type) { int j, ret = FALSE; + WacomDevicePtr priv = (WacomDevicePtr)local->private; + WacomCommonPtr common = priv->common; if (!type) return FALSE; @@ -145,7 +147,7 @@ Bool wcmIsAValidType(const char* type, unsigned long* keys) for (j = 0; j < ARRAY_SIZE(wcmType); j++) { if (!strcmp(wcmType[j].type, type)) - if (ISBITSET (keys, wcmType[j].tool)) + if (ISBITSET (common->wcmKeys, wcmType[j].tool)) { ret = TRUE; break; @@ -155,15 +157,14 @@ Bool wcmIsAValidType(const char* type, unsigned long* keys) } /* Choose valid types according to device ID. */ -int wcmDeviceTypeKeys(LocalDevicePtr local, unsigned long* keys, - int* tablet_id) +int wcmDeviceTypeKeys(LocalDevicePtr local, int* tablet_id) { int ret = 1; /* serial ISDV4 devices */ - *tablet_id = isdv4ProbeKeys(local, keys); + *tablet_id = isdv4ProbeKeys(local); if (!*tablet_id) /* USB devices */ - *tablet_id = usbProbeKeys(local, keys); + *tablet_id = usbProbeKeys(local); return ret; } @@ -235,7 +236,7 @@ static void wcmHotplug(LocalDevicePtr local, const char *type) wcmFreeInputOpts(input_options); } -void wcmHotplugOthers(LocalDevicePtr local, unsigned long* keys) +void wcmHotplugOthers(LocalDevicePtr local) { int i, skip = 1; char* device; @@ -246,7 +247,7 @@ void wcmHotplugOthers(LocalDevicePtr local, unsigned long* keys) * need to start at the second one */ for (i = 0; i < ARRAY_SIZE(wcmType); i++) { - if (wcmIsAValidType(wcmType[i].type, keys)) + if (wcmIsAValidType(local, wcmType[i].type)) { if (skip) skip = 0; @@ -266,8 +267,7 @@ void wcmHotplugOthers(LocalDevicePtr local, unsigned long* keys) * This changes the source to _driver/wacom, all auto-hotplugged devices * will have the same source. */ -int wcmNeedAutoHotplug(LocalDevicePtr local, const char **type, - unsigned long* keys) +int wcmNeedAutoHotplug(LocalDevicePtr local, const char **type) { char *source = xf86CheckStrOption(local->options, "_source", ""); int i; @@ -282,7 +282,7 @@ int wcmNeedAutoHotplug(LocalDevicePtr local, const char **type, * for our device */ for (i = 0; i < ARRAY_SIZE(wcmType); i++) { - if (wcmIsAValidType(wcmType[i].type, keys)) + if (wcmIsAValidType(local, wcmType[i].type)) { *type = strdup(wcmType[i].type); break; @@ -301,7 +301,7 @@ int wcmNeedAutoHotplug(LocalDevicePtr local, const char **type, return 1; } -int wcmParseOptions(LocalDevicePtr local, unsigned long* keys) +int wcmParseOptions(LocalDevicePtr local) { WacomDevicePtr priv = (WacomDevicePtr)local->private; WacomCommonPtr common = priv->common; @@ -493,7 +493,7 @@ int wcmParseOptions(LocalDevicePtr local, unsigned long* keys) common->wcmTPCButtonDefault); /* a single touch device */ - if (ISBITSET (keys, BTN_TOOL_DOUBLETAP)) + if (ISBITSET (common->wcmKeys, BTN_TOOL_DOUBLETAP)) { /* TouchDefault was off for all devices * except when touch is supported */ @@ -501,7 +501,7 @@ int wcmParseOptions(LocalDevicePtr local, unsigned long* keys) } /* 2FG touch device */ - if (ISBITSET (keys, BTN_TOOL_TRIPLETAP)) + if (ISBITSET (common->wcmKeys, BTN_TOOL_TRIPLETAP)) { /* GestureDefault was off for all devices * except when multi-touch is supported */ diff --git a/src/xf86Wacom.h b/src/xf86Wacom.h index 6303c27..c2038c7 100644 --- a/src/xf86Wacom.h +++ b/src/xf86Wacom.h @@ -1,6 +1,6 @@ /* * Copyright 1995-2002 by Frederic Lepied, France. <[email protected]> - * Copyright 2002-2009 by Ping Cheng, Wacom Technology. <[email protected]> + * Copyright 2002-2010 by Ping Cheng, Wacom Technology. <[email protected]> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -148,18 +148,18 @@ Bool wcmAreaListOverlap(WacomToolAreaPtr area, WacomToolAreaPtr list); void wcmMappingFactor(LocalDevicePtr local); /* validation */ -extern Bool wcmIsAValidType(const char* type, unsigned long* keys); +extern Bool wcmIsAValidType(LocalDevicePtr local, const char* type); extern Bool wcmIsWacomDevice (char* fname); extern int wcmIsDuplicate(char* device, LocalDevicePtr local); -extern int wcmDeviceTypeKeys(LocalDevicePtr local, unsigned long* keys, int* tablet_id); +extern int wcmDeviceTypeKeys(LocalDevicePtr local, int* tablet_id); /* hotplug */ -extern int wcmNeedAutoHotplug(LocalDevicePtr local, const char **type, unsigned long* keys); -extern void wcmHotplugOthers(LocalDevicePtr local, unsigned long* keys); +extern int wcmNeedAutoHotplug(LocalDevicePtr local, const char **type); +extern void wcmHotplugOthers(LocalDevicePtr local); extern int wcmAutoProbeDevice(LocalDevicePtr local); /* setup */ -extern int wcmParseOptions(LocalDevicePtr local, unsigned long* keys); +extern int wcmParseOptions(LocalDevicePtr local); extern void wcmInitialCoordinates(LocalDevicePtr local, int axes); extern void wcmInitialScreens(LocalDevicePtr local); extern void wcmInitialScreens(LocalDevicePtr local); @@ -187,8 +187,8 @@ extern void InitWcmDeviceProperties(LocalDevicePtr local); #endif /* Device probing */ -int isdv4ProbeKeys(LocalDevicePtr local, unsigned long *keys); -int usbProbeKeys(LocalDevicePtr local, unsigned long *keys); +int isdv4ProbeKeys(LocalDevicePtr local); +int usbProbeKeys(LocalDevicePtr local); /****************************************************************************/ #endif /* __XF86WACOM_H */ diff --git a/src/xf86WacomDefs.h b/src/xf86WacomDefs.h index 3a9a89a..3af8a3f 100644 --- a/src/xf86WacomDefs.h +++ b/src/xf86WacomDefs.h @@ -1,6 +1,6 @@ /* * Copyright 1995-2002 by Frederic Lepied, France. <[email protected]> - * Copyright 2002-2009 by Ping Cheng, Wacom Technology. <[email protected]> + * Copyright 2002-2010 by Ping Cheng, Wacom Technology. <[email protected]> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -352,6 +352,7 @@ struct _WacomCommonRec int tablet_id; /* USB tablet ID */ int fd; /* file descriptor to tablet */ int fd_refs; /* number of references to fd; if =0, fd is invalid */ + unsigned long wcmKeys[NBITS(KEY_MAX)]; /* supported tool types for the device */ /* These values are in tablet coordinates */ int wcmMaxX; /* tablet max X value */ -- 1.6.6.1 ------------------------------------------------------------------------------ Download Intel® Parallel Studio Eval Try the new software tools for yourself. Speed compiling, find bugs proactively, and fine-tune applications for parallel performance. See why Intel Parallel Studio got high marks during beta. http://p.sf.net/sfu/intel-sw-dev _______________________________________________ Linuxwacom-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel
