On Mon, Oct 29, 2012 at 08:42:34PM +0100, Olivier Fourdan wrote: > > >From 1950bce008b1104bad774c053882e8a12e5994a3 Mon Sep 17 00:00:00 2001 > From: Olivier Fourdan <ofour...@redhat.com> > Date: Thu, 25 Oct 2012 14:43:28 +0200 > Subject: [PATCH 2/4] lib: add SVG image to device properties > > --- > libwacom/libwacom-database.c | 18 +++++++++++---- > libwacom/libwacom.c | 46 > +++++++++++++++++++++++++++++++++++++++++- > libwacom/libwacom.h | 7 ++++++ > libwacom/libwacomint.h | 2 + > 4 files changed, 67 insertions(+), 6 deletions(-)
Reviewed-by: Peter Hutterer <peter.hutte...@who-t.net> though see the comments re: "image" naming. Cheers, Peter > > diff --git a/libwacom/libwacom-database.c b/libwacom/libwacom-database.c > index d39305d..cc95851 100644 > --- a/libwacom/libwacom-database.c > +++ b/libwacom/libwacom-database.c > @@ -319,12 +319,14 @@ libwacom_parse_buttons(WacomDevice *device, > } > > static WacomDevice* > -libwacom_parse_tablet_keyfile(const char *path) > +libwacom_parse_tablet_keyfile(const char *datadir, const char *filename) > { > WacomDevice *device = NULL; > GKeyFile *keyfile; > GError *error = NULL; > gboolean rc; > + char *path; > + char *image; > char *class; > char *match; > char **styli_list; > @@ -332,6 +334,7 @@ libwacom_parse_tablet_keyfile(const char *path) > > keyfile = g_key_file_new(); > > + path = g_build_filename (datadir, filename, NULL); > rc = g_key_file_load_from_file(keyfile, path, G_KEY_FILE_NONE, &error); > > if (!rc) { > @@ -358,7 +361,12 @@ libwacom_parse_tablet_keyfile(const char *path) > device->name = g_key_file_get_string(keyfile, DEVICE_GROUP, "Name", > NULL); > device->width = g_key_file_get_integer(keyfile, DEVICE_GROUP, "Width", > NULL); > device->height = g_key_file_get_integer(keyfile, DEVICE_GROUP, > "Height", NULL); > - > + image = g_key_file_get_string(keyfile, DEVICE_GROUP, "Image", NULL); > + if (image) { > + /* For the image, we store the full path to the SVG image */ > + device->image = g_build_filename (datadir, "images", image, > NULL); > + g_free (image); > + } > class = g_key_file_get_string(keyfile, DEVICE_GROUP, "Class", NULL); > device->cls = libwacom_class_string_to_enum(class); > g_free(class); > @@ -445,6 +453,8 @@ libwacom_parse_tablet_keyfile(const char *path) > } > > out: > + if (path) > + g_free(path); > if (keyfile) > g_key_file_free(keyfile); > if (error) > @@ -515,9 +525,7 @@ libwacom_database_new_for_path (const char *datadir) > WacomDevice *d; > const WacomMatch **matches, **match; > > - path = g_build_filename (datadir, files[n]->d_name, NULL); > - d = libwacom_parse_tablet_keyfile(path); > - g_free(path); > + d = libwacom_parse_tablet_keyfile(datadir, files[n]->d_name); > > if (!d) > continue; > diff --git a/libwacom/libwacom.c b/libwacom/libwacom.c > index 4f8c5f9..88b95c8 100644 > --- a/libwacom/libwacom.c > +++ b/libwacom/libwacom.c > @@ -290,6 +290,7 @@ libwacom_copy(const WacomDevice *device) > d->name = g_strdup (device->name); > d->width = device->width; > d->height = device->height; > + d->image = g_strdup(device->image); > d->nmatches = device->nmatches; > d->matches = g_malloc((d->nmatches + 1) * sizeof(WacomMatch*)); > for (i = 0; i < d->nmatches; i++) > @@ -333,6 +334,26 @@ compare_matches(WacomDevice *a, WacomDevice *b) > return 0; > } > > +/* Compare images based on file name, stripping the full path */ > +static gboolean > +libwacom_same_images (WacomDevice *a, WacomDevice *b) > +{ > + gchar *file1, *file2; > + > + /* Conveniently handle the null case */ > + if (a->image == b->image) > + return TRUE; > + > + file1 = NULL; > + file2 = NULL; > + if (a->image != NULL) > + file1 = g_path_get_basename (a->image); > + if (b->image != NULL) > + file2 = g_path_get_basename (b->image); > + > + return (g_strcmp0 (file1, file2) == 0); > +} > + > int > libwacom_compare(WacomDevice *a, WacomDevice *b, WacomCompareFlags flags) > { > @@ -347,6 +368,9 @@ libwacom_compare(WacomDevice *a, WacomDevice *b, > WacomCompareFlags flags) > if (a->width != b->width || a->height != b->height) > return 1; > > + if (!libwacom_same_images (a, b)) > + return 1; > + > if (a->cls != b->cls) > return 1; > > @@ -537,6 +561,19 @@ static void print_styli_for_device (int fd, WacomDevice > *device) > dprintf(fd, "\n"); > } > > +static void print_image_for_device (int fd, WacomDevice *device) > +{ > + const char *image_filename; > + gchar *base_name; > + > + image_filename = libwacom_get_image_filename(device); > + if (image_filename) { > + base_name = g_path_get_basename (image_filename); > + dprintf(fd, "Image=%s\n", base_name); > + g_free (base_name); > + } > +} > + > static void print_supported_leds (int fd, WacomDevice *device) > { > char *leds_name[] = { > @@ -598,7 +635,7 @@ libwacom_print_device_description(int fd, WacomDevice > *device) > { > const WacomMatch **match; > WacomClass class; > - const char *bus_name, *class_name; > + const char *bus_name, *class_name, *image_filename; > > class = libwacom_get_class(device); > switch(class) { > @@ -638,6 +675,7 @@ libwacom_print_device_description(int fd, WacomDevice > *device) > dprintf(fd, "Class=%s\n", class_name); > dprintf(fd, "Width=%d\n", libwacom_get_width(device)); > dprintf(fd, "Height=%d\n", libwacom_get_height(device)); > + print_image_for_device(fd, device); > print_styli_for_device(fd, device); > dprintf(fd, "\n"); > > @@ -666,6 +704,7 @@ libwacom_destroy(WacomDevice *device) > return; > > g_free (device->name); > + g_free (device->image); > > for (i = 0; i < device->nmatches; i++) { > g_free (device->matches[i]->match); > @@ -724,6 +763,11 @@ const char* libwacom_get_name(WacomDevice *device) > return device->name; > } > > +const char* libwacom_get_image_filename(WacomDevice *device) > +{ > + return device->image; > +} > + > int libwacom_get_product_id(WacomDevice *device) > { > g_return_val_if_fail(device->match >= 0, -1); > diff --git a/libwacom/libwacom.h b/libwacom/libwacom.h > index 8830db8..2dc38e4 100644 > --- a/libwacom/libwacom.h > +++ b/libwacom/libwacom.h > @@ -330,6 +330,13 @@ const char* libwacom_get_name(WacomDevice *device); > > /** > * @param device The tablet to query > + * @return The full filename including path to the SVG image of the device > + * if available, or NULL otherwise > + */ > +const char* libwacom_get_image_filename(WacomDevice *device); > + > +/** > + * @param device The tablet to query > * @return The numeric vendor ID for this device > */ > int libwacom_get_vendor_id(WacomDevice *device); > diff --git a/libwacom/libwacomint.h b/libwacom/libwacomint.h > index 55436e9..b3dc36f 100644 > --- a/libwacom/libwacomint.h > +++ b/libwacom/libwacomint.h > @@ -93,6 +93,8 @@ struct _WacomDevice { > int num_leds; > WacomStatusLEDs *status_leds; > > + char *image; > + > gint refcnt; /* for the db hashtable */ > }; > > -- > 1.7.1 > > ------------------------------------------------------------------------------ > The Windows 8 Center - In partnership with Sourceforge > Your idea - your app - 30 days. > Get started! > http://windows8center.sourceforge.net/ > what-html-developers-need-to-know-about-coding-windows-8-metro-style-apps/ > _______________________________________________ > Linuxwacom-devel mailing list > Linuxwacom-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel ------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_sfd2d_oct _______________________________________________ Linuxwacom-devel mailing list Linuxwacom-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel