pepper: Make pepper_event_listener_t an opaque pointer type
authorTaekyun Kim <tkq.kim@samsung.com>
Wed, 12 Aug 2015 04:52:10 +0000 (13:52 +0900)
committerTaekyun Kim <tkq.kim@samsung.com>
Wed, 12 Aug 2015 04:52:10 +0000 (13:52 +0900)
Exposing structure through an API header file might be dangerous.

Change-Id: If2dde1657820b3a9feb2bbe065f1b86e3360da11

src/lib/desktop-shell/desktop-shell-internal.h
src/lib/desktop-shell/shell-surface.c
src/lib/pepper/input.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 4d1e1f3..28dfb8b 100644 (file)
@@ -22,9 +22,9 @@ struct desktop_shell
     struct wl_list           shell_surface_list;
 
     /* TODO: */
-    pepper_event_listener_t  seat_create_listener;
-    pepper_event_listener_t  output_create_listener;
-    pepper_event_listener_t  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 */
-    pepper_event_listener_t surface_destroy_listener;
-    pepper_event_listener_t surface_commit_listener;
+    pepper_event_listener_t *surface_destroy_listener;
+    pepper_event_listener_t *surface_commit_listener;
 
     struct wl_list          link;       /* link */
 };
index cac5fa7..16ad5c9 100644 (file)
@@ -14,37 +14,36 @@ remove_ping_timer(shell_client_t *shell_client)
 static void
 shsurf_stop_listen_commit_event(shell_surface_t *shsurf)
 {
-    pepper_event_listener_remove(&shsurf->surface_commit_listener);
+    pepper_event_listener_remove(shsurf->surface_commit_listener);
 }
 
-static pepper_bool_t
+static void
 handle_surface_commit(pepper_event_listener_t *listener,
-                      pepper_object_t *surface, uint32_t id, void *info)
+                      pepper_object_t *surface, uint32_t id, void *info, void *data)
 {
-    shell_surface_t *shsurf = listener->data;
+    shell_surface_t *shsurf = 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)
 {
-    pepper_object_add_event_listener((pepper_object_t *)shsurf->surface,
-                                     &shsurf->surface_commit_listener,
-                                     PEPPER_EVENT_SURFACE_COMMIT, 0);
+    shsurf->surface_commit_listener =
+        pepper_object_add_event_listener((pepper_object_t *)shsurf->surface,
+                                         PEPPER_EVENT_SURFACE_COMMIT, 0,
+                                         handle_surface_commit, shsurf);
 }
 
-static pepper_bool_t
+static void
 handle_surface_destroy(pepper_event_listener_t *listener,
-                       pepper_object_t *surface, uint32_t id, void *info)
+                       pepper_object_t *surface, uint32_t id, void *info, void *data)
 {
     shell_surface_t *child, *tmp;
-    shell_surface_t *shsurf = listener->data;
+    shell_surface_t *shsurf = data;
 
-    pepper_event_listener_remove(&shsurf->surface_destroy_listener);
+    pepper_event_listener_remove(shsurf->surface_destroy_listener);
     shsurf_stop_listen_commit_event(shsurf);
 
     if (shsurf->resource)
@@ -70,7 +69,6 @@ handle_surface_destroy(pepper_event_listener_t *listener,
         pepper_view_destroy(shsurf->fullscreen.background_view);
 
     free(shsurf);
-    return PEPPER_TRUE;
 }
 
 static void
@@ -196,18 +194,11 @@ shell_surface_create(shell_client_t *shell_client, pepper_surface_t *surface,
 
     wl_resource_set_implementation(shsurf->resource, implementation, shsurf, handle_resource_destroy);
 
-    pepper_event_listener_init(&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);
+    shsurf->surface_destroy_listener =
+        pepper_object_add_event_listener((pepper_object_t *)surface, PEPPER_EVENT_OBJECT_DESTROY, 0,
+                                         handle_surface_destroy, shsurf);
 
     shell_surface_set_type(shsurf, SHELL_SURFACE_TYPE_NONE);
-
-    pepper_event_listener_init(&shsurf->surface_commit_listener);
-    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 15f2eb2..319b29f 100644 (file)
@@ -9,7 +9,7 @@ struct pepper_input_device_entry
 {
     pepper_seat_t              *seat;
     pepper_input_device_t      *device;
-    pepper_event_listener_t     listener;
+    pepper_event_listener_t    *listener;
     pepper_list_t               link;
 };
 
@@ -291,11 +291,11 @@ seat_update_caps(pepper_seat_t *seat)
     }
 }
 
-static pepper_bool_t
+static void
 seat_handle_device_event(pepper_event_listener_t *listener, pepper_object_t *object,
-                         uint32_t id, void *info)
+                         uint32_t id, void *info, void *data)
 {
-    pepper_input_device_entry_t *entry = listener->data;
+    pepper_input_device_entry_t *entry = data;
 
     switch (id)
     {
@@ -333,8 +333,6 @@ seat_handle_device_event(pepper_event_listener_t *listener, pepper_object_t *obj
         /* TODO: */
         break;
     }
-
-    return PEPPER_TRUE;
 }
 
 PEPPER_API void
@@ -352,11 +350,8 @@ pepper_seat_add_input_device(pepper_seat_t *seat, pepper_input_device_t *device)
     entry->seat = seat;
     entry->device = device;
 
-    pepper_event_listener_init(&entry->listener);
-    entry->listener.data = entry;
-    entry->listener.callback = seat_handle_device_event;
-
-    pepper_object_add_event_listener(&device->base, &entry->listener, PEPPER_EVENT_ALL, 0);
+    entry->listener = pepper_object_add_event_listener(&device->base, PEPPER_EVENT_ALL, 0,
+                                                       seat_handle_device_event, entry);
     pepper_list_insert(&seat->input_device_list, &entry->link);
 
     seat_update_caps(seat);
@@ -374,7 +369,7 @@ pepper_seat_remove_input_device(pepper_seat_t *seat, pepper_input_device_t *devi
         if (entry->device == device)
         {
             pepper_list_remove(&entry->link, NULL);
-            pepper_event_listener_remove(&entry->listener);
+            pepper_event_listener_remove(entry->listener);
             pepper_free(entry);
             seat_update_caps(seat);
             return;
index 56e2bf4..c00b56a 100644 (file)
@@ -91,21 +91,25 @@ insert_listener(pepper_object_t *object, pepper_event_listener_t *listener)
         pepper_list_insert(object->event_listener_list.prev, &listener->link);
 }
 
-PEPPER_API void
-pepper_event_listener_init(pepper_event_listener_t *listener)
+PEPPER_API pepper_event_listener_t *
+pepper_object_add_event_listener(pepper_object_t *object, uint32_t id, int priority,
+                                 pepper_event_callback_t callback, void *data)
 {
-    memset(listener, 0x00, sizeof(pepper_event_listener_t));
-    listener->link.item = listener;
-}
+    pepper_event_listener_t *listener;
 
-PEPPER_API void
-pepper_object_add_event_listener(pepper_object_t *object,
-                                 pepper_event_listener_t *listener,
-                                 uint32_t id, int priority)
-{
+    if (!callback)
+        return NULL;
+
+    listener = pepper_calloc(1, sizeof(pepper_event_listener_t));
+    if (!listener)
+        return NULL;
+
+    listener->link.item = listener;
     listener->object    = object;
     listener->id        = id;
     listener->priority  = priority;
+    listener->callback  = callback;
+    listener->data      = data;
 
     insert_listener(object, listener);
 }
@@ -113,11 +117,8 @@ pepper_object_add_event_listener(pepper_object_t *object,
 PEPPER_API void
 pepper_event_listener_remove(pepper_event_listener_t *listener)
 {
-    if (!listener->object)
-        return;
-
     pepper_list_remove(&listener->link, NULL);
-    listener->object = NULL;
+    pepper_free(listener);
 }
 
 PEPPER_API void
@@ -142,6 +143,6 @@ pepper_object_emit_event(pepper_object_t *object, uint32_t id, void *info)
         listener = l->item;
 
         if (listener->id == PEPPER_EVENT_ALL || listener->id == id)
-            listener->callback(listener, object, id, info);
+            listener->callback(listener, object, id, listener->data, info);
     }
 }
index 4b2bca5..10a96ed 100644 (file)
@@ -35,6 +35,17 @@ pepper_object_init(pepper_object_t *object, pepper_object_type_t type);
 void
 pepper_object_fini(pepper_object_t *object);
 
+struct pepper_event_listener
+{
+    pepper_object_t             *object;
+    uint32_t                    id;
+    int                         priority;
+    pepper_event_callback_t     callback;
+    void                       *data;
+
+    pepper_list_t               link;
+};
+
 /* compositor */
 struct pepper_compositor
 {
@@ -112,20 +123,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;
-    pepper_event_listener_t buffer_destroy_listener;
+    struct wl_list              frame_callbacks;
+    pepper_event_listener_t    *buffer_destroy_listener;
 };
 
 struct pepper_surface
@@ -279,13 +290,13 @@ pepper_data_device_manager_init(struct wl_display *display);
 
 struct pepper_plane_entry
 {
-    pepper_render_item_t    base;
+    pepper_render_item_t        base;
 
-    pepper_plane_t         *plane;
-    pepper_event_listener_t plane_destroy_listener;
-    pepper_bool_t           need_damage;
+    pepper_plane_t             *plane;
+    pepper_event_listener_t    *plane_destroy_listener;
+    pepper_bool_t               need_damage;
 
-    pepper_list_t           link;
+    pepper_list_t               link;
 };
 
 enum
@@ -297,42 +308,42 @@ enum
 
 struct pepper_view
 {
-    pepper_object_t         base;
-    pepper_compositor_t    *compositor;
-    pepper_list_t           compositor_link;
+    pepper_object_t             base;
+    pepper_compositor_t        *compositor;
+    pepper_list_t               compositor_link;
 
-    uint32_t                dirty;
+    uint32_t                    dirty;
 
     /* Hierarchy. */
-    pepper_view_t          *parent;
-    pepper_list_t           parent_link;
-    pepper_list_t           children_list;
+    pepper_view_t              *parent;
+    pepper_list_t               parent_link;
+    pepper_list_t               children_list;
 
     /* Geometry. */
-    double                  x, y;
-    int                     w, h;
-    pepper_mat4_t           transform;
-    pepper_mat4_t           global_transform;
+    double                      x, y;
+    int                         w, h;
+    pepper_mat4_t               transform;
+    pepper_mat4_t               global_transform;
 
-    pixman_region32_t       bounding_region;
-    pixman_region32_t       opaque_region;
+    pixman_region32_t           bounding_region;
+    pixman_region32_t           opaque_region;
 
     /* Visibility. */
-    pepper_bool_t           visible;
-    pepper_bool_t           prev_visible;
-    pepper_bool_t           mapped;
+    pepper_bool_t               visible;
+    pepper_bool_t               prev_visible;
+    pepper_bool_t               mapped;
 
     /* Content. */
-    pepper_surface_t       *surface;
-    pepper_list_t           surface_link;
-    pepper_event_listener_t surface_destroy_listener;
+    pepper_surface_t           *surface;
+    pepper_list_t               surface_link;
+    pepper_event_listener_t    *surface_destroy_listener;
 
     /* Output info. */
-    uint32_t                output_overlap;
-    pepper_plane_entry_t    plane_entries[PEPPER_MAX_OUTPUT_COUNT];
+    uint32_t                    output_overlap;
+    pepper_plane_entry_t        plane_entries[PEPPER_MAX_OUTPUT_COUNT];
 
     /* Temporary resource. */
-    pepper_list_t           link;
+    pepper_list_t               link;
 };
 
 void
index a2f188c..2428eba 100644 (file)
@@ -25,8 +25,6 @@ typedef struct pepper_touch                     pepper_touch_t;
 typedef struct pepper_output_geometry           pepper_output_geometry_t;
 typedef struct pepper_output_mode               pepper_output_mode_t;
 
-typedef struct pepper_event_listener            pepper_event_listener_t;
-
 typedef struct pepper_input_device              pepper_input_device_t;
 typedef struct pepper_input_device_backend      pepper_input_device_backend_t;
 
@@ -38,6 +36,10 @@ typedef struct pepper_touch_down_event          pepper_touch_down_event_t;
 typedef struct pepper_touch_up_event            pepper_touch_up_event_t;
 typedef struct pepper_touch_motion_event        pepper_touch_motion_event_t;
 
+typedef struct pepper_event_listener            pepper_event_listener_t;
+typedef void (*pepper_event_callback_t)(pepper_event_listener_t *listener, pepper_object_t *object,
+                                        uint32_t id, void *info, void *data);
+
 struct pepper_output_geometry
 {
     int32_t     x;
@@ -72,22 +74,6 @@ 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,
@@ -216,13 +202,9 @@ 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 void
-pepper_event_listener_init(pepper_event_listener_t *listener);
-
-PEPPER_API void
-pepper_object_add_event_listener(pepper_object_t *object,
-                                 pepper_event_listener_t *listener,
-                                 uint32_t id, int priority);
+PEPPER_API pepper_event_listener_t *
+pepper_object_add_event_listener(pepper_object_t *object, uint32_t id, int priority,
+                                 pepper_event_callback_t callback, void *data);
 
 PEPPER_API void
 pepper_event_listener_remove(pepper_event_listener_t *listener);
index fec2527..4ebe4db 100644 (file)
@@ -1,12 +1,11 @@
 #include "pepper-internal.h"
 
-static pepper_bool_t
-buffer_destroy_handler(pepper_event_listener_t *listener,
-                       pepper_object_t *object, uint32_t id, void *info)
+static void
+surface_state_handle_buffer_destroy(pepper_event_listener_t *listener,
+                                    pepper_object_t *object, uint32_t id, void *info, void *data)
 {
-    pepper_surface_state_t *state = listener->data;
+    pepper_surface_state_t *state = data;
     state->buffer = NULL;
-    return PEPPER_TRUE;
 }
 
 static void
@@ -23,9 +22,6 @@ pepper_surface_state_init(pepper_surface_state_t *state)
     pixman_region32_init(&state->input_region);
 
     wl_list_init(&state->frame_callbacks);
-    pepper_event_listener_init(&state->buffer_destroy_listener);
-    state->buffer_destroy_listener.callback = buffer_destroy_handler;
-    state->buffer_destroy_listener.data = state;
 }
 
 static void
@@ -78,7 +74,7 @@ surface_attach(struct wl_client    *client,
         return;
 
     if (surface->pending.buffer)
-        pepper_event_listener_remove(&surface->pending.buffer_destroy_listener);
+        pepper_event_listener_remove(surface->pending.buffer_destroy_listener);
 
     surface->pending.buffer = buffer;
     surface->pending.x = x;
@@ -87,8 +83,9 @@ surface_attach(struct wl_client    *client,
 
     if (buffer)
     {
-        pepper_object_add_event_listener(&buffer->base, &surface->pending.buffer_destroy_listener,
-                                         PEPPER_EVENT_OBJECT_DESTROY, 0);
+        surface->pending.buffer_destroy_listener =
+            pepper_object_add_event_listener(&buffer->base, PEPPER_EVENT_OBJECT_DESTROY, 0,
+                                             surface_state_handle_buffer_destroy, &surface->pending);
     }
 }
 
@@ -360,7 +357,7 @@ pepper_surface_commit(pepper_surface_t *surface)
     {
         if (surface->pending.buffer)
         {
-            pepper_event_listener_remove(&surface->pending.buffer_destroy_listener);
+            pepper_event_listener_remove(surface->pending.buffer_destroy_listener);
             pepper_buffer_reference(surface->pending.buffer);
         }
 
index 1e4f34a..d8c9d25 100644 (file)
@@ -69,14 +69,13 @@ pepper_view_surface_damage(pepper_view_t *view)
     }
 }
 
-static pepper_bool_t
+static void
 view_handle_surface_destroy(pepper_event_listener_t *listener,
-                            pepper_object_t *object, uint32_t id, void *info)
+                            pepper_object_t *object, uint32_t id, void *info, void *data)
 {
-    pepper_view_t *view = listener->data;
+    pepper_view_t *view = data;
     PEPPER_ASSERT(view->surface != NULL);
     pepper_view_destroy(view);
-    return PEPPER_TRUE;
 }
 
 static pepper_list_t *
