pepper: Replace object destroy listener with new event listener
authorTaekyun Kim <tkq.kim@samsung.com>
Wed, 5 Aug 2015 08:41:27 +0000 (17:41 +0900)
committerTaekyun Kim <tkq.kim@samsung.com>
Wed, 5 Aug 2015 08:41:27 +0000 (17:41 +0900)
Change-Id: Ib384300eee4c9be4876a2cda014fc7322129dfe6

src/lib/desktop-shell/desktop-shell-internal.h
src/lib/desktop-shell/shell-surface.c
src/lib/pepper/object.c
src/lib/pepper/pepper-internal.h
src/lib/pepper/pepper.h
src/lib/pepper/surface.c
src/lib/pepper/view.c
src/lib/render/gl-renderer.c
src/lib/render/pixman-renderer.c

index 52ceb0b..4d1e1f3 100644 (file)
@@ -22,9 +22,9 @@ struct desktop_shell
     struct wl_list           shell_surface_list;
 
     /* TODO: */
-    struct wl_listener       seat_create_listener;
-    struct wl_listener       output_create_listener;
-    struct wl_listener       output_change_listener;
+    pepper_event_listener_t  seat_create_listener;
+    pepper_event_listener_t  output_create_listener;
+    pepper_event_listener_t  output_change_listener;
 };
 
 struct shell_client
@@ -124,8 +124,8 @@ struct shell_surface
     pepper_bool_t           ack_configure;
 
     /* Listeners */
-    struct wl_listener      surface_destroy_listener;
-    struct wl_listener      surface_commit_listener;
+    pepper_event_listener_t surface_destroy_listener;
+    pepper_event_listener_t surface_commit_listener;
 
     struct wl_list          link;       /* link */
 };
index d0f4fbf..bb81846 100644 (file)
@@ -14,37 +14,37 @@ remove_ping_timer(shell_client_t *shell_client)
 static void
 shsurf_stop_listen_commit_event(shell_surface_t *shsurf)
 {
-    wl_list_remove(&shsurf->surface_commit_listener.link);
-    wl_list_init(&shsurf->surface_commit_listener.link);
+    pepper_event_listener_remove(&shsurf->surface_commit_listener);
 }
 
-static void
-handle_surface_commit(struct wl_listener *listener, void *data)
+static pepper_bool_t
+handle_surface_commit(pepper_event_listener_t *listener,
+                      pepper_object_t *surface, uint32_t id, void *info)
 {
-    shell_surface_t *shsurf =
-        pepper_container_of(listener, shell_surface_t, surface_commit_listener);
+    shell_surface_t *shsurf = listener->data;
 
     if (!shsurf->mapped && shsurf->ack_configure && shsurf->shell_surface_map)
         shsurf->shell_surface_map(shsurf);
+
+    return PEPPER_TRUE;
 }
 
 static void
 shsurf_start_listen_commit_event(shell_surface_t *shsurf)
 {
-    shsurf->surface_commit_listener.notify = handle_surface_commit;
-    wl_list_init(&shsurf->surface_commit_listener.link);
-    /* TODO: Need new API: pepper_surface_add_commit_listener() */
+    pepper_object_add_event_listener((pepper_object_t *)shsurf->surface,
+                                     &shsurf->surface_commit_listener,
+                                     PEPPER_EVENT_SURFACE_COMMIT, 0);
 }
 
-static void
-handle_surface_destroy(struct wl_listener *listener, void *data)
+static pepper_bool_t
+handle_surface_destroy(pepper_event_listener_t *listener,
+                       pepper_object_t *surface, uint32_t id, void *info)
 {
     shell_surface_t *child, *tmp;
-    shell_surface_t *shsurf =
-        pepper_container_of(listener, shell_surface_t, surface_destroy_listener);
-
-    wl_list_remove(&shsurf->surface_destroy_listener.link);
+    shell_surface_t *shsurf = listener->data;
 
+    pepper_event_listener_remove(&shsurf->surface_destroy_listener);
     shsurf_stop_listen_commit_event(shsurf);
 
     if (shsurf->resource)
@@ -70,6 +70,7 @@ handle_surface_destroy(struct wl_listener *listener, void *data)
         pepper_view_destroy(shsurf->fullscreen.background_view);
 
     free(shsurf);
+    return PEPPER_TRUE;
 }
 
 static void
@@ -195,10 +196,16 @@ shell_surface_create(shell_client_t *shell_client, pepper_surface_t *surface,
 
     wl_resource_set_implementation(shsurf->resource, implementation, shsurf, handle_resource_destroy);
 
-    shsurf->surface_destroy_listener.notify = handle_surface_destroy;
-    pepper_object_add_destroy_listener((pepper_object_t *)surface, &shsurf->surface_destroy_listener);
+    shsurf->surface_destroy_listener.callback = handle_surface_destroy;
+    shsurf->surface_destroy_listener.data = shsurf;
+    pepper_object_add_event_listener((pepper_object_t *)surface,
+                                     &shsurf->surface_destroy_listener,
+                                     PEPPER_EVENT_OBJECT_DESTROY, 0);
 
     shell_surface_set_type(shsurf, SHELL_SURFACE_TYPE_NONE);
+
+    shsurf->surface_commit_listener.callback = handle_surface_commit;
+    shsurf->surface_commit_listener.data = shsurf;
     shsurf_start_listen_commit_event(shsurf);
 
     /* Set shell_surface_t to pepper_surface_t */
index c1221c9..33767a8 100644 (file)
@@ -32,7 +32,6 @@ pepper_object_alloc(pepper_object_type_t type, size_t size)
         return NULL;
 
     object->type = type;
-    wl_signal_init(&object->destroy_signal);
     object->user_data_map = pepper_map_create(5, user_data_hash, user_data_key_length,
                                               user_data_key_compare);
 
@@ -48,7 +47,7 @@ pepper_object_alloc(pepper_object_type_t type, size_t size)
 void
 pepper_object_fini(pepper_object_t *object)
 {
-    wl_signal_emit(&object->destroy_signal, (void *)object);
+    pepper_object_emit_event(object, PEPPER_EVENT_OBJECT_DESTROY, NULL);
     pepper_map_destroy(object->user_data_map);
 }
 
@@ -71,12 +70,6 @@ pepper_object_get_user_data(pepper_object_t *object, const void *key)
     return pepper_map_get(object->user_data_map, key);
 }
 
-PEPPER_API void
-pepper_object_add_destroy_listener(pepper_object_t *object, struct wl_listener *listener)
-{
-    wl_signal_add(&object->destroy_signal, listener);
-}
-
 static void
 insert_listener(pepper_object_t *object, pepper_event_listener_t *listener)
 {
@@ -104,8 +97,9 @@ pepper_event_listener_init(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_object_add_event_listener(pepper_object_t *object,
+                                 pepper_event_listener_t *listener,
+                                 uint32_t id, int priority)
 {
     listener->object    = object;
     listener->id        = id;
index 54170a4..f8c2a9f 100644 (file)
@@ -20,7 +20,6 @@ typedef struct pepper_data_offer    pepper_data_offer_t;
 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;
 };
@@ -107,20 +106,20 @@ pepper_buffer_from_resource(struct wl_resource *resource);
 
 struct pepper_surface_state
 {
-    pepper_buffer_t    *buffer;
-    int32_t             x;
-    int32_t             y;
-    pepper_bool_t       newly_attached;
+    pepper_buffer_t        *buffer;
+    int32_t                 x;
+    int32_t                 y;
+    pepper_bool_t           newly_attached;
 
-    int32_t             transform;
-    int32_t             scale;
+    int32_t                 transform;
+    int32_t                 scale;
 
-    pixman_region32_t   damage_region;
-    pixman_region32_t   opaque_region;
-    pixman_region32_t   input_region;
+    pixman_region32_t       damage_region;
+    pixman_region32_t       opaque_region;
+    pixman_region32_t       input_region;
 
-    struct wl_list      frame_callbacks;
-    struct wl_listener  buffer_destroy_listener;
+    struct wl_list          frame_callbacks;
+    pepper_event_listener_t buffer_destroy_listener;
 };
 
 struct pepper_surface
@@ -310,7 +309,7 @@ struct pepper_plane_entry
     pepper_render_item_t    base;
 
     pepper_plane_t         *plane;
-    struct wl_listener      plane_destroy_listener;
+    pepper_event_listener_t plane_destroy_listener;
     pepper_bool_t           need_damage;
 
     pepper_list_t           link;
@@ -353,7 +352,7 @@ struct pepper_view
     /* Content. */
     pepper_surface_t       *surface;
     pepper_list_t           surface_link;
-    struct wl_listener      surface_destroy_listener;
+    pepper_event_listener_t surface_destroy_listener;
 
     /* Output info. */
     uint32_t                output_overlap;
index 5175c7b..d24509d 100644 (file)
@@ -201,8 +201,9 @@ PEPPER_API void
 pepper_event_listener_init(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_object_add_event_listener(pepper_object_t *object,
+                                 pepper_event_listener_t *listener,
+                                 uint32_t id, int priority);
 
 PEPPER_API void
 pepper_event_listener_remove(pepper_event_listener_t *listener);
index 9b521c4..6c133ac 100644 (file)
@@ -1,12 +1,12 @@
 #include "pepper-internal.h"
 
-static void
-buffer_destroy_handler(struct wl_listener *listener, void *data)
+static pepper_bool_t
+buffer_destroy_handler(pepper_event_listener_t *listener,
+                       pepper_object_t *object, uint32_t id, void *info)
 {
-    pepper_surface_state_t *state =
-        pepper_container_of(listener, pepper_surface_state_t, buffer_destroy_listener);
-
+    pepper_surface_state_t *state = listener->data;
     state->buffer = NULL;
+    return PEPPER_TRUE;
 }
 
 static void
@@ -23,7 +23,8 @@ pepper_surface_state_init(pepper_surface_state_t *state)
     pixman_region32_init(&state->input_region);
 
     wl_list_init(&state->frame_callbacks);
-    state->buffer_destroy_listener.notify = buffer_destroy_handler;
+    state->buffer_destroy_listener.callback = buffer_destroy_handler;
+    state->buffer_destroy_listener.data = state;
 }
 
 static void
@@ -76,7 +77,7 @@ surface_attach(struct wl_client    *client,
         return;
 
     if (surface->pending.buffer)
-        wl_list_remove(&surface->pending.buffer_destroy_listener.link);
+        pepper_event_listener_remove(&surface->pending.buffer_destroy_listener);
 
     surface->pending.buffer = buffer;
     surface->pending.x = x;
@@ -84,7 +85,10 @@ surface_attach(struct wl_client    *client,
     surface->pending.newly_attached = PEPPER_TRUE;
 
     if (buffer)
-        pepper_object_add_destroy_listener(&buffer->base, &surface->pending.buffer_destroy_listener);
+    {
+        pepper_object_add_event_listener(&buffer->base, &surface->pending.buffer_destroy_listener,
+                                         PEPPER_EVENT_OBJECT_DESTROY, 0);
+    }
 }
 
 static void
@@ -355,7 +359,7 @@ pepper_surface_commit(pepper_surface_t *surface)
     {
         if (surface->pending.buffer)
         {
-            wl_list_remove(&surface->pending.buffer_destroy_listener.link);
+            pepper_event_listener_remove(&surface->pending.buffer_destroy_listener);
             pepper_buffer_reference(surface->pending.buffer);
         }
 
index 1826604..8e8da82 100644 (file)
@@ -69,12 +69,14 @@ pepper_view_surface_damage(pepper_view_t *view)
     }
 }
 
-static void
-view_handle_surface_destroy(struct wl_listener *listener, void *data)
+static pepper_bool_t
+view_handle_surface_destroy(pepper_event_listener_t *listener,
+                            pepper_object_t *object, uint32_t id, void *info)
 {
-    pepper_view_t *view = pepper_container_of(listener, pepper_view_t, surface_destroy_listener);
+    pepper_view_t *view = listener->data;
     PEPPER_ASSERT(view->surface != NULL);
     pepper_view_destroy(view);
+    return PEPPER_TRUE;
 }
 
 static pepper_list_t *
@@ -100,8 +102,9 @@ view_insert(pepper_view_t *view, pepper_list_t *pos, pepper_bool_t subtree)
     return pos;
 }
 
-static void
-view_handle_plane_destroy(struct wl_listener *listener, void *data);
+static pepper_bool_t
+view_handle_plane_destroy(pepper_event_listener_t *listener,
+                          pepper_object_t *object, uint32_t id, void *info);
 
 static void
 plane_entry_set_plane(pepper_plane_entry_t *entry, pepper_plane_t *plane)
@@ -113,7 +116,7 @@ plane_entry_set_plane(pepper_plane_entry_t *entry, pepper_plane_t *plane)
     {
         view_damage_below((pepper_view_t *)entry->base.view);
         entry->plane = NULL;
-        wl_list_remove(&entry->plane_destroy_listener.link);
+        pepper_event_listener_remove(&entry->plane_destroy_listener);
         pixman_region32_fini(&entry->base.visible_region);
     }
 
@@ -121,21 +124,24 @@ plane_entry_set_plane(pepper_plane_entry_t *entry, pepper_plane_t *plane)
 
     if (entry->plane)
     {
-        entry->plane_destroy_listener.notify = view_handle_plane_destroy;
-        pepper_object_add_destroy_listener(&plane->base, &entry->plane_destroy_listener);
+        entry->plane_destroy_listener.callback = view_handle_plane_destroy;
+        entry->plane_destroy_listener.data = entry;
+        pepper_object_add_event_listener(&plane->base,
+                                         &entry->plane_destroy_listener,
+                                         PEPPER_EVENT_OBJECT_DESTROY, 0);
         pixman_region32_init(&entry->base.visible_region);
         entry->need_damage = PEPPER_TRUE;
     }
 }
 
-static void
-view_handle_plane_destroy(struct wl_listener *listener, void *data)
+static pepper_bool_t
+view_handle_plane_destroy(pepper_event_listener_t *listener,
+                          pepper_object_t *object, uint32_t id, void *info)
 {
-    pepper_plane_entry_t *entry =
-        pepper_container_of(listener, pepper_plane_entry_t, plane_destroy_listener);
-
+    pepper_plane_entry_t *entry = listener->data;
     PEPPER_ASSERT(entry->plane != NULL);
     plane_entry_set_plane(entry, NULL);
+    return PEPPER_TRUE;
 }
 
 void
@@ -296,8 +302,11 @@ pepper_compositor_add_surface_view(pepper_compositor_t *compositor, pepper_surfa
     view->surface = surface;
     view->surface_link.item = view;
     pepper_list_insert(&surface->view_list, &view->surface_link);
-    view->surface_destroy_listener.notify = view_handle_surface_destroy;
-    pepper_object_add_destroy_listener(&surface->base, &view->surface_destroy_listener);
+
+    view->surface_destroy_listener.callback = view_handle_surface_destroy;
+    view->surface_destroy_listener.data = view;
+    pepper_object_add_event_listener(&surface->base, &view->surface_destroy_listener,
+                                     PEPPER_EVENT_OBJECT_DESTROY, 0);
 
     return view;
 }
@@ -329,7 +338,7 @@ pepper_view_destroy(pepper_view_t *view)
     if (view->surface)
     {
         pepper_list_remove(&view->surface_link, NULL);
-        wl_list_remove(&view->surface_destroy_listener.link);
+        pepper_event_listener_remove(&view->surface_destroy_listener);
     }
 
     pixman_region32_fini(&view->opaque_region);
