On 06/21/2016 06:47 PM, Peter Hutterer wrote:
> On Tue, Jun 21, 2016 at 03:52:53PM -0700, Jason Gerecke wrote:
>> Providing the name of a tablet to show-svg-image can be difficult at
>> times, since the name may not be exactly what you expect or there may
>> be more than one device which shares the same name. To make its use a
>> little easier, allow it to take the device ID of the device to display
>> as a command line argument.
>>
>> Signed-off-by: Jason Gerecke <jason.gere...@wacom.com>
>> ---
>>  tools/show-svg-image.c | 74 
>> ++++++++++++++++++++++++++++++++++++++++++++------
>>  1 file changed, 66 insertions(+), 8 deletions(-)
>>
>> diff --git a/tools/show-svg-image.c b/tools/show-svg-image.c
>> index 674d27e..152f71f 100644
>> --- a/tools/show-svg-image.c
>> +++ b/tools/show-svg-image.c
>> @@ -355,16 +355,20 @@ main (int argc, char **argv)
>>      GdkWindow           *gdk_win;
>>      GdkColor             black;
>>      char                *tabletname;
>> +    char                *tabletid;
>>      const char          *filename;
>>      GOptionEntry
>>              options[] = {
>> -                    {"tablet", 't', 0, G_OPTION_ARG_STRING, &tabletname, 
>> "Name of the tablet to show", "<string>"},
>> +                    {"tablet", 't', 0, G_OPTION_ARG_STRING, &tabletname, 
>> "Name of the tablet to show", "[string]"},
>> +                    {"id", 'i', 0, G_OPTION_ARG_STRING, &tabletid, "ID of 
>> the tablet to show", "[string]"},
>>                      {NULL}
>>              };
>>  
>>      handle = NULL;
>>      error = NULL;
>> +    device = NULL;
>>      tabletname = NULL;
>> +    tabletid = NULL;
>>  
>>      context = g_option_context_new ("- libwacom tablet viewer");
>>      g_option_context_add_main_entries (context, options, NULL);
>> @@ -374,8 +378,12 @@ main (int argc, char **argv)
>>      g_option_context_free (context);
>>  
>>      gtk_init (&argc, &argv);
>> -    if (tabletname == NULL) {
>> -            g_warning ("No tablet name provided, exiting");
>> +    if (tabletname == NULL && tabletid == NULL) {
>> +            g_warning ("Tablet name or ID must be provided, exiting");
>> +            return 1;
>> +    }
>> +    if (tabletname != NULL && tabletid != NULL) {
>> +            g_warning ("Tablet name or ID must be provided, exiting");
>>              return 1;
>>      }
>>      db = libwacom_database_new_for_path(TOPSRCDIR"/data");
>> @@ -383,15 +391,65 @@ main (int argc, char **argv)
>>              g_warning ("Failed to load libwacom database, exiting");
>>              return 1;
>>      }
>> -    device = libwacom_new_from_name(db, tabletname, NULL);
>> -    if (!device) {
>> -            g_warning ("Device '%s' not found in libwacom database, 
>> exiting", tabletname);
>> -            return 1;
>> +    if (tabletname != NULL) {
>> +            device = libwacom_new_from_name (db, tabletname, NULL);
>> +            if (!device) {
>> +                    g_warning ("Device '%s' not found in libwacom database, 
>> exiting", tabletname);
>> +                    return 1;
>> +            }
>> +    }
>> +    else if (tabletid != NULL) {
>> +            WacomDevice   **devices;
>> +            WacomDevice   **d;
>> +            WacomBusType    bustype;
>> +            char          **tabletid_token;
>> +            int             vid;
>> +            int             pid;
>> +
>> +            tabletid_token = g_strsplit (tabletid, ":", -1);
> 
> sscanf(tabletid, "%s:%x:%x") should work here too? seems easier than 
> tokenising
> 

Changed locally.

>> +            if (g_strv_length (tabletid_token) != 3)
>> +                    g_warning ("Incorrectly formatted tablet id, exiting.");
>> +
>> +            if (g_ascii_strcasecmp ("", tabletid_token[0]) == 0)
>> +                    bustype = WBUSTYPE_UNKNOWN;
>> +            else if (g_ascii_strcasecmp ("usb", tabletid_token[0]) == 0)
>> +                    bustype = WBUSTYPE_USB;
>> +            else if (g_ascii_strcasecmp ("serial", tabletid_token[0]) == 0)
>> +                    bustype = WBUSTYPE_SERIAL;
>> +            else if (g_ascii_strcasecmp ("bluetooth", tabletid_token[0]) == 
>> 0)
>> +                    bustype = WBUSTYPE_BLUETOOTH;
>> +            else if (g_ascii_strcasecmp ("i2c", tabletid_token[0]) == 0)
>> +                    bustype = WBUSTYPE_I2C;
>> +            else {
>> +                    g_warning ("Unknown bus type, exiting.");
>> +                    return 1;
>> +            }
>> +
>> +            vid = (int)g_ascii_strtoll (tabletid_token[1], NULL, 16);
>> +            pid = (int)g_ascii_strtoll (tabletid_token[2], NULL, 16);
>> +
>> +            g_strfreev (tabletid_token);
>> +
>> +            devices = libwacom_list_devices_from_database (db, NULL);
>> +            d = devices;
>> +            while (*d && !device) {
>> +                    if (libwacom_get_vendor_id (*d) == vid &&
>> +                        libwacom_get_product_id (*d) == pid &&
>> +                        (libwacom_get_bustype (*d) == bustype || bustype == 
>> WBUSTYPE_UNKNOWN))
>> +                            device = *d;
>> +                    d++;
>> +            }
>> +            free (devices);
> 
> tbh, that looks like something we should have a libwacom_new_from_id() for.
> we have from_usbid which has the obvious drawback but either way that seems
> like something useful to have around.
> 

I was a bit hesitant to update the API since a thin wrapper around
'libwacom_new' (which already takes vid/pid/bus arguments) seemed so
obvious that I suspected there may be a reason it didn't exist. I could
certainly either introduce one or corresponding
serialid/i2cid/bluetoothid functions.

Let me know which you would prefer and I'll send some patches.

> and the last nit: can we please split this block into a helper function.
> main() is already quite unwieldly
> 

Changed locally.

> I've pushed the other patches, thanks.
> 
> Cheers,
>    Peter
> 

Thanks.

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

>> +
>> +            if (!device) {
>> +                    g_warning ("Device ID '%s' not found in libwacom 
>> database, exiting", tabletid);
>> +                    return 1;
>> +            }
>>      }
>>  
>>      filename = libwacom_get_layout_filename(device);
>>      if (filename == NULL) {
>> -            g_warning ("Device '%s' has no layout available, exiting", 
>> tabletname);
>> +            g_warning ("Device '%s' has no layout available, exiting", 
>> libwacom_get_name(device));
>>              return 1;
>>      }
>>      handle = rsvg_handle_new_from_file (filename, &error);
>> -- 
>> 2.8.3
>>

------------------------------------------------------------------------------
Attend Shape: An AT&T Tech Expo July 15-16. Meet us at AT&T Park in San
Francisco, CA to explore cutting-edge tech and listen to tech luminaries
present their vision of the future. This family event has something for
everyone, including kids. Get more information and register today.
http://sdm.link/attshape
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to