On Tue, Mar 11, 2014 at 12:31 PM, Egbert Eich <e...@freedesktop.org> wrote:
> From: Egbert Eich <e...@suse.com>
>
> usbInitToolType() tries to find the device type of a tool.
> Unlike usbFindDeviceType() it doesn't take into account the device_id
> which may exist in the event stream.
> As a result the device type may be taken from the last known type.
> This is generally a bad idea if the type has changed.
> This will happen for example when pressing a key on the Cintiq 21UX menu
> strips after removing a pen from the tablet.
>
> Signed-off-by: Egbert Eich <e...@suse.com>
> ---
>  src/wcmUSB.c | 65 
> ++++++++++++++++++++++++++++++++++++------------------------
>  1 file changed, 39 insertions(+), 26 deletions(-)
>
> diff --git a/src/wcmUSB.c b/src/wcmUSB.c
> index 3d6cdc0..8520bd1 100644
> --- a/src/wcmUSB.c
> +++ b/src/wcmUSB.c
> @@ -1088,38 +1088,48 @@ static int usbIdToType(int id)
>   * Protocol 5 devices report different IDs for different styli and pucks,
>   * Protocol 4 devices simply report STYLUS_DEVICE_ID, etc.
>   *
> - * @param ds The current device state received from the kernel.
> - * @return The tool type associated with the tool id or the current
> - * tool serial number.
> + * @device_id id of the device
> + * @return device type
>   */
> -static int usbFindDeviceType(const WacomCommonPtr common,
> -                         const WacomDeviceState *ds)
> +static int usbFindDeviceTypeById(int device_id)
>  {
> -       int device_type = 0;
> -
> -       if (!ds->device_id) return 0;
> -
> -       switch (ds->device_id)
> +       switch (device_id)
>         {
>                 case STYLUS_DEVICE_ID:
> -                       device_type = STYLUS_ID;
> -                       break;
> +                       return STYLUS_ID;
>                 case ERASER_DEVICE_ID:
> -                       device_type = ERASER_ID;
> -                       break;
> +                       return ERASER_ID;
>                 case CURSOR_DEVICE_ID:
> -                       device_type = CURSOR_ID;
> -                       break;
> +                       return CURSOR_ID;
>                 case TOUCH_DEVICE_ID:
> -                       device_type = TOUCH_ID;
> -                       break;
> +                       return TOUCH_ID;
>                 case PAD_DEVICE_ID:
> -                       device_type = PAD_ID;
> -                       break;
> +                       return PAD_ID;
>                 default: /* protocol 5 */
> -                       device_type = usbIdToType(ds->device_id);
> +                       return usbIdToType(device_id);
>         }
> +       return 0;
> +}
> +
> +/**
> + * Find the tool type (STYLUS_ID, etc.) based on the device_id or the
> + *  current tool serial number if the device_id is unknown (0).

This will probably solve itself when you make the change in patch 1,
but the serial number clause needs to be removed here...

> + *
> + * Protocol 5 devices report different IDs for different styli and pucks,
> + * Protocol 4 devices simply report STYLUS_DEVICE_ID, etc.
> + *
> + * @param ds The current device state received from the kernel.
> + * @return The tool type associated with the tool id or the current
> + * tool serial number.

... and here.

With that change:
Reviewed-by: Jason Gerecke <killert...@gmail.com>

Jason
---
Now instead of four in the eights place /
you’ve got three, ‘Cause you added one  /
(That is to say, eight) to the two,     /
But you can’t take seven from three,    /
So you look at the sixty-fours....

> + */
> +static int usbFindDeviceType(const WacomCommonPtr common,
> +                         const WacomDeviceState *ds)
> +{
> +       int device_type = 0;
> +
> +       if (!ds->device_id) return 0;
>
> +       device_type = usbFindDeviceTypeById(ds->device_id);
>         return device_type;
>  }
>
> @@ -1469,15 +1479,16 @@ static void usbParseBTNEvent(WacomCommonPtr common,
>  }
>
>  /**
> - * Translates a tool code from the kernel (e.g. BTN_TOOL_PEN) into the
> - * corresponding device type for the driver (e.g. STYLUS_ID).
> + * Translates an event code from the kernel (e.g. type: EV_ABS code: 
> ABS_MISC value: STYLUS_DEVICE_ID)
> + * into the corresponding device type for the driver (e.g. STYLUS_ID).
>   *
>   * @param[in] common
>   * @param[in] type      Linux input tool type (e.g. EV_KEY)
>   * @param[in] code      Linux input tool code (e.g. BTN_STYLUS_PEN)
> + * @param[in] value     Linux input tool value (e.g. STYLUS_DEVICE_ID)
>   * @return              Wacom device ID (e.g. STYLUS_ID) or 0 if no match.
>   */
> -static int toolTypeToDeviceType(WacomCommonPtr common, int type, int code)
> +static int deviceTypeFromEvent(WacomCommonPtr common, int type, int code, 
> int value)
>  {
>         wcmUSBData* private = common->private;
>
> @@ -1509,6 +1520,8 @@ static int toolTypeToDeviceType(WacomCommonPtr common, 
> int type, int code)
>                         case ABS_MT_SLOT:
>                         case ABS_MT_TRACKING_ID:
>                                 return TOUCH_ID;
> +                       case ABS_MISC:
> +                               return usbFindDeviceTypeById(value);
>                 }
>         }
>
> @@ -1538,7 +1551,7 @@ static int refreshDeviceType(WacomCommonPtr common)
>         for (i = 0; i < KEY_MAX; i++)
>         {
>                 if (ISBITSET(keys, i))
> -                       device_type = toolTypeToDeviceType(common, EV_KEY, i);
> +                       device_type = deviceTypeFromEvent(common, EV_KEY, i, 
> 0);
>                 if (device_type)
>                         return device_type;
>         }
> @@ -1568,7 +1581,7 @@ static int usbInitToolType(WacomCommonPtr common, const 
> struct input_event *even
>
>         for (i = 0; (i < nevents) && !device_type; ++i, event_ptr++)
>         {
> -               device_type = toolTypeToDeviceType(common, event_ptr->type, 
> event_ptr->code);
> +               device_type = deviceTypeFromEvent(common, event_ptr->type, 
> event_ptr->code, event_ptr->value);
>         }
>
>         if (!device_type)
> --
> 1.8.4.5
>

------------------------------------------------------------------------------
Put Bad Developers to Shame
Dominate Development with Jenkins Continuous Integration
Continuously Automate Build, Test & Deployment 
Start a new project now. Try Jenkins in the cloud.
http://p.sf.net/sfu/13600_Cloudbees
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to