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

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    |    5 ++---
 ivi-shell/ivi-layout.c           |   43 +++++++-------------------------------
 tests/ivi_layout-internal-test.c |   33 ++++++++++++++++-------------
 3 files changed, 28 insertions(+), 53 deletions(-)

diff --git a/ivi-shell/ivi-layout-export.h b/ivi-shell/ivi-layout-export.h
index 7a25825..9db18e0 100644
--- a/ivi-shell/ivi-layout-export.h
+++ b/ivi-shell/ivi-layout-export.h
@@ -527,9 +527,8 @@ struct ivi_layout_interface {
         * \return IVI_SUCCEEDED if the method call was successful
         * \return IVI_FAILED if the method call was failed
         */
-       int32_t (*layer_add_notification)(struct ivi_layout_layer *ivilayer,
-                                         layer_property_notification_func 
callback,
-                                         void *userdata);
+       int32_t (*layer_add_listener)(struct ivi_layout_layer *ivilayer,
+                                         struct wl_listener *listener);
 
        /**
         * \brief remove notification on property changes of ivi_layer
diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c
index 013e096..25df1f9 100644
--- a/ivi-shell/ivi-layout.c
+++ b/ivi-shell/ivi-layout.c
@@ -985,23 +985,6 @@ layer_removed(struct wl_listener *listener, void *data)
 }
 
 static void
-layer_prop_changed(struct wl_listener *listener, void *data)
-{
-       struct ivi_layout_layer *ivilayer = data;
-
-       struct listener_layout_notification *layout_listener =
-               container_of(listener,
-                            struct listener_layout_notification,
-                            listener);
-
-       struct ivi_layout_notification_callback *prop_callback =
-               layout_listener->userdata;
-
-       ((layer_property_notification_func)prop_callback->callback)
-               (ivilayer, &ivilayer->prop, ivilayer->prop.event_mask, 
prop_callback->data);
-}
-
-static void
 surface_created(struct wl_listener *listener, void *data)
 {
        struct ivi_layout_surface *ivisurface = data;
@@ -1983,29 +1966,17 @@ ivi_layout_surface_get_size(struct ivi_layout_surface 
*ivisurf,
 }
 
 static int32_t
-ivi_layout_layer_add_notification(struct ivi_layout_layer *ivilayer,
-                                 layer_property_notification_func callback,
-                                 void *userdata)
+ivi_layout_layer_add_listener(struct ivi_layout_layer *ivilayer,
+                                 struct wl_listener *listener)
 {
-       struct ivi_layout_notification_callback *prop_callback = NULL;
-
-       if (ivilayer == NULL || callback == NULL) {
-               weston_log("ivi_layout_layer_add_notification: invalid 
argument\n");
-               return IVI_FAILED;
-       }
-
-       prop_callback = malloc(sizeof *prop_callback);
-       if (prop_callback == NULL) {
-               weston_log("fails to allocate memory\n");
+       if (ivilayer == NULL || listener == NULL) {
+               weston_log("ivi_layout_layer_add_listener: invalid argument\n");
                return IVI_FAILED;
        }
 
-       prop_callback->callback = callback;
-       prop_callback->data = userdata;
+       wl_signal_add(&ivilayer->property_changed, listener);
 
-       return add_notification(&ivilayer->property_changed,
-                               layer_prop_changed,
-                               prop_callback);
+       return IVI_SUCCEEDED;
 }
 
 static const struct ivi_layout_surface_properties *
@@ -2348,7 +2319,7 @@ static struct ivi_layout_interface ivi_layout_interface = 
{
        .layer_add_surface                      = ivi_layout_layer_add_surface,
        .layer_remove_surface                   = 
ivi_layout_layer_remove_surface,
        .layer_set_render_order                 = 
ivi_layout_layer_set_render_order,
-       .layer_add_notification                 = 
ivi_layout_layer_add_notification,
+       .layer_add_listener                     = ivi_layout_layer_add_listener,
        .layer_remove_notification              = 
ivi_layout_layer_remove_notification,
        .layer_set_transition                   = 
ivi_layout_layer_set_transition,
 
diff --git a/tests/ivi_layout-internal-test.c b/tests/ivi_layout-internal-test.c
index 99d10a4..1cd6c3f 100644
--- a/tests/ivi_layout-internal-test.c
+++ b/tests/ivi_layout-internal-test.c
@@ -35,11 +35,14 @@
 #include "ivi-shell/ivi-layout-export.h"
 #include "ivi-shell/ivi-layout-private.h"
 #include "ivi-test.h"
+#include "shared/helpers.h"
 
 struct test_context {
        struct weston_compositor *compositor;
        const struct ivi_layout_interface *layout_interface;
        uint32_t user_flags;
+
+       struct wl_listener layer_property_changed;
 };
 
 static void
@@ -652,13 +655,14 @@ test_commit_changes_after_render_order_set_layer_destroy(
 }
 
 static void
-test_layer_properties_changed_notification_callback(struct ivi_layout_layer 
*ivilayer,
-                                                   const struct 
ivi_layout_layer_properties *prop,
-                                                   enum 
ivi_layout_notification_mask mask,
-                                                   void *userdata)
+test_layer_properties_changed_notification_callback(struct wl_listener 
*listener, void *data)
 {
-       struct test_context *ctx = userdata;
+       struct test_context *ctx =
+                       container_of(listener, struct test_context,
+                                       layer_property_changed);
        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);
 
        iassert(lyt->get_id_of_layer(ivilayer) == IVI_TEST_LAYER_ID(0));
        iassert(prop->source_width == 200);
@@ -679,7 +683,9 @@ test_layer_properties_changed_notification(struct 
test_context *ctx)
 
        ivilayer = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(0), 200, 
300);
 
-       iassert(lyt->layer_add_notification(ivilayer, 
test_layer_properties_changed_notification_callback, ctx) == IVI_SUCCEEDED);
+       ctx->layer_property_changed.notify = 
test_layer_properties_changed_notification_callback;
+
+       iassert(lyt->layer_add_listener(ivilayer, &ctx->layer_property_changed) 
== IVI_SUCCEEDED);
 
        lyt->commit_changes();
 
@@ -700,7 +706,8 @@ test_layer_properties_changed_notification(struct 
test_context *ctx)
 
        iassert(ctx->user_flags == 0);
 
-       lyt->layer_remove_notification(ivilayer);
+       // remove layer property changed listener.
+       wl_list_remove(&ctx->layer_property_changed.link);
 
        ctx->user_flags = 0;
        lyt->commit_changes();
@@ -800,10 +807,7 @@ test_layer_remove_notification(struct test_context *ctx)
 }
 
 static void
-test_layer_bad_properties_changed_notification_callback(struct 
ivi_layout_layer *ivilayer,
-                                                       const struct 
ivi_layout_layer_properties *prop,
-                                                       enum 
ivi_layout_notification_mask mask,
-                                                       void *userdata)
+test_layer_bad_properties_changed_notification_callback(struct wl_listener 
*listener, void *data)
 {
 }
 
@@ -815,9 +819,10 @@ test_layer_bad_properties_changed_notification(struct 
test_context *ctx)
 
        ivilayer = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(0), 200, 
300);
 
-       iassert(lyt->layer_add_notification(
-                   NULL, 
test_layer_bad_properties_changed_notification_callback, NULL) == IVI_FAILED);
-       iassert(lyt->layer_add_notification(ivilayer, NULL, NULL) == 
IVI_FAILED);
+       ctx->layer_property_changed.notify = 
test_layer_bad_properties_changed_notification_callback;
+
+       iassert(lyt->layer_add_listener(NULL, &ctx->layer_property_changed) == 
IVI_FAILED);
+       iassert(lyt->layer_add_listener(ivilayer, NULL) == IVI_FAILED);
 
        lyt->layer_destroy(ivilayer);
 }
-- 
1.7.9.5

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

Reply via email to