diff --git a/src/etekcity.c b/src/etekcity.c index 52760b61..726a8193 100644 --- a/src/etekcity.c +++ b/src/etekcity.c @@ -27,6 +27,12 @@ #include "libratbag-private.h" +static int +etekcity_probe(struct ratbag *ratbag, const struct ratbag_id id) +{ + return 0; +} + static const struct ratbag_id etekcity_table[] = { {.id = { .bustype = BUS_USB, .vendor = USB_VENDOR_ID_ETEKCITY, @@ -40,4 +46,5 @@ static const struct ratbag_id etekcity_table[] = { struct ratbag_driver etekcity_driver = { .name = "EtekCity", .table_ids = etekcity_table, + .probe = etekcity_probe, }; diff --git a/src/libratbag-private.h b/src/libratbag-private.h index 7adabbc9..716e51da 100644 --- a/src/libratbag-private.h +++ b/src/libratbag-private.h @@ -57,6 +57,8 @@ struct ratbag_driver { char *name; const struct ratbag_id *table_ids; + int (*probe)(struct ratbag *ratbag, const struct ratbag_id id); + /* private */ struct list link; }; diff --git a/src/libratbag.c b/src/libratbag.c index 9b777a91..7b7fdf34 100644 --- a/src/libratbag.c +++ b/src/libratbag.c @@ -203,17 +203,28 @@ ratbag_match_id(const struct input_id *dev_id, const struct input_id *match_id) } static struct ratbag_driver * -ratbag_find_driver(struct libratbag *libratbag, const struct input_id *dev_id) +ratbag_find_driver(struct libratbag *libratbag, struct ratbag *ratbag, + const struct input_id *dev_id) { struct ratbag_driver *driver; const struct ratbag_id *matching_id; + struct ratbag_id matched_id; + int rc; list_for_each(driver, &libratbag->drivers, link) { log_debug(libratbag, "testing against %s\n", driver->name); matching_id = driver->table_ids; do { if (ratbag_match_id(dev_id, &matching_id->id)) { - return driver; + assert(driver->probe); + matched_id.id = *dev_id; + matched_id.data = matching_id->data; + rc = driver->probe(ratbag, matched_id); + if (rc == 0) + return driver; + + if (rc != -ENODEV) + return NULL; } matching_id++; } while (matching_id->id.bustype != 0 || @@ -264,7 +275,7 @@ ratbag_new_from_fd(struct libratbag *libratbag, int fd) if (rc) goto out_err; - driver = ratbag_find_driver(libratbag, &ids); + driver = ratbag_find_driver(libratbag, ratbag, &ids); if (!driver) { errno = ENOTSUP; goto err_udev;