}
static void
-insert_listener(pepper_event_listener_t *listener)
+insert_listener(pepper_object_t *object, pepper_event_listener_t *listener)
{
pepper_list_t *l;
- PEPPER_LIST_FOR_EACH(&listener->object->event_listener_list, l)
+ PEPPER_LIST_FOR_EACH(&object->event_listener_list, l)
{
pepper_event_listener_t *pos = l->item;
if (listener->priority >= pos->priority)
{
- pepper_list_insert(&pos->link, &listener->link);
+ pepper_list_insert(pos->link.prev, &listener->link);
break;
}
}
if (!listener->link.next)
- pepper_list_insert(listener->object->event_listener_list.prev, &listener->link);
+ pepper_list_insert(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_API void
+pepper_event_listener_init(pepper_event_listener_t *listener)
{
- 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;
+ memset(listener, 0x00, sizeof(pepper_event_listener_t));
+}
+PEPPER_API void
+pepper_event_listener_insert(pepper_event_listener_t *listener,
+ pepper_object_t *object, uint32_t id, int priority)
+{
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;
+ insert_listener(object, listener);
}
PEPPER_API void
-pepper_event_listener_set_priority(pepper_event_listener_t *listener, int priority)
+pepper_event_listener_remove(pepper_event_listener_t *listener)
{
- listener->priority = priority;
+ if (!listener->object)
+ return;
+
pepper_list_remove(&listener->link, NULL);
- insert_listener(listener);
+ listener->object = NULL;
}
PEPPER_API void
-pepper_event_listener_destroy(pepper_event_listener_t *listener)
+pepper_event_listener_set_priority(pepper_event_listener_t *listener, int priority)
{
+ if (!listener->object)
+ return;
+
+ listener->priority = priority;
pepper_list_remove(&listener->link, NULL);
- pepper_free(listener);
+ insert_listener(listener->object, listener);
}
PEPPER_API void
-pepper_object_signal_event(pepper_object_t *object, uint32_t id, void *info)
+pepper_object_emit_event(pepper_object_t *object, uint32_t id, void *info)
{
pepper_event_listener_t *listener;
pepper_list_t *l;
listener = l->item;
if (listener->id == id)
- listener->callback(listener, object, id, listener->data, info);
+ listener->callback(listener, object, id, info);
}
}
typedef struct pepper_output_geometry pepper_output_geometry_t;
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;
PEPPER_OBJECT_PLANE,
} pepper_object_type_t;
+struct pepper_event_listener
+{
+ void *data;
+
+ pepper_bool_t (*callback)(pepper_event_listener_t *listener,
+ pepper_object_t *object,
+ uint32_t id,
+ void *info);
+
+ /* Don't touch these variables. Used by pepepr internally. */
+ pepper_object_t *object;
+ uint32_t id;
+ int priority;
+ pepper_list_t link;
+};
+
enum pepper_object_events
{
PEPPER_EVENT_OBJECT_DESTROY,
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_init(pepper_event_listener_t *listener);
-PEPPER_API void *
-pepper_event_listener_get_data(pepper_event_listener_t *listener);
+PEPPER_API void
+pepper_event_listener_insert(pepper_event_listener_t *listener,
+ pepper_object_t *object, uint32_t id, int priority);
PEPPER_API void
-pepper_event_listener_set_priority(pepper_event_listener_t *listener, int priority);
+pepper_event_listener_remove(pepper_event_listener_t *listener);
PEPPER_API void
-pepper_event_listener_destroy(pepper_event_listener_t *listener);
+pepper_event_listener_set_priority(pepper_event_listener_t *listener, int priority);
PEPPER_API void
-pepper_object_signal_event(pepper_object_t *object, uint32_t id, void *info);
+pepper_object_emit_event(pepper_object_t *object, uint32_t id, void *info);
/* Compositor functions. */
PEPPER_API pepper_compositor_t *