diff options
author | Kirill Primak <vyivel@posteo.net> | 2021-08-11 13:35:20 +0300 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2021-08-11 18:12:57 +0200 |
commit | 111d4eafd795e603f652b426d2cb3dae1d8692dc (patch) | |
tree | b022f3a94da8d7adc4a885755324c42ae5be6daf /util | |
parent | debd6c5f0b3dd864ae02cd3aa77123851c47d380 (diff) |
util/addon: find both by owner and impl
This allows to have multiple addons of different types with the same
owner.
Diffstat (limited to 'util')
-rw-r--r-- | util/addon.c | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/util/addon.c b/util/addon.c index 7de54a73..d9e13978 100644 --- a/util/addon.c +++ b/util/addon.c @@ -18,11 +18,11 @@ void wlr_addon_set_finish(struct wlr_addon_set *set) { void wlr_addon_init(struct wlr_addon *addon, struct wlr_addon_set *set, const void *owner, const struct wlr_addon_interface *impl) { - assert(owner); + assert(owner && impl); struct wlr_addon *iter; wl_list_for_each(iter, &set->addons, link) { - if (iter->owner == addon->owner) { - assert(0 && "Can't have two addons with the same owner"); + if (iter->owner == addon->owner && iter->impl == addon->impl) { + assert(0 && "Can't have two addons of the same type with the same owner"); } } wl_list_insert(&set->addons, &addon->link); @@ -31,17 +31,15 @@ void wlr_addon_init(struct wlr_addon *addon, struct wlr_addon_set *set, } void wlr_addon_finish(struct wlr_addon *addon) { - if (addon->owner) { - addon->owner = NULL; - wl_list_remove(&addon->link); - } + wl_list_remove(&addon->link); + wl_list_init(&addon->link); } -struct wlr_addon *wlr_addon_find_by_owner(struct wlr_addon_set *set, - const void *owner) { +struct wlr_addon *wlr_addon_find(struct wlr_addon_set *set, const void *owner, + const struct wlr_addon_interface *impl) { struct wlr_addon *addon; wl_list_for_each(addon, &set->addons, link) { - if (addon->owner == owner) { + if (addon->owner == owner && addon->impl == impl) { return addon; } } |