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);
+               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);
+
+               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