From bea8e89cc7dd63c7188631d0a3c42ae3c523da2e Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Fri, 25 Sep 2015 16:05:26 +0200 Subject: [PATCH] ratbagd: create libratbag_device contexts Make sure to create libratbag_device contexts for each device we add. If libratbag returns NULL, we just ignore the devices. Otherwise, we keep the context around and manage the device. Signed-off-by: David Herrmann --- src/ratbagd-device.c | 10 +++++++++- src/ratbagd.c | 19 +++++++++++-------- src/ratbagd.h | 3 ++- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/ratbagd-device.c b/src/ratbagd-device.c index 8c54951f..b63552d1 100644 --- a/src/ratbagd-device.c +++ b/src/ratbagd-device.c @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -38,6 +39,7 @@ struct ratbagd_device { struct ratbagd *ctx; RBNode node; char *name; + struct ratbag_device *lib_device; }; #define ratbagd_device_from_node(_ptr) \ @@ -117,7 +119,8 @@ static const sd_bus_vtable ratbagd_device_vtable[] = { int ratbagd_device_new(struct ratbagd_device **out, struct ratbagd *ctx, - const char *name) + const char *name, + struct ratbag_device *lib_device) { _cleanup_(ratbagd_device_freep) struct ratbagd_device *device = NULL; @@ -131,6 +134,7 @@ int ratbagd_device_new(struct ratbagd_device **out, device->ctx = ctx; rbnode_init(&device->node); + device->lib_device = ratbag_device_ref(lib_device); device->name = strdup(name); if (!device->name) @@ -148,7 +152,11 @@ struct ratbagd_device *ratbagd_device_free(struct ratbagd_device *device) assert(!ratbagd_device_linked(device)); + device->lib_device = ratbag_device_unref(device->lib_device); device->name = mfree(device->name); + + assert(!device->lib_device); /* ratbag yields !NULL if still pinned */ + return mfree(device); } diff --git a/src/ratbagd.c b/src/ratbagd.c index e9efc681..437d98ce 100644 --- a/src/ratbagd.c +++ b/src/ratbagd.c @@ -37,18 +37,12 @@ static void ratbagd_process_device(struct ratbagd *ctx, struct udev_device *udevice) { + struct ratbag_device *lib_device; struct ratbagd_device *device; const char *name; int r; /* - * TODO: So far we just enumerate udev input devices and add a new - * ratbag device for each one we find. That's a bit easy. We - * should really try to create a libratbag device for the udev - * device and only add devices that are actually accepted. - * Furthermore, the libratbag object should really be kept as - * context in ratbagd_device. - * * TODO: libratbag should provide some mechanism to allow * device-grouping, just like libinput does. If multiple input * devices belong to the same virtual device, we should not add @@ -73,7 +67,16 @@ static void ratbagd_process_device(struct ratbagd *ctx, /* device already known, refresh our view of the device */ } else { /* device unknown, create new one and link it */ - r = ratbagd_device_new(&device, ctx, name); + lib_device = ratbag_device_new_from_udev_device(ctx->lib_ctx, + udevice); + if (!lib_device) + return; /* unsupported device */ + + r = ratbagd_device_new(&device, ctx, name, lib_device); + + /* the ratbagd_device takes its own reference, drop ours */ + ratbag_device_unref(lib_device); + if (r < 0) { fprintf(stderr, "Cannot track device '%s'\n", name); return; diff --git a/src/ratbagd.h b/src/ratbagd.h index bed93389..687e1aad 100644 --- a/src/ratbagd.h +++ b/src/ratbagd.h @@ -45,7 +45,8 @@ struct ratbagd_device; int ratbagd_device_new(struct ratbagd_device **out, struct ratbagd *ctx, - const char *name); + const char *name, + struct ratbag_device *lib_device); struct ratbagd_device *ratbagd_device_free(struct ratbagd_device *device); bool ratbagd_device_linked(struct ratbagd_device *device); void ratbagd_device_link(struct ratbagd_device *device);