The match count (and update to the first correct) has to be done
in libwacom_parse_tablet_keyfile() now.
---

changes in v3:
- libwacom_matchstr_to_match now returns a gboolean

new in v2

 libwacom/libwacom-database.c | 81 +++++++++++++++++++++-----------------------
 1 file changed, 39 insertions(+), 42 deletions(-)

diff --git a/libwacom/libwacom-database.c b/libwacom/libwacom-database.c
index f4cb82a..3b39dba 100644
--- a/libwacom/libwacom-database.c
+++ b/libwacom/libwacom-database.c
@@ -129,46 +129,32 @@ make_match_string (WacomBusType bus, int vendor_id, int 
product_id)
        return g_strdup_printf("%s:%04x:%04x", bus_to_str (bus), vendor_id, 
product_id);
 }
 
-static int
-libwacom_matchstr_to_matches(WacomDevice *device, const char *match)
+static gboolean
+libwacom_matchstr_to_match(WacomDevice *device, const char *match)
 {
        int rc = 1;
-       char **strs;
-       int i, nmatches = 0;
-       WacomBusType first_bus;
-       int first_vendor_id, first_product_id;
+       char busstr[64];
+       int vendor_id, product_id;
+       WacomBusType bus;
 
        if (match == NULL)
-               return 0;
-
-       strs = g_strsplit(match, ";", 0);
-       for (i = 0; strs[i] != NULL && *strs[i] != '\0'; i++) {
-               char busstr[64];
-               int vendor_id, product_id;
-               WacomBusType bus;
-               rc = sscanf(strs[i], "%63[^:]:%x:%x", busstr, &vendor_id, 
&product_id);
-               if (rc != 3) {
-                       DBG("failed to match '%s' for product/vendor IDs. 
Skipping.\n", strs[i]);
-                       continue;
-               }
-               bus = bus_from_str (busstr);
+               return FALSE;
 
-               libwacom_update_match(device, bus, vendor_id, product_id);
+       if (g_strcmp0 (match, GENERIC_DEVICE_MATCH) == 0) {
+               libwacom_update_match(device, WBUSTYPE_UNKNOWN, 0, 0);
+               return TRUE;
+       }
 
-               if (nmatches == 0) {
-                       first_bus = bus;
-                       first_vendor_id = vendor_id;
-                       first_product_id = product_id;
-               }
-               nmatches++;
+       rc = sscanf(match, "%63[^:]:%x:%x", busstr, &vendor_id, &product_id);
+       if (rc != 3) {
+               DBG("failed to match '%s' for product/vendor IDs. Skipping.\n", 
match);
+               return 0;
        }
+       bus = bus_from_str (busstr);
 
-       /* set default to first entry */
-       if (nmatches > 1)
-               libwacom_update_match(device, first_bus, first_vendor_id, 
first_product_id);
+       libwacom_update_match(device, bus, vendor_id, product_id);
 
-       g_strfreev(strs);
-       return i;
+       return TRUE;
 }
 
 static void
@@ -397,19 +383,30 @@ libwacom_parse_tablet_keyfile(const char *datadir, const 
char *filename)
 
        device = g_new0 (WacomDevice, 1);
 
-       match = g_key_file_get_string(keyfile, DEVICE_GROUP, "DeviceMatch", 
NULL);
-       if (g_strcmp0 (match, GENERIC_DEVICE_MATCH) == 0) {
-               libwacom_update_match(device, WBUSTYPE_UNKNOWN, 0, 0);
-       } else {
-               if (libwacom_matchstr_to_matches(device, match) == 0) {
-                       DBG("failed to match '%s' for product/vendor IDs in 
'%s'\n", match, path);
-                       g_free (match);
-                       g_free (device);
-                       device = NULL;
-                       goto out;
+       string_list = g_key_file_get_string_list(keyfile, DEVICE_GROUP, 
"DeviceMatch", NULL, NULL);
+       if (string_list) {
+               guint i;
+               guint nmatches = 0;
+               guint first_valid_match = 0;
+               for (i = 0; string_list[i]; i++) {
+                       if (libwacom_matchstr_to_match (device, string_list[i]))
+                               nmatches++;
+                       if (nmatches == 1)
+                               first_valid_match = i;
+               }
+               if (nmatches == 0) {
+                       DBG("failed to match '%s' for product/vendor IDs in 
'%s'\n", string_list[i], path);
+                               g_strfreev (string_list);
+                               g_free (device);
+                               device = NULL;
+                               goto out;
                }
+               if (nmatches > 1) {
+                       /* set default to first entry */
+                       libwacom_matchstr_to_match(device, 
string_list[first_valid_match]);
+               }
+               g_strfreev (string_list);
        }
-       g_free (match);
 
        device->name = g_key_file_get_string(keyfile, DEVICE_GROUP, "Name", 
NULL);
        device->width = g_key_file_get_integer(keyfile, DEVICE_GROUP, "Width", 
NULL);
-- 
2.3.1


------------------------------------------------------------------------------
Dive into the World of Parallel Programming The Go Parallel Website, sponsored
by Intel and developed in partnership with Slashdot Media, is your hub for all
things parallel software development, from weekly thought leadership blogs to
news, videos, case studies, tutorials and more. Take a look and join the 
conversation now. http://goparallel.sourceforge.net/
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to