The add_notification_remove_layer API accepts a simple
wl_listener instead of a ivi-shell specific notification
function. Therefore, the API is renamed to add_listener_remove_layer.

This change has several advantages:
1. Code cleanup
2. No dynamic memory allocation. Listeners are allocated
   by controller plugins
3. Remove API is not needed. Controller plugins can easily
   remove the listener link.

Signed-off-by: Emre Ucan <[email protected]>
---
 ivi-shell/ivi-layout-export.h    |    4 +---
 ivi-shell/ivi-layout.c           |   39 ++++++--------------------------------
 tests/ivi_layout-internal-test.c |   19 ++++++++++++-------
 3 files changed, 19 insertions(+), 43 deletions(-)

diff --git a/ivi-shell/ivi-layout-export.h b/ivi-shell/ivi-layout-export.h
index 5b31733..b7837c6 100644
--- a/ivi-shell/ivi-layout-export.h
+++ b/ivi-shell/ivi-layout-export.h
@@ -337,9 +337,7 @@ struct ivi_layout_interface {
        /**
         * \brief register/unregister for notification when ivi_layer is removed
         */
-       int32_t (*add_notification_remove_layer)(
-                               layer_remove_notification_func callback,
-                               void *userdata);
+       int32_t (*add_listener_remove_layer)(struct wl_listener *listener);
 
        void (*remove_notification_remove_layer)(
                                layer_remove_notification_func callback,
diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c
index 0913f43..66f5b02 100644
--- a/ivi-shell/ivi-layout.c
+++ b/ivi-shell/ivi-layout.c
@@ -931,23 +931,6 @@ clear_surface_order_list(struct ivi_layout_layer *ivilayer)
 }
 
 static void
-layer_removed(struct wl_listener *listener, void *data)
-{
-       struct ivi_layout_layer *ivilayer = data;
-
-       struct listener_layout_notification *notification =
-               container_of(listener,
-                            struct listener_layout_notification,
-                            listener);
-
-       struct ivi_layout_notification_callback *removed_callback =
-               notification->userdata;
-
-       ((layer_remove_notification_func)removed_callback->callback)
-               (ivilayer, removed_callback->data);
-}
-
-static void
 surface_removed(struct wl_listener *listener, void *data)
 {
        struct ivi_layout_surface *ivisurface = data;
@@ -1051,28 +1034,18 @@ ivi_layout_add_listener_create_layer(struct wl_listener 
*listener)
 }
 
 static int32_t
-ivi_layout_add_notification_remove_layer(layer_remove_notification_func 
callback,
-                                        void *userdata)
+ivi_layout_add_listener_remove_layer(struct wl_listener *listener)
 {
        struct ivi_layout *layout = get_instance();
-       struct ivi_layout_notification_callback *removed_callback = NULL;
 
-       if (callback == NULL) {
-               weston_log("ivi_layout_add_notification_remove_layer: invalid 
argument\n");
+       if (listener == NULL) {
+               weston_log("ivi_layout_add_listener_remove_layer: invalid 
argument\n");
                return IVI_FAILED;
        }
 
-       removed_callback = malloc(sizeof *removed_callback);
-       if (removed_callback == NULL) {
-               weston_log("fails to allocate memory\n");
-               return IVI_FAILED;
-       }
+       wl_signal_add(&layout->layer_notification.removed, listener);
 
-       removed_callback->callback = callback;
-       removed_callback->data = userdata;
-       return add_notification(&layout->layer_notification.removed,
-                               layer_removed,
-                               removed_callback);
+       return IVI_SUCCEEDED;
 }
 
 static void
@@ -2181,7 +2154,7 @@ static struct ivi_layout_interface ivi_layout_interface = 
{
         * layer controller interfaces
         */
        .add_listener_create_layer                      = 
ivi_layout_add_listener_create_layer,
-       .add_notification_remove_layer          = 
ivi_layout_add_notification_remove_layer,
+       .add_listener_remove_layer              = 
ivi_layout_add_listener_remove_layer,
        .remove_notification_remove_layer       = 
ivi_layout_remove_notification_remove_layer,
        .layer_create_with_dimension            = 
ivi_layout_layer_create_with_dimension,
        .layer_destroy                          = ivi_layout_layer_destroy,
diff --git a/tests/ivi_layout-internal-test.c b/tests/ivi_layout-internal-test.c
index 500aa99..49a682a 100644
--- a/tests/ivi_layout-internal-test.c
+++ b/tests/ivi_layout-internal-test.c
@@ -44,6 +44,7 @@ struct test_context {
 
        struct wl_listener layer_property_changed;
        struct wl_listener layer_created;
+       struct wl_listener layer_removed;
 };
 
 static void
@@ -767,11 +768,13 @@ test_layer_create_notification(struct test_context *ctx)
 }
 
 static void
-test_layer_remove_notification_callback(struct ivi_layout_layer *ivilayer,
-                                       void *userdata)
+test_layer_remove_notification_callback(struct wl_listener *listener, void 
*data)
 {
-       struct test_context *ctx = userdata;
+       struct test_context *ctx =
+                       container_of(listener, struct test_context,
+                                       layer_removed);
        const struct ivi_layout_interface *lyt = ctx->layout_interface;
+       struct ivi_layout_layer *ivilayer = (struct ivi_layout_layer*) data;
        const struct ivi_layout_layer_properties *prop =
                lyt->get_properties_of_layer(ivilayer);
 
@@ -793,17 +796,19 @@ test_layer_remove_notification(struct test_context *ctx)
        struct ivi_layout_layer *ivilayers[LAYER_NUM] = {};
 
        ctx->user_flags = 0;
+       ctx->layer_removed.notify = test_layer_remove_notification_callback;
 
        ivilayers[0] = lyt->layer_create_with_dimension(layers[0], 200, 300);
-       iassert(lyt->add_notification_remove_layer(
-                   test_layer_remove_notification_callback, ctx) == 
IVI_SUCCEEDED);
+       iassert(lyt->add_listener_remove_layer(&ctx->layer_removed) == 
IVI_SUCCEEDED);
        lyt->layer_destroy(ivilayers[0]);
 
        iassert(ctx->user_flags == 1);
 
        ctx->user_flags = 0;
        ivilayers[1] = lyt->layer_create_with_dimension(layers[1], 250, 350);
-       
lyt->remove_notification_remove_layer(test_layer_remove_notification_callback, 
ctx);
+
+       // remove layer property changed listener.
+       wl_list_remove(&ctx->layer_removed.link);
        lyt->layer_destroy(ivilayers[1]);
 
        iassert(ctx->user_flags == 0);
@@ -860,7 +865,7 @@ test_layer_bad_remove_notification(struct test_context *ctx)
 {
        const struct ivi_layout_interface *lyt = ctx->layout_interface;
 
-       iassert(lyt->add_notification_remove_layer(NULL, NULL) == IVI_FAILED);
+       iassert(lyt->add_listener_remove_layer(NULL) == IVI_FAILED);
 }
 
 static void
-- 
1.7.9.5

_______________________________________________
wayland-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to