parent
							
								
									604674dc54
								
							
						
					
					
						commit
						a6a80850b7
					
				| @ -0,0 +1,43 @@ | |||||||
|  | /*
 | ||||||
|  |  * This an unstable interface of wlroots. No guarantees are made regarding the | ||||||
|  |  * future consistency of this API. | ||||||
|  |  */ | ||||||
|  | #ifndef WLR_USE_UNSTABLE | ||||||
|  | #error "Add -DWLR_USE_UNSTABLE to enable unstable wlroots features" | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifndef WLR_UTIL_ADDON_H | ||||||
|  | #define WLR_UTIL_ADDON_H | ||||||
|  | 
 | ||||||
|  | #include <wayland-server-core.h> | ||||||
|  | 
 | ||||||
|  | struct wlr_addon_set { | ||||||
|  | 	// private state
 | ||||||
|  | 	struct wl_list addons; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct wlr_addon; | ||||||
|  | 
 | ||||||
|  | struct wlr_addon_interface { | ||||||
|  | 	const char *name; | ||||||
|  | 	void (*destroy)(struct wlr_addon *addon); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct wlr_addon { | ||||||
|  | 	const struct wlr_addon_interface *impl; | ||||||
|  | 	// private state
 | ||||||
|  | 	const void *owner; | ||||||
|  | 	struct wl_list link; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | void wlr_addon_set_init(struct wlr_addon_set *set); | ||||||
|  | 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); | ||||||
|  | void wlr_addon_finish(struct wlr_addon *addon); | ||||||
|  | 
 | ||||||
|  | struct wlr_addon *wlr_addon_find_by_owner(struct wlr_addon_set *set, | ||||||
|  | 		const void *owner); | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
| @ -0,0 +1,49 @@ | |||||||
|  | #include <assert.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <wayland-server-core.h> | ||||||
|  | 
 | ||||||
|  | #include "wlr/util/addon.h" | ||||||
|  | 
 | ||||||
|  | void wlr_addon_set_init(struct wlr_addon_set *set) { | ||||||
|  | 	wl_list_init(&set->addons); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void wlr_addon_set_finish(struct wlr_addon_set *set) { | ||||||
|  | 	struct wlr_addon *addon, *tmp; | ||||||
|  | 	wl_list_for_each_safe(addon, tmp, &set->addons, link) { | ||||||
|  | 		wlr_addon_finish(addon); | ||||||
|  | 		addon->impl->destroy(addon); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void wlr_addon_init(struct wlr_addon *addon, struct wlr_addon_set *set, | ||||||
|  | 		const void *owner, const struct wlr_addon_interface *impl) { | ||||||
|  | 	assert(owner); | ||||||
|  | 	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"); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	wl_list_insert(&set->addons, &addon->link); | ||||||
|  | 	addon->owner = owner; | ||||||
|  | 	addon->impl = impl; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void wlr_addon_finish(struct wlr_addon *addon) { | ||||||
|  | 	if (addon->owner) { | ||||||
|  | 		addon->owner = NULL; | ||||||
|  | 		wl_list_remove(&addon->link); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | struct wlr_addon *wlr_addon_find_by_owner(struct wlr_addon_set *set, | ||||||
|  | 		const void *owner) { | ||||||
|  | 	struct wlr_addon *addon; | ||||||
|  | 	wl_list_for_each(addon, &set->addons, link) { | ||||||
|  | 		if (addon->owner == owner) { | ||||||
|  | 			return addon; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return NULL; | ||||||
|  | } | ||||||
					Loading…
					
					
				
		Reference in new issue