On Wed, Jun 22, 2016 at 09:20:36AM -0700, Jason Gerecke wrote:
> 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.

I *think* the reason it doesn't exist is because we had the new_by_usbid and
then the bluetooth/i2c tablets came later and we never needed the matching
call. I'd say rather than adding more bus-specific ones we should deprecate
the usbid one and add one that takes the bus ID as argument.

Cheers,
   Peter

> 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