Signed-off-by: Peter Hutterer <[email protected]>
---
libwacom/libwacom-database.c | 15 +++++++++------
libwacom/libwacom.c | 41 +++++++++++++++++++++++++----------------
libwacom/libwacomint.h | 3 ++-
3 files changed, 36 insertions(+), 23 deletions(-)
diff --git a/libwacom/libwacom-database.c b/libwacom/libwacom-database.c
index e3023e2..f8cad59 100644
--- a/libwacom/libwacom-database.c
+++ b/libwacom/libwacom-database.c
@@ -161,26 +161,29 @@ match_from_string(const char *str, WacomBusType *bus, int
*vendor_id, int *produ
}
static gboolean
-libwacom_matchstr_to_match(WacomDevice *device, const char *match)
+libwacom_matchstr_to_match(WacomDevice *device, const char *matchstr)
{
char *name = NULL;
int vendor_id, product_id;
WacomBusType bus;
+ WacomMatch *match;
- if (match == NULL)
+ if (matchstr == NULL)
return FALSE;
- if (g_strcmp0 (match, GENERIC_DEVICE_MATCH) == 0) {
+ if (g_strcmp0 (matchstr, GENERIC_DEVICE_MATCH) == 0) {
name = NULL;
bus = WBUSTYPE_UNKNOWN;
vendor_id = 0;
product_id = 0;
- } else if (!match_from_string(match, &bus, &vendor_id, &product_id,
&name)) {
- DBG("failed to match '%s' for product/vendor IDs. Skipping.\n",
match);
+ } else if (!match_from_string(matchstr, &bus, &vendor_id, &product_id,
&name)) {
+ DBG("failed to match '%s' for product/vendor IDs. Skipping.\n",
matchstr);
return FALSE;
}
- libwacom_update_match(device, name, bus, vendor_id, product_id);
+ match = libwacom_match_new(name, bus, vendor_id, product_id);
+ libwacom_update_match(device, match);
+ libwacom_match_destroy(match);
free(name);
return TRUE;
diff --git a/libwacom/libwacom.c b/libwacom/libwacom.c
index b093021..38b6225 100644
--- a/libwacom/libwacom.c
+++ b/libwacom/libwacom.c
@@ -487,6 +487,7 @@ libwacom_new_from_path(const WacomDeviceDatabase *db, const
char *path, WacomFal
WacomDevice *ret = NULL;
WacomIntegrationFlags integration_flags;
char *name, *match_name;
+ WacomMatch *match;
if (!db) {
libwacom_error_set(error, WERROR_INVALID_DB, "db is NULL");
@@ -526,7 +527,9 @@ libwacom_new_from_path(const WacomDeviceDatabase *db, const
char *path, WacomFal
}
/* for multiple-match devices, set to the one we requested */
- libwacom_update_match(ret, match_name, bus, vendor_id, product_id);
+ match = libwacom_match_new(match_name, bus, vendor_id, product_id);
+ libwacom_update_match(ret, match);
+ libwacom_match_destroy(match);
g_free (name);
@@ -799,28 +802,37 @@ libwacom_destroy(WacomDevice *device)
g_free (device);
}
-void
-libwacom_update_match(WacomDevice *device, const char *name, WacomBusType bus,
int vendor_id, int product_id)
+WacomMatch*
+libwacom_match_new(const char *name, WacomBusType bus, int vendor_id, int
product_id)
{
+ WacomMatch *match;
char *newmatch;
- int i;
- WacomMatch match;
+ match = g_malloc(sizeof(*match));
if (name == NULL && bus == WBUSTYPE_UNKNOWN && vendor_id == 0 &&
product_id == 0)
newmatch = g_strdup("generic");
else
newmatch = make_match_string(name, bus, vendor_id, product_id);
- match.match = newmatch;
- match.name = g_strdup(name);
- match.bus = bus;
- match.vendor_id = vendor_id;
- match.product_id = product_id;
+ match->match = newmatch;
+ match->name = g_strdup(name);
+ match->bus = bus;
+ match->vendor_id = vendor_id;
+ match->product_id = product_id;
+
+ return match;
+}
+
+void
+libwacom_update_match(WacomDevice *device, const WacomMatch *newmatch)
+{
+ int i;
for (i = 0; i < device->nmatches; i++) {
- if
(g_strcmp0(libwacom_match_get_match_string(device->matches[i]), newmatch) == 0)
{
+ const char *matchstr =
libwacom_match_get_match_string(device->matches[i]);
+ if (g_strcmp0(matchstr, newmatch->match) == 0) {
device->match = i;
- goto out;
+ return;
}
}
@@ -828,11 +840,8 @@ libwacom_update_match(WacomDevice *device, const char
*name, WacomBusType bus, i
device->matches = g_realloc_n(device->matches, device->nmatches + 1,
sizeof(WacomMatch*));
device->matches[device->nmatches] = NULL;
- device->matches[device->nmatches - 1] = libwacom_copy_match(&match);
+ device->matches[device->nmatches - 1] = libwacom_copy_match(newmatch);
device->match = device->nmatches - 1;
-out:
- g_free(newmatch);
- g_free(match.name);
}
int libwacom_get_vendor_id(const WacomDevice *device)
diff --git a/libwacom/libwacomint.h b/libwacom/libwacomint.h
index af47bd5..c7d8916 100644
--- a/libwacom/libwacomint.h
+++ b/libwacom/libwacomint.h
@@ -120,7 +120,8 @@ struct _WacomError {
/* INTERNAL */
void libwacom_error_set(WacomError *error, enum WacomErrorCode code, const
char *msg, ...);
void libwacom_stylus_destroy(WacomStylus *stylus);
-void libwacom_update_match(WacomDevice *device, const char *name, WacomBusType
bus, int vendor_id, int product_id);
+void libwacom_update_match(WacomDevice *device, const WacomMatch *match);
+WacomMatch* libwacom_match_new(const char *name, WacomBusType bus, int
vendor_id, int product_id);
void libwacom_match_destroy(WacomMatch *match);
WacomBusType bus_from_str (const char *str);
--
2.7.4
------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel