pepper: Expose event listener structure and some cleanups
authorTaekyun Kim <tkq.kim@samsung.com>
Wed, 5 Aug 2015 08:02:03 +0000 (17:02 +0900)
committerTaekyun Kim <tkq.kim@samsung.com>
Wed, 5 Aug 2015 08:02:03 +0000 (17:02 +0900)
Event listeners might be frequently inserted/removed. Allocating memory for
each operation might be expensive. Exposing the structure can save such memory
allocations.

* Usage
    pepper_event_listener_init(&listener);
    listener.data = &my_data;
    listener.callback = foo;
    pepper_event_listener_insert(&listener, object, id, priority);

    ...

    pepper_event_listener_remove(&listener);

Change-Id: I1868eae03c0943ee641cade3ace54440ac3f963b

src/lib/pepper/object.c
src/lib/pepper/pepper-internal.h
src/lib/pepper/pepper.h

index fd600fe..c1221c9 100644 (file)
@@ -78,96 +78,65 @@ pepper_object_add_destroy_listener(pepper_object_t *object, struct wl_listener *
 }
 
 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;
@@ -177,6 +146,6 @@ pepper_object_signal_event(pepper_object_t *object, uint32_t id, void *info)
         listener = l->item;
 
         if (listener->id == id)
-            listener->callback(listener, object, id, listener->data, info);
+            listener->callback(listener, object, id, info);
     }
 }
index c96ed66..54170a4 100644 (file)
@@ -31,18 +31,6 @@ pepper_object_alloc(pepper_object_type_t type, size_t size);
 void
 pepper_object_fini(pepper_object_t *object);
 
-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
 {
@@ -293,9 +281,6 @@ struct pepper_touch_device
     void                       *data;
 };
 
-void
-pepper_seat_update_modifier(pepper_seat_t *seat, pepper_input_event_t *event);
-
 /* Data device */
 struct pepper_data_source
 {
index 500a9ea..5175c7b 100644 (file)
@@ -27,17 +27,9 @@ typedef struct pepper_touch_device      pepper_touch_device_t;
 
 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;
@@ -74,6 +66,22 @@ typedef enum pepper_object_type
     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,
@@ -189,34 +197,21 @@ 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_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 *