util: add wlr_addon
This commit is contained in:
		
							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; | ||||
| } | ||||
|  | @ -1,4 +1,5 @@ | |||
| wlr_files += files( | ||||
| 	'addon.c', | ||||
| 	'array.c', | ||||
| 	'box.c', | ||||
| 	'global.c', | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue