From 6440336b68b1d387b12a5f2eb9a6fdb5d9e08413 Mon Sep 17 00:00:00 2001 From: Taekyun Kim Date: Wed, 5 Aug 2015 13:31:47 +0900 Subject: [PATCH] pepper: Basic object event implementation 1. Events are identified by 32bit unsigned integer ID. 2. Each object has its own built-in event IDs. 3. Build-in events for generic object are common to all pepper objects. 4. Higher priority listeners are called earlier. Change-Id: Iad5e16a5a297f5a17d5f8b6b5ed15972bfd18d52 --- src/lib/pepper/object.c | 104 ++++++++++++++++++++++++++++++ src/lib/pepper/pepper-internal.h | 16 +++++ src/lib/pepper/pepper.h | 135 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 255 insertions(+) diff --git a/src/lib/pepper/object.c b/src/lib/pepper/object.c index f963201..c8029b5 100644 --- a/src/lib/pepper/object.c +++ b/src/lib/pepper/object.c @@ -76,3 +76,107 @@ pepper_object_add_destroy_listener(pepper_object_t *object, struct wl_listener * { wl_signal_add(&object->destroy_signal, listener); } + +static void +insert_listener(pepper_event_listener_t *listener) +{ + pepper_list_t *l; + + PEPPER_LIST_FOR_EACH(&listener->object->event_listener_list, l) + { + pepper_event_listener_t *pos = l->item; + + if (listener->priority >= pos->priority) + { + pepper_list_insert(&pos->link, &listener->link); + break; + } + } + + if (!listener->link.next) + pepper_list_insert(listener->object->event_listener_list.prev, &listener->link); +} + +PEPPER_API pepper_event_listener_t * +pepper_object_add_event_listener(pepper_object_t *object, uint32_t id, + pepper_event_callback_t callback, int priority, void *data) +{ + pepper_event_listener_t *listener; + pepper_list_t *l; + + if (!callback) + return NULL; + + listener = pepper_calloc(1, sizeof(pepper_event_listener_t)); + if (!listener) + return NULL; + + listener->object = object; + listener->id = id; + listener->callback = callback; + listener->priority = priority; + listener->data = data; + + insert_listener(listener); + return listener; +} + +PEPPER_API pepper_object_t * +pepper_event_listener_get_object(pepper_event_listener_t *listener) +{ + return listener->object; +} + +PEPPER_API uint32_t +pepper_event_listener_get_id(pepper_event_listener_t *listener) +{ + return listener->id; +} + +PEPPER_API pepper_event_callback_t +pepper_event_listener_get_callback(pepper_event_listener_t *listener) +{ + return listener->callback; +} + +PEPPER_API int +pepper_event_listener_get_priority(pepper_event_listener_t *listener) +{ + return listener->priority; +} + +PEPPER_API void * +pepper_event_listener_get_data(pepper_event_listener_t *listener) +{ + return listener->data; +} + +PEPPER_API void +pepper_event_listener_set_priority(pepper_event_listener_t *listener, int priority) +{ + listener->priority = priority; + pepper_list_remove(&listener->link, NULL); + insert_listener(listener); +} + +PEPPER_API void +pepper_event_listener_destroy(pepper_event_listener_t *listener) +{ + pepper_list_remove(&listener->link, NULL); + pepper_free(listener); +} + +void +pepper_object_signal_event(pepper_object_t *object, uint32_t id, void *info) +{ + pepper_event_listener_t *listener; + pepper_list_t *l; + + PEPPER_LIST_FOR_EACH(&object->event_listener_list, l) + { + listener = l->item; + + if (listener->id == id) + listener->callback(listener, object, id, listener->data, info); + } +} diff --git a/src/lib/pepper/pepper-internal.h b/src/lib/pepper/pepper-internal.h index ac15307..c9900dc 100644 --- a/src/lib/pepper/pepper-internal.h +++ b/src/lib/pepper/pepper-internal.h @@ -22,6 +22,7 @@ struct pepper_object pepper_object_type_t type; struct wl_signal destroy_signal; pepper_map_t *user_data_map; + pepper_list_t event_listener_list; }; pepper_object_t * @@ -30,6 +31,21 @@ pepper_object_alloc(pepper_object_type_t type, size_t size); void pepper_object_fini(pepper_object_t *object); +void +pepper_object_signal_event(pepper_object_t *object, uint32_t id, void *info); + +struct pepper_event_listener +{ + pepper_object_t *object; + + uint32_t id; + pepper_event_callback_t callback; + int priority; + void *data; + + pepper_list_t link; +}; + /* compositor */ struct pepper_compositor { diff --git a/src/lib/pepper/pepper.h b/src/lib/pepper/pepper.h index f810f69..6864bf0 100644 --- a/src/lib/pepper/pepper.h +++ b/src/lib/pepper/pepper.h @@ -30,6 +30,14 @@ typedef struct pepper_output_mode pepper_output_mode_t; typedef struct pepper_input_event pepper_input_event_t; typedef struct pepper_event_hook pepper_event_hook_t; +typedef struct pepper_event_listener pepper_event_listener_t; + +typedef pepper_bool_t (*pepper_event_callback_t)(pepper_event_listener_t *listener, + pepper_object_t *object, + uint32_t id, + void *data, + void *info); + struct pepper_output_geometry { int32_t x; @@ -66,6 +74,107 @@ typedef enum pepper_object_type PEPPER_OBJECT_PLANE, } pepper_object_type_t; +enum pepper_object_events +{ + PEPPER_EVENT_OBJECT_DESTROY, +}; + +enum pepper_compositor_events +{ + PEPPER_EVENT_COMPOSITOR_OUTPUT_ADD, + PEPPER_EVENT_COMPOSITOR_OUTPUT_REMOVE, + PEPPER_EVENT_COMPOSITOR_SEAT_ADD, + PEPPER_EVENT_COMPOSITOR_SEAT_REMOVE, + PEPPER_EVENT_COMPOSITOR_SURFACE_ADD, + PEPPER_EVENT_COMPOSITOR_SURFACE_REMOVE, + PEPPER_EVENT_COMPOSITOR_VIEW_ADD, + PEPPER_EVENT_COMPOSITOR_VIEW_REMOVE, + PEPPER_EVENT_COMPOSITOR_POINTER_DEVICE_ADD, + PEPPER_EVENT_COMPOSITOR_POINTER_DEVICE_REMOVE, + PEPPER_EVENT_COMPOSITOR_KEYBOARD_DEVICE_ADD, + PEPPER_EVENT_COMPOSITOR_KEYBOARD_DEVICE_REMOVE, + PEPPER_EVENT_COMPOSITOR_TOUCH_DEVICE_ADD, + PEPPER_EVENT_COMPOSITOR_TOUCH_DEVICE_REMOVE, +}; + +enum pepper_output_events +{ + PEPPER_EVENT_OUTPUT_MODE_CHANGE, + PEPPER_EVENT_OUTPUT_MOVE, +}; + +enum pepper_surface_events +{ + PEPPER_EVENT_SURFACE_COMMIT, +}; + +enum pepper_buffer_events +{ + PEPPER_EVENT_BUFFER_RELEASE, +}; + +enum pepper_view_events +{ + PEPPER_EVENT_VIEW_STACK_CHANGE, +}; + +enum pepper_seat_events +{ + PEPPER_EVENT_SEAT_POINTER_ADD, + PEPPER_EVENT_SEAT_POINTER_REMOVE, + PEPPER_EVENT_SEAT_KEYBOARD_ADD, + PEPPER_EVENT_SEAT_KEYBOARD_REMOVE, + PEPPER_EVENT_SEAT_TOUCH_ADD, + PEPPER_EVENT_SEAT_TOUCH_REMOVE, + + PEPPER_EVENT_SEAT_POINTER_DEVICE_ADD, + PEPPER_EVENT_SEAT_POINTER_DEVICE_REMOVE, + PEPPER_EVENT_SEAT_KEYBOARD_DEVICE_ADD, + PEPPER_EVENT_SEAT_KEYBOARD_DEVICE_REMOVE, + PEPPER_EVENT_SEAT_TOUCH_DEVICE_ADD, + PEPPER_EVENT_SEAT_TOUCH_DEVICE_REMOVE, +}; + +enum pepper_pointer_events +{ + PEPPER_EVENT_POINTER_MOTION, + PEPPER_EVENT_POINTER_BUTTON, + PEPPER_EVENT_POINTER_AXIS, +}; + +enum pepper_keyboard_events +{ + PEPPER_EVENT_KEYBOARD_KEY, + PEPPER_EVENT_KEYBOARD_MODIFIERS, +}; + +enum pepper_touch_events +{ + PEPPER_EVENT_TOUCH_DOWN, + PEPPER_EVENT_TOUCH_UP, + PEPPER_EVENT_TOUCH_MOTION, +}; + +enum pepper_pointer_device_events +{ + PEPPER_EVENT_POINTER_DEVICE_MOTION, + PEPPER_EVENT_POINTER_DEVICE_BUTTON, + PEPPER_EVENT_POINTER_DEVICE_AXIS, +}; + +enum pepper_keyboard_device_events +{ + PEPPER_EVENT_KEYBOARD_DEVICE_KEY, + PEPPER_EVENT_KEYBOARD_DEVICE_MODIFIERS, +}; + +enum pepper_touch_device_events +{ + PEPPER_EVENT_TOUCH_DEVICE_DOWN, + PEPPER_EVENT_TOUCH_DEVICE_UP, + PEPPER_EVENT_TOUCH_DEVICE_MOTION, +}; + /* Generic object functions. */ PEPPER_API pepper_object_type_t pepper_object_get_type(pepper_object_t *object); @@ -80,6 +189,32 @@ pepper_object_get_user_data(pepper_object_t *object, const void *key); PEPPER_API void pepper_object_add_destroy_listener(pepper_object_t *object, struct wl_listener *listener); +PEPPER_API pepper_event_listener_t * +pepper_object_add_event_listener(pepper_object_t *object, + uint32_t id, pepper_event_callback_t callback, + int priority, void *data); + +PEPPER_API pepper_object_t * +pepper_event_listener_get_object(pepper_event_listener_t *listener); + +PEPPER_API uint32_t +pepper_event_listener_get_id(pepper_event_listener_t *listener); + +PEPPER_API pepper_event_callback_t +pepper_event_listener_get_callback(pepper_event_listener_t *listener); + +PEPPER_API int +pepper_event_listener_get_priority(pepper_event_listener_t *listener); + +PEPPER_API void * +pepper_event_listener_get_data(pepper_event_listener_t *listener); + +PEPPER_API void +pepper_event_listener_set_priority(pepper_event_listener_t *listener, int priority); + +PEPPER_API void +pepper_event_listener_destroy(pepper_event_listener_t *listener); + /* Compositor functions. */ PEPPER_API pepper_compositor_t * pepper_compositor_create(const char *socket_name); -- 2.7.4