index e53cd9e..00e0575 100644 (file)
@@ -116,8 +116,8 @@ struct gl_surface_state
         int                     pitch;
     } shm;
 
-    struct wl_listener  buffer_destroy_listener;
-    struct wl_listener  surface_destroy_listener;
+    pepper_event_listener_t buffer_destroy_listener;
+    pepper_event_listener_t surface_destroy_listener;
 };
 
 static pepper_bool_t
@@ -171,29 +171,33 @@ surface_state_release_buffer(gl_surface_state_t *state)
         pepper_buffer_unreference(state->buffer);
         state->buffer = NULL;
 
-        wl_list_remove(&state->buffer_destroy_listener.link);
+        pepper_event_listener_remove(&state->buffer_destroy_listener);
     }
 }
 
-static void
-surface_state_handle_surface_destroy(struct wl_listener *listener, void *data)
+static pepper_bool_t
+surface_state_handle_surface_destroy(pepper_event_listener_t    *listener,
+                                    pepper_object_t            *object,
+                                    uint32_t                    id,
+                                    void                       *info)
 {
-    gl_surface_state_t *state =
-        pepper_container_of(listener, gl_surface_state_t, surface_destroy_listener);
-
+    gl_surface_state_t *state = listener->data;
     surface_state_release_buffer(state);
-    wl_list_remove(&state->surface_destroy_listener.link);
+    pepper_event_listener_remove(&state->surface_destroy_listener);
     pepper_object_set_user_data((pepper_object_t *)state->surface, state->renderer, NULL, NULL);
     free(state);
+    return PEPPER_TRUE;
 }
 
-static void
-surface_state_handle_buffer_destroy(struct wl_listener *listener, void *data)
+static pepper_bool_t
+surface_state_handle_buffer_destroy(pepper_event_listener_t    *listener,
+                                    pepper_object_t            *object,
+                                    uint32_t                    id,
+                                    void                       *info)
 {
-    gl_surface_state_t *state =
-        pepper_container_of(listener, gl_surface_state_t, buffer_destroy_listener);
-
+    gl_surface_state_t *state = listener->data;
     surface_state_release_buffer(state);
+    return PEPPER_TRUE;
 }
 
 static gl_surface_state_t *
@@ -208,11 +212,17 @@ get_surface_state(pepper_renderer_t *renderer, pepper_surface_t *surface)
             return NULL;
 
         state->surface = surface;
-        state->buffer_destroy_listener.notify = surface_state_handle_buffer_destroy;
-        state->surface_destroy_listener.notify = surface_state_handle_surface_destroy;
 
-        pepper_object_add_destroy_listener((pepper_object_t *)surface,
-                                           &state->surface_destroy_listener);
+        state->buffer_destroy_listener.callback = surface_state_handle_buffer_destroy;
+        state->buffer_destroy_listener.data = state;
+
+        state->surface_destroy_listener.callback = surface_state_handle_surface_destroy;
+        state->surface_destroy_listener.data = state;
+
+        pepper_object_add_event_listener((pepper_object_t *)surface,
+                                         &state->surface_destroy_listener,
+                                         PEPPER_EVENT_OBJECT_DESTROY, 0);
+
         pepper_object_set_user_data((pepper_object_t *)surface, renderer, state, NULL);
     }
 
@@ -429,12 +439,13 @@ done:
     if (state->buffer)
     {
         pepper_buffer_unreference(state->buffer);
-        wl_list_remove(&state->buffer_destroy_listener.link);
+        pepper_event_listener_remove(&state->buffer_destroy_listener);
     }
 
     /* Set new buffer. */
     state->buffer = buffer;
-    pepper_object_add_destroy_listener((pepper_object_t *)buffer, &state->buffer_destroy_listener);
+    pepper_object_add_event_listener((pepper_object_t *)buffer, &state->buffer_destroy_listener,
+                                     PEPPER_EVENT_OBJECT_DESTROY, 0);
 
     /* Output buffer size info. */
     *w = state->buffer_width;