@@ -103,9 +102,9 @@ view_insert(pepper_view_t *view, pepper_list_t *pos, pepper_bool_t subtree)
     return pos;
 }
 
-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_handle_plane_destroy(pepper_event_listener_t *listener,
+                                 pepper_object_t *object, uint32_t id, void *info, void *data);
 
 static void
 plane_entry_set_plane(pepper_plane_entry_t *entry, pepper_plane_t *plane)
@@ -117,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;
-        pepper_event_listener_remove(&entry->plane_destroy_listener);
+        pepper_event_listener_remove(entry->plane_destroy_listener);
         pixman_region32_fini(&entry->base.visible_region);
     }
 
@@ -125,25 +124,22 @@ plane_entry_set_plane(pepper_plane_entry_t *entry, pepper_plane_t *plane)
 
     if (entry->plane)
     {
-        pepper_event_listener_init(&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);
+        entry->plane_destroy_listener =
+            pepper_object_add_event_listener(&plane->base, PEPPER_EVENT_OBJECT_DESTROY, 0,
+                                             plane_entry_handle_plane_destroy, entry);
+
         pixman_region32_init(&entry->base.visible_region);
         entry->need_damage = PEPPER_TRUE;
     }
 }
 
-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_handle_plane_destroy(pepper_event_listener_t *listener,
+                                 pepper_object_t *object, uint32_t id, void *info, void *data)
 {
-    pepper_plane_entry_t *entry = listener->data;
+    pepper_plane_entry_t *entry = data;
     PEPPER_ASSERT(entry->plane != NULL);
     plane_entry_set_plane(entry, NULL);
-    return PEPPER_TRUE;
 }
 
 void
@@ -305,11 +301,9 @@ pepper_compositor_add_surface_view(pepper_compositor_t *compositor, pepper_surfa
     view->surface_link.item = view;
     pepper_list_insert(&surface->view_list, &view->surface_link);
 
-    pepper_event_listener_init(&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);
+    view->surface_destroy_listener =
+        pepper_object_add_event_listener(&surface->base, PEPPER_EVENT_OBJECT_DESTROY, 0,
+                                         view_handle_surface_destroy, view);
 
     return view;
 }
@@ -334,7 +328,7 @@ pepper_view_destroy(pepper_view_t *view)
     if (view->surface)
     {
         pepper_list_remove(&view->surface_link, NULL);
-        pepper_event_listener_remove(&view->surface_destroy_listener);
+        pepper_event_listener_remove(view->surface_destroy_listener);
     }
 
     pixman_region32_fini(&view->opaque_region);
index 666c4fa..4527fb3 100644 (file)
@@ -116,8 +116,8 @@ struct gl_surface_state
         int                     pitch;
     } shm;
 
-    pepper_event_listener_t buffer_destroy_listener;
-    pepper_event_listener_t surface_destroy_listener;
+    pepper_event_listener_t *buffer_destroy_listener;
+    pepper_event_listener_t *surface_destroy_listener;
 };
 
 static pepper_bool_t
@@ -171,33 +171,33 @@ surface_state_release_buffer(gl_surface_state_t *state)
         pepper_buffer_unreference(state->buffer);
         state->buffer = NULL;
 
-        pepper_event_listener_remove(&state->buffer_destroy_listener);
+        pepper_event_listener_remove(state->buffer_destroy_listener);
     }
 }
 
-static pepper_bool_t
+static void
 surface_state_handle_surface_destroy(pepper_event_listener_t    *listener,
                                     pepper_object_t            *object,
                                     uint32_t                    id,
-                                    void                       *info)
+                                    void                       *info,
+                                    void                       *data)
 {
-    gl_surface_state_t *state = listener->data;
+    gl_surface_state_t *state = data;
     surface_state_release_buffer(state);
-    pepper_event_listener_remove(&state->surface_destroy_listener);
+    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 pepper_bool_t
+static void
 surface_state_handle_buffer_destroy(pepper_event_listener_t    *listener,
                                     pepper_object_t            *object,
                                     uint32_t                    id,
-                                    void                       *info)
+                                    void                       *info,
+                                    void                       *data)
 {
-    gl_surface_state_t *state = listener->data;
+    gl_surface_state_t *state = data;
     surface_state_release_buffer(state);
-    return PEPPER_TRUE;
 }
 
 static gl_surface_state_t *
@@ -212,18 +212,10 @@ get_surface_state(pepper_renderer_t *renderer, pepper_surface_t *surface)
             return NULL;
 
         state->surface = surface;
-
-        pepper_event_listener_init(&state->buffer_destroy_listener);
-        state->buffer_destroy_listener.callback = surface_state_handle_buffer_destroy;
-        state->buffer_destroy_listener.data = state;
-
-        pepper_event_listener_init(&state->surface_destroy_listener);
-        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);
+        state->surface_destroy_listener =
+            pepper_object_add_event_listener((pepper_object_t *)surface,
+                                             PEPPER_EVENT_OBJECT_DESTROY, 0,
+                                             surface_state_handle_surface_destroy, state);
 
         pepper_object_set_user_data((pepper_object_t *)surface, renderer, state, NULL);
     }
