Hi Peter,

If you can test this patchset with your I4, I am ready to put my
"Acked-by" tag for it.

Please pay a bit more attention to the combination of pad and
stylus/eraser as well as pad and cursor while you test.

Thank you Chris and Peter for your support.

Ping

On Sun, Oct 24, 2010 at 12:40 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.
>
> Generic tablets (non-wacom) and touchpads will send button
> presses associated with tablet itself even if 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.  This is for generic
> tablets only and wacom tablets continue to process events
> the same way.
>
> 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>
> ---
>  src/wcmUSB.c |  106 
> +++++++++++++++++++++++++++++++++++++++++++++++-----------
>  1 files changed, 86 insertions(+), 20 deletions(-)
>
> diff --git a/src/wcmUSB.c b/src/wcmUSB.c
> index 5fa3067..eb22d97 100644
> --- a/src/wcmUSB.c
> +++ b/src/wcmUSB.c
> @@ -35,6 +35,7 @@
>
>  typedef struct {
>        int wcmLastToolSerial;
> +       int wcmBTNChannel;
>        int wcmEventCnt;
>        struct input_event wcmEvents[MAX_USB_EVENTS];
>  } wcmUSBData;
> @@ -752,6 +753,12 @@ static int usbChooseChannel(WacomCommonPtr common)
>                 */
>                channel = 0;
>                serial = 1;
> +
> +               /* Generic devices need to map stylus buttons to "channel"
> +                * and all other button presses to PAD.  Hardcode PAD
> +                * channel here.
> +                */
> +               private->wcmBTNChannel = MAX_CHANNELS-1;
>        }
>        else if (common->wcmProtocolLevel == WCM_PROTOCOL_4)
>        {
> @@ -784,6 +791,8 @@ static int usbChooseChannel(WacomCommonPtr common)
>                        channel = serial-1;
>                else
>                        channel = 0;
> +               /* All events go to same channel for Protocol 4 */
> +               private->wcmBTNChannel = channel;
>        }
>        else if (serial) /* serial number should never be 0 for V5 devices */
>        {
> @@ -834,6 +843,8 @@ static int usbChooseChannel(WacomCommonPtr common)
>                                        !common->wcmChannel[0].work.proximity 
> ) /* new transducer */
>                                channel = 0;
>                }
> +               /* All events go to same channel for Protocol 5 */
> +               private->wcmBTNChannel = channel;
>        }
>
>        /* fresh out of channels */
> @@ -1029,17 +1040,18 @@ static struct
>        { PAD_ID,    BTN_TOOL_FINGER    }
>  };
>
> +#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;
> +       int shift;
>        int change = 1;
> -       #define MOD_BUTTONS(bit, value) do { \
> -               shift = 1<<bit; \
> -               ds->buttons = (((value) != 0) ? \
> -               (ds->buttons | (shift)) : (ds->buttons & ~(shift))); \
> -               } while (0)
>
>        /* BTN_TOOL_* are sent to indicate when a specific tool is going
>         * in our out of proximity.  When going out of proximity, ds
> @@ -1051,9 +1063,6 @@ static int usbParseKeyEvent(WacomCommonPtr common,
>         * example) not to be in proximity at the same time.  Tools
>         * 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.
>         */
>        switch (event->code)
>        {
> @@ -1171,26 +1180,64 @@ static int usbParseKeyEvent(WacomCommonPtr common,
>                         * combination with the first finger data */
>                        break;
>
> +               default:
> +                       change = 0;
> +       }
> +
> +       if (change)
> +               return change;
> +
> +       /* Rest back to non-default value for next switch statement */
> +       change = 1;
> +
> +       /* From this point on, all BTN_* will be real button presses.
> +        * Stylus buttons always go with *ds.  Handle remaining
> +        * cases upon return.
> +        */
> +       switch (event->code)
> +       {
> +               case BTN_STYLUS:
> +                       MOD_BUTTONS(1, event->value);
> +                       break;
> +
> +               case BTN_STYLUS2:
> +                       MOD_BUTTONS(2, event->value);
> +                       break;
> +
> +               default:
> +                       change = 0;
> +       }
> +
> +       return change;
> +}
> +
> +/* Handle all button presses except for stylus buttons */
> +static int usbParseBTNEvent(WacomCommonPtr common,
> +                           struct input_event *event, WacomDeviceState *ds)
> +{
> +       int shift, nkeys;
> +       int change = 1;
> +
> +       switch (event->code)
> +       {
>                case BTN_LEFT:
>                        MOD_BUTTONS(0, event->value);
>                        break;
>
> -               case BTN_STYLUS:
>                case BTN_MIDDLE:
>                        MOD_BUTTONS(1, event->value);
>                        break;
>
> -               case BTN_STYLUS2:
>                case BTN_RIGHT:
>                        MOD_BUTTONS(2, event->value);
>                        break;
>
>                case BTN_SIDE:
> -                       MOD_BUTTONS (3, event->value);
> +                       MOD_BUTTONS(3, event->value);
>                        break;
>
>                case BTN_EXTRA:
> -                       MOD_BUTTONS (4, event->value);
> +                       MOD_BUTTONS(4, event->value);
>                        break;
>
>                default:
> @@ -1211,12 +1258,12 @@ static int usbParseKeyEvent(WacomCommonPtr common,
>  static void usbDispatchEvents(InputInfoPtr pInfo)
>  {
>        int i;
> -       WacomDeviceState* ds;
> +       WacomDeviceState *ds, *btn_ds;
>        struct input_event* event;
>        WacomDevicePtr priv = (WacomDevicePtr)pInfo->private;
>        WacomCommonPtr common = priv->common;
>        int channel;
> -       int channel_change = 0;
> +       int channel_change = 0, btn_channel_change = 0;
>        WacomChannelPtr pChannel;
>        WacomDeviceState dslast;
>        wcmUSBData* private = common->private;
> @@ -1290,6 +1337,8 @@ static void usbDispatchEvents(InputInfoPtr pInfo)
>        ds = &common->wcmChannel[channel].work;
>        ds->relwheel = 0;
>        ds->serial_num = private->wcmLastToolSerial;
> +       /* For protocol 4 and 5 devices, ds == btn_ds. */
> +       btn_ds = &common->wcmChannel[private->wcmBTNChannel].work;
>
>        /* loop through all events in group */
>        for (i=0; i<private->wcmEventCnt; ++i)
> @@ -1315,11 +1364,14 @@ static void usbDispatchEvents(InputInfoPtr pInfo)
>                                xf86Msg(X_ERROR, "%s: rel event recv'd 
> (%d)!\n",
>                                        pInfo->name, event->code);
>                }
> -
>                else if (event->type == EV_KEY)
>                {
> -                       channel_change |= usbParseKeyEvent(common, event, ds,
> -                                                          &dslast);
> +                       if (usbParseKeyEvent(common, event, ds, &dslast))
> +                               channel_change |= 1;
> +                       else
> +                               btn_channel_change |=
> +                                       usbParseBTNEvent(common, event,
> +                                                        btn_ds);
>                }
>        } /* next event */
>
> @@ -1358,9 +1410,23 @@ static void usbDispatchEvents(InputInfoPtr pInfo)
>        if (!ds->proximity)
>                private->wcmLastToolSerial = 0;
>
> -       /* dispatch event */
> -       if (channel_change)
> +       /* dispatch events */
> +       if (channel_change ||
> +           (common->wcmProtocolLevel != WCM_PROTOCOL_GENERIC &&
> +            btn_channel_change))
>                wcmEvent(common, channel, ds);
> +
> +       /* dispatch pad events on generic tablets */
> +       if (common->wcmProtocolLevel == WCM_PROTOCOL_GENERIC &&
> +           btn_channel_change)
> +       {
> +               /* Force to in proximity for this special case */
> +               btn_ds->proximity = 1;
> +               btn_ds->device_type = PAD_ID;
> +               btn_ds->device_id = PAD_DEVICE_ID;
> +               btn_ds->serial_num = 0xf0;
> +               wcmEvent(common, private->wcmBTNChannel, btn_ds);
> +       }
>  }
>
>  /**
> --
> 1.7.3.1
>
>
> ------------------------------------------------------------------------------
> 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
>

------------------------------------------------------------------------------
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

Reply via email to