index 1ba61c6..ab9fa09 100644 (file)
@@ -26,8 +26,8 @@ struct pixman_surface_state
     int                 buffer_width, buffer_height;
     pixman_image_t     *image;
 
-    struct wl_listener  buffer_destroy_listener;
-    struct wl_listener  surface_destroy_listener;
+    pepper_event_listener_t buffer_destroy_listener;
+    pepper_event_listener_t surface_destroy_listener;
 };
 
 static void
@@ -52,29 +52,35 @@ surface_state_release_buffer(pixman_surface_state_t *state)
         pepper_buffer_unreference(state->buffer);
         state->buffer = NULL;
 
-        wl_list_remove(&state->buffer_destroy_listener.link);
+        pepper_event_listener_remove(&state->buffer_destroy_listener);
     }
 }
 
-static void
-surface_state_handle_surface_destroy(struct wl_listener *listener, void *data)
+static pepper_bool_t
+surface_state_handle_surface_destroy(pepper_event_listener_t    *listener,
+                                     pepper_object_t            *object,
+                                     uint32_t                    id,
+                                     void                       *info)
 {
-    pixman_surface_state_t *state =
-        pepper_container_of(listener, pixman_surface_state_t, surface_destroy_listener);
+    pixman_surface_state_t *state = listener->data;
 
     surface_state_release_buffer(state);
-    wl_list_remove(&state->surface_destroy_listener.link);
+    pepper_event_listener_remove(&state->surface_destroy_listener);
     pepper_object_set_user_data((pepper_object_t *)state->surface, state->renderer, NULL, NULL);
     free(state);
+
+    return PEPPER_TRUE;
 }
 
-static void
-surface_state_handle_buffer_destroy(struct wl_listener *listener, void *data)
+static pepper_bool_t
+surface_state_handle_buffer_destroy(pepper_event_listener_t    *listener,
+                                    pepper_object_t            *object,
+                                    uint32_t                    id,
+                                    void                       *info)
 {
-    pixman_surface_state_t *state =
-        pepper_container_of(listener, pixman_surface_state_t, buffer_destroy_listener);
-
+    pixman_surface_state_t *state = listener->data;
     surface_state_release_buffer(state);
+    return PEPPER_TRUE;
 }
 
 static pixman_surface_state_t *
@@ -89,11 +95,17 @@ get_surface_state(pepper_renderer_t *renderer, pepper_surface_t *surface)
             return NULL;
 
         state->surface = surface;
-        state->buffer_destroy_listener.notify = surface_state_handle_buffer_destroy;
-        state->surface_destroy_listener.notify = surface_state_handle_surface_destroy;
 
-        pepper_object_add_destroy_listener((pepper_object_t *)surface,
-                                           &state->surface_destroy_listener);
+        state->buffer_destroy_listener.callback = surface_state_handle_buffer_destroy;
+        state->buffer_destroy_listener.data = state;
+
+        state->surface_destroy_listener.callback = surface_state_handle_surface_destroy;
+        state->surface_destroy_listener.data = state;
+
+        pepper_object_add_event_listener((pepper_object_t *)surface,
+                                         &state->surface_destroy_listener,
+                                         PEPPER_EVENT_OBJECT_DESTROY, 0);
+
         pepper_object_set_user_data((pepper_object_t *)surface, renderer, state, NULL);
     }
 
@@ -173,12 +185,13 @@ done:
     if (state->buffer)
     {
         pepper_buffer_unreference(state->buffer);
-        wl_list_remove(&state->buffer_destroy_listener.link);
+        pepper_event_listener_remove(&state->buffer_destroy_listener);
     }
 
     /* Set new buffer. */
     state->buffer = buffer;
-    pepper_object_add_destroy_listener((pepper_object_t *)buffer, &state->buffer_destroy_listener);
+    pepper_object_add_event_listener((pepper_object_t *)buffer, &state->buffer_destroy_listener,
+                                     PEPPER_EVENT_OBJECT_DESTROY, 0);
 
     /* Output buffer size info. */
     *w = state->buffer_width;