On Thu, Oct 21, 2010 at 2:43 PM, Chris Bagwell <ch...@cnpbagwell.com> wrote: > On Thu, Oct 21, 2010 at 12:38 PM, Ping Cheng <pingli...@gmail.com> wrote: >> On Wed, Oct 20, 2010 at 6:16 PM, <ch...@cnpbagwell.com> wrote: >>> From: Chris Bagwell <ch...@cnpbagwell.com> >>> >>> The core of xf86-input-wacom strictly enforces buttons >>> on tools that are out-of-proximity must be cleared except >>> for the special case of the PAD device that is always >>> considered in proximity. >>> >>> Simple/Generic tablets (non-wacom) and touchpads will send >>> button presses associated with tablet itself even though no >>> tools are reported as in proximity. >>> >>> Work around this by forcing all non-styus button presses >>> to be routed to hard coded PAD channel and post multiple >>> channel events per sync window. >>> >>> MT packets could be implemented using same concept and >>> routing to hard coded channel 0 or 1 based on finger #. >>> >>> Signed-off-by: Chris Bagwell <ch...@cnpbagwell.com> >>> Reviewed-by: Peter Hutterer <peter.hutte...@who-t.net> >>> --- >>> src/wcmUSB.c | 110 >>> +++++++++++++++++++++++++++++++++++++++++++++++----------- >>> 1 files changed, 89 insertions(+), 21 deletions(-) >>> >>> diff --git a/src/wcmUSB.c b/src/wcmUSB.c >>> index eed755e..973e358 100644 >>> --- a/src/wcmUSB.c >>> +++ b/src/wcmUSB.c >>> @@ -35,6 +35,7 @@ >>> >>> typedef struct { >>> int wcmLastToolSerial; >>> + int wcmPadChannel; >>> int wcmEventCnt; >>> struct input_event wcmEvents[MAX_USB_EVENTS]; >>> } wcmUSBData; >>> @@ -752,6 +753,13 @@ static int usbChooseChannel(WacomCommonPtr common) >>> */ >>> channel = 0; >>> serial = 1; >>> + >>> + /* Generic devices are only ones that will send >>> + * pad buttons without a PAD serial # so hardcode >>> + * the reserved channel here. The rest can protocols >>> + * can rely on normal channel logic. >>> + */ >>> + private->wcmPadChannel = MAX_CHANNELS-1; >>> } >>> else if (common->wcmProtocolLevel == WCM_PROTOCOL_4) >>> { >>> @@ -784,6 +792,7 @@ static int usbChooseChannel(WacomCommonPtr common) >>> channel = serial-1; >>> else >>> channel = 0; >>> + private->wcmPadChannel = channel; >>> } >>> else if (serial) /* serial number should never be 0 for V5 devices */ >>> { >>> @@ -834,6 +843,7 @@ static int usbChooseChannel(WacomCommonPtr common) >>> >>> !common->wcmChannel[0].work.proximity ) /* new transducer */ >>> channel = 0; >>> } >>> + private->wcmPadChannel = channel; >>> } >>> >>> /* fresh out of channels */ >>> @@ -950,9 +960,11 @@ skipEvent: >>> private->wcmEventCnt = 0; >>> } >>> >>> -static void usbParseAbsEvent(WacomCommonPtr common, >>> - struct input_event *event, WacomDeviceState >>> *ds) >>> +static int usbParseAbsEvent(WacomCommonPtr common, >>> + struct input_event *event, WacomDeviceState *ds) >>> { >>> + int change = 1; >>> + >>> switch(event->code) >>> { >>> case ABS_X: >>> @@ -1003,7 +1015,10 @@ static void usbParseAbsEvent(WacomCommonPtr common, >>> if (event->value) >>> ds->device_id = event->value; >>> break; >>> + default: >>> + change = 0; >>> } >>> + return change; >>> } >>> >>> static struct >>> @@ -1024,16 +1039,18 @@ static struct >>> { PAD_ID, BTN_TOOL_FINGER } >>> }; >>> >>> -static void usbParseKeyEvent(WacomCommonPtr common, >>> - struct input_event *event, WacomDeviceState >>> *ds, >>> - WacomDeviceState *dslast) >>> +#define MOD_BUTTONS(bit, value) do { \ >>> + shift = 1<<bit; \ >>> + ds->buttons = (((value) != 0) ? \ >>> + (ds->buttons | (shift)) : (ds->buttons & ~(shift))); \ >>> + } while (0) >>> + >>> +static int usbParseKeyEvent(WacomCommonPtr common, >>> + struct input_event *event, WacomDeviceState *ds, >>> + WacomDeviceState *dslast) >>> { >>> - int shift, nkeys; >>> - #define MOD_BUTTONS(bit, value) do { \ >>> - shift = 1<<bit; \ >>> - ds->buttons = (((value) != 0) ? \ >>> - (ds->buttons | (shift)) : (ds->buttons & ~(shift))); \ >>> - } while (0) >>> + int shift; >>> + int change = 1; >>> >>> /* BTN_TOOL_* are sent to indicate when a specific tool is going >>> * in our out of proximity. When going out of proximity, ds >>> @@ -1046,8 +1063,9 @@ static void usbParseKeyEvent(WacomCommonPtr common, >>> * that map to different channels can be in proximity at same >>> * time with no confusion. >>> * >>> - * Remaining part of case state (after BTN_TOOL_*) handle normal >>> - * button presses. >>> + * Remaining part of case state (after BTN_TOOL_*) handle buttons >>> + * on stylus that validaty depends on its tool being in >>> + * proximity. >>> */ >>> switch (event->code) >>> { >>> @@ -1165,16 +1183,38 @@ static void usbParseKeyEvent(WacomCommonPtr common, >>> * combination with the first finger data */ >>> break; >>> >>> + case BTN_STYLUS: >>> + MOD_BUTTONS(1, event->value); >>> + break; >>> + >>> + case BTN_STYLUS2: >>> + MOD_BUTTONS(2, event->value); >>> + break; >>> + default: >>> + change = 0; >>> + } >>> + return change; >>> +} >>> + >>> +/* Track buttons associated with always in proximity PAD device. These >>> + * are buttons located on tablet itself. >>> + */ >> >> BTN_LEFT, BTN_MIDDLE, BTN_RIGHT, BTN_SIDE, and BTN_EXTRA are the >> buttons for CURSOR (mouse/puck, whichever name you use ;-) device. >> They are reported through BTN_TOOL_MOUSE. So, PAD should not use them. >> That is why BTN_0...9, BTX_A..Z, BTN_BASE... are used for PAD and >> those five BTN_* have never been reused for PAD. >> >> Bamboo doesn't come with a mouse. So, this isn't an issue for you. >> But, I have to care about those users who have pucks. Otherwise they >> are going to cry ;). >> >> There are two options for us, I think. >> >> 1. We don't support BTN_LEFT, etc as default values for PAD, as >> we are doing it now, except the freshly baked Bamboo MT patchset. That >> is, we'll need to update the Bamboo MT patch to BTN_0 or something. >> >> The drawback for this option is: we lose the chance to set meaningful >> defaults for the buttons in the kernel. The benefit for us is it is >> easy to implement. >> >> 2. We support BTN_LEFT, etc. for PAD as well so we can have good >> default settings in the kernel. Then we need something to distinguish >> PAD from CURSOR so we could reroute the buttons here. >> >> Putting an Acked-by tag is easy. Making all the users happy is not so easy... >> >> Ping > > Great comments. > > I think I can somehow wrap this stuff with WCM_PROTOCOL_GENERIC and > resolve the issue. I mean put these "CURSOR" and "PAD" overlapping > buttons in both usbParsePadKeyEvent() and usbParseKeyEvent() but only > support them in later when wcmProtocolLevel != WCM_PROTOCOL_GENERIC... > or maybe only when device_type == CURSOR_ID. > > Anyways, I'll make a list of the overlapping values and see what > patterns emerge. Somehow I had convinced myself there were no > overlapping buttons. > > Stay tuned for v3 of patch #5 and patch #1. > > Chris >
It turns out this version of patch does correctly handle MOUSE devices and their buttons because wcmPadChannel == usbChooseChannel() always for Protocol 4 and 5 devices. The comments read like it always forces to PAD devices which isn't the case so I've updated the patch to read better and will resend. Chris ------------------------------------------------------------------------------ Nokia and AT&T present the 2010 Calling All Innovators-North America contest Create new apps & games for the Nokia N8 for consumers in U.S. and Canada $10 million total in prizes - $4M cash, 500 devices, nearly $6M in marketing Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store http://p.sf.net/sfu/nokia-dev2dev _______________________________________________ Linuxwacom-devel mailing list Linuxwacom-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel