{
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);
+ }
+}
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;
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);
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);