ratbagd: add device iterator

Add iterators for ratbagd_device objects.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
This commit is contained in:
David Herrmann
2015-09-29 13:22:13 +02:00
parent 9ac799bc95
commit 65463b6efb
2 changed files with 28 additions and 5 deletions

View File

@@ -347,11 +347,30 @@ struct ratbagd_device *ratbagd_device_lookup(struct ratbagd *ctx,
return NULL;
}
struct ratbagd_device *ratbagd_device_first(struct ratbagd *ctx)
{
struct RBNode *node;
assert(ctx);
node = rbtree_first(&ctx->device_map);
return node ? ratbagd_device_from_node(node) : NULL;
}
struct ratbagd_device *ratbagd_device_next(struct ratbagd_device *device)
{
struct RBNode *node;
assert(device);
node = rbnode_next(&device->node);
return node ? ratbagd_device_from_node(node) : NULL;
}
int ratbagd_device_list(struct ratbagd *ctx, char ***paths)
{
struct ratbagd_device *device;
char **devices, **pos;
RBNode *node;
devices = calloc(ctx->n_devices + 1, sizeof(char *));
if (!devices)
@@ -359,10 +378,7 @@ int ratbagd_device_list(struct ratbagd *ctx, char ***paths)
pos = devices;
for (node = rbtree_first(&ctx->device_map);
node;
node = rbnode_next(node)) {
device = ratbagd_device_from_node(node);
RATBAGD_DEVICE_FOREACH(device, ctx) {
*pos = strdup(device->path);
if (!*pos)
goto error;

View File

@@ -74,8 +74,15 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(struct ratbagd_device *, ratbagd_device_free);
struct ratbagd_device *ratbagd_device_lookup(struct ratbagd *ctx,
const char *name);
struct ratbagd_device *ratbagd_device_first(struct ratbagd *ctx);
struct ratbagd_device *ratbagd_device_next(struct ratbagd_device *device);
int ratbagd_device_list(struct ratbagd *ctx, char ***paths);
#define RATBAGD_DEVICE_FOREACH(_device, _ctx) \
for ((_device) = ratbagd_device_first(_ctx); \
(_device); \
(_device) = ratbagd_device_next(_device))
/*
* Context
*/