@@ -441,13 +433,14 @@ done:
     if (state->buffer)
     {
         pepper_buffer_unreference(state->buffer);
-        pepper_event_listener_remove(&state->buffer_destroy_listener);
+        pepper_event_listener_remove(state->buffer_destroy_listener);
     }
 
     /* Set new buffer. */
     state->buffer = buffer;
-    pepper_object_add_event_listener((pepper_object_t *)buffer, &state->buffer_destroy_listener,
-                                     PEPPER_EVENT_OBJECT_DESTROY, 0);
+    state->buffer_destroy_listener =
+        pepper_object_add_event_listener((pepper_object_t *)buffer, PEPPER_EVENT_OBJECT_DESTROY, 0,
+                                         surface_state_handle_buffer_destroy, state);
 
     /* Output buffer size info. */
     *w = state->buffer_width;
index 156d9d0..f938f8e 100644 (file)
@@ -26,8 +26,8 @@ struct pixman_surface_state
     int                 buffer_width, buffer_height;
     pixman_image_t     *image;
 
-    pepper_event_listener_t buffer_destroy_listener;
-    pepper_event_listener_t surface_destroy_listener;
+    pepper_event_listener_t *buffer_destroy_listener;
+    pepper_event_listener_t *surface_destroy_listener;
 };
 
 static void
@@ -52,35 +52,34 @@ surface_state_release_buffer(pixman_surface_state_t *state)
         pepper_buffer_unreference(state->buffer);
         state->buffer = NULL;
 
-        pepper_event_listener_remove(&state->buffer_destroy_listener);
+        pepper_event_listener_remove(state->buffer_destroy_listener);
     }
 }
 
-static pepper_bool_t
+static void
 surface_state_handle_surface_destroy(pepper_event_listener_t    *listener,
                                      pepper_object_t            *object,
                                      uint32_t                    id,
-                                     void                       *info)
+                                     void                       *info,
+                                     void                       *data)
 {
-    pixman_surface_state_t *state = listener->data;
+    pixman_surface_state_t *state = data;
 
     surface_state_release_buffer(state);
-    pepper_event_listener_remove(&state->surface_destroy_listener);
+    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 pepper_bool_t
+static void
 surface_state_handle_buffer_destroy(pepper_event_listener_t    *listener,
                                     pepper_object_t            *object,
                                     uint32_t                    id,
-                                    void                       *info)
+                                    void                       *info,
+                                    void                       *data)
 {
-    pixman_surface_state_t *state = listener->data;
+    pixman_surface_state_t *state = data;
     surface_state_release_buffer(state);
-    return PEPPER_TRUE;
 }
 
 static pixman_surface_state_t *
@@ -95,18 +94,10 @@ get_surface_state(pepper_renderer_t *renderer, pepper_surface_t *surface)
             return NULL;
 
         state->surface = surface;
-
-        pepper_event_listener_init(&state->buffer_destroy_listener);
-        state->buffer_destroy_listener.callback = surface_state_handle_buffer_destroy;
-        state->buffer_destroy_listener.data = state;
-
-        pepper_event_listener_init(&state->surface_destroy_listener);
-        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);
+        state->surface_destroy_listener =
+            pepper_object_add_event_listener((pepper_object_t *)surface,
+                                             PEPPER_EVENT_OBJECT_DESTROY, 0,
+                                             surface_state_handle_surface_destroy, state);
 
         pepper_object_set_user_data((pepper_object_t *)surface, renderer, state, NULL);
     }
@@ -187,13 +178,14 @@ done:
     if (state->buffer)
     {
         pepper_buffer_unreference(state->buffer);
-        pepper_event_listener_remove(&state->buffer_destroy_listener);
+        pepper_event_listener_remove(state->buffer_destroy_listener);
     }
 
     /* Set new buffer. */
     state->buffer = buffer;
-    pepper_object_add_event_listener((pepper_object_t *)buffer, &state->buffer_destroy_listener,
-                                     PEPPER_EVENT_OBJECT_DESTROY, 0);
+    state->buffer_destroy_listener =
+        pepper_object_add_event_listener((pepper_object_t *)buffer, PEPPER_EVENT_OBJECT_DESTROY, 0,
+                                         surface_state_handle_buffer_destroy, state);
 
     /* Output buffer size info. */
     *w = state->buffer_width;