On 4/20/2015 2:09 PM, Ping Cheng wrote:
> HID generic devices share the same default name, "Wacom HID". This
> causes userland programs to show same device names for different
> devices, which would confuse end users with same device names for
> different devices too.
> 
> This patch uses name retrieved from HID descriptor, if a meaningful
> name is reported. Otherwise, affix its product ID to "Wacom HID".
> 
> Signed-off-by: Ping Cheng <[email protected]>
> ---
> v2: updated with Jason's pid affix and extract whitespace suggestions.
> ---
>  drivers/hid/wacom_sys.c | 53 
> +++++++++++++++++++++++++++++++++++++++----------
>  1 file changed, 42 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c
> index 1b00d8d..a857cd2 100644
> --- a/drivers/hid/wacom_sys.c
> +++ b/drivers/hid/wacom_sys.c
> @@ -1392,6 +1392,47 @@ static size_t wacom_compute_pktlen(struct hid_device 
> *hdev)
>       return size;
>  }
>  
> +static void wacom_update_name(struct wacom *wacom)
> +{
> +     struct wacom_wac *wacom_wac = &wacom->wacom_wac;
> +     struct wacom_features *features = &wacom_wac->features;
> +
> +     /* Generic devices name unspecified */
> +     if ((features->type == HID_GENERIC) && !strcmp("Wacom HID", 
> features->name)) {
> +             if (strstr(wacom->hdev->name, "Wacom") ||
> +                 strstr(wacom->hdev->name, "wacom") ||
> +                 strstr(wacom->hdev->name, "WACOM")) {
> +                     /* name is in HID descriptor, use it */
> +                     strlcpy(wacom_wac->name, wacom->hdev->name,
> +                             sizeof(wacom_wac->name));
> +
> +                     /* strip out excess whitespaces */
> +                     while (1) {
> +                             char *gap = strstr(wacom_wac->name, "  ");
> +                             if (gap == NULL)
> +                                     break;
> +                             memmove(gap, gap+1, strlen(gap));
> +                     }

Alas, my snippet doesn't work as intended when placed here. It will
remove extra internal whitespace without issue, but will leave a single
trailing space at the end of the string if there were one or more spaces
there originally. Because of this, a double space can be re-introduced
once you append the e.g. " Pen" suffix below. I suggested the loop be
placed at the bottom of the function because of this.

Alternatively, you could put a call to 'strim' immediately before or
after the loop to get rid of the extra trailing space (though I don't
particularly like how it smells):

    memmove(wacom_wac->name, strim(wacom_wac->name), \
            strlen(wacom_wac->name)+1);

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

> +             } else {
> +                     /* no meaningful name retrieved. use product ID */
> +                     snprintf(wacom_wac->name, sizeof(wacom_wac->name),
> +                              "%s %x", features->name, wacom->hdev->product);
> +             }
> +     } else {
> +             strlcpy(wacom_wac->name, features->name, 
> sizeof(wacom_wac->name));
> +     }
> +     snprintf(wacom_wac->pad_name, sizeof(wacom_wac->pad_name),
> +             "%s Pad", wacom_wac->name);
> +
> +     /* Append the device type to the name */
> +     if (features->device_type != BTN_TOOL_FINGER)
> +             strlcat(wacom_wac->name, " Pen", WACOM_NAME_MAX);
> +     else if (features->touch_max)
> +             strlcat(wacom_wac->name, " Finger", WACOM_NAME_MAX);
> +     else
> +             strlcat(wacom_wac->name, " Pad", WACOM_NAME_MAX);
> +}
> +
>  static int wacom_probe(struct hid_device *hdev,
>               const struct hid_device_id *id)
>  {
> @@ -1517,17 +1558,7 @@ static int wacom_probe(struct hid_device *hdev,
>       }
>       wacom_calculate_res(features);
>  
> -     strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name));
> -     snprintf(wacom_wac->pad_name, sizeof(wacom_wac->pad_name),
> -             "%s Pad", features->name);
> -
> -     /* Append the device type to the name */
> -     if (features->device_type != BTN_TOOL_FINGER)
> -             strlcat(wacom_wac->name, " Pen", WACOM_NAME_MAX);
> -     else if (features->touch_max)
> -             strlcat(wacom_wac->name, " Finger", WACOM_NAME_MAX);
> -     else
> -             strlcat(wacom_wac->name, " Pad", WACOM_NAME_MAX);
> +     wacom_update_name(wacom);
>  
>       error = wacom_add_shared_data(hdev);
>       if (error)
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to