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

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 <eu...@de.adit-jv.com>
---
 ivi-shell/hmi-controller.c       |   14 ++++++---
 ivi-shell/ivi-layout-export.h    |    4 +--
 ivi-shell/ivi-layout.c           |   62 ++++----------------------------------
 tests/ivi_layout-internal-test.c |    2 +-
 tests/ivi_layout-test-plugin.c   |   17 ++++++-----
 5 files changed, 27 insertions(+), 72 deletions(-)

diff --git a/ivi-shell/hmi-controller.c b/ivi-shell/hmi-controller.c
index 49aba81..53ba947 100644
--- a/ivi-shell/hmi-controller.c
+++ b/ivi-shell/hmi-controller.c
@@ -129,6 +129,7 @@ struct hmi_controller {
 
        struct wl_listener                  surface_created;
        struct wl_listener                  surface_removed;
+       struct wl_listener                  surface_configured;
 
        struct wl_client                   *user_interface;
        struct ui_setting                   ui_setting;
@@ -612,10 +613,12 @@ set_notification_remove_surface(struct wl_listener 
*listener, void *data)
 }
 
 static void
-set_notification_configure_surface(struct ivi_layout_surface *ivisurf,
-                                  void *userdata)
+set_notification_configure_surface(struct wl_listener *listener, void *data)
 {
-       struct hmi_controller *hmi_ctrl = userdata;
+       struct hmi_controller *hmi_ctrl =
+                       wl_container_of(listener, hmi_ctrl,
+                                       surface_configured);
+       struct ivi_layout_surface *ivisurf = (struct ivi_layout_surface*) data;
        struct hmi_controller_layer *layer_link = NULL;
        struct ivi_layout_layer *application_layer = NULL;
        struct weston_surface *surface;
@@ -846,8 +849,9 @@ hmi_controller_create(struct weston_compositor *ec)
 
        hmi_ctrl->surface_removed.notify = set_notification_remove_surface;
        
ivi_layout_interface->add_listener_remove_surface(&hmi_ctrl->surface_removed);
-       ivi_layout_interface->add_notification_configure_surface(
-               set_notification_configure_surface, hmi_ctrl);
+
+       hmi_ctrl->surface_configured.notify = 
set_notification_configure_surface;
+       
ivi_layout_interface->add_listener_configure_surface(&hmi_ctrl->surface_configured);
 
        hmi_ctrl->destroy_listener.notify = hmi_controller_destroy;
        wl_signal_add(&hmi_ctrl->compositor->destroy_signal,
diff --git a/ivi-shell/ivi-layout-export.h b/ivi-shell/ivi-layout-export.h
index e0beff6..8ff5613 100644
--- a/ivi-shell/ivi-layout-export.h
+++ b/ivi-shell/ivi-layout-export.h
@@ -175,9 +175,7 @@ struct ivi_layout_interface {
        /**
         * \brief register/unregister for notification when ivi_surface is 
configured
         */
-       int32_t (*add_notification_configure_surface)(
-                               surface_configure_notification_func callback,
-                               void *userdata);
+       int32_t (*add_listener_configure_surface)(struct wl_listener *listener);
 
        void (*remove_notification_configure_surface)(
                                surface_configure_notification_func callback,
diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c
index aa35327..5776279 100644
--- a/ivi-shell/ivi-layout.c
+++ b/ivi-shell/ivi-layout.c
@@ -931,46 +931,6 @@ clear_surface_order_list(struct ivi_layout_layer *ivilayer)
 }
 
 static void
-surface_configure_changed(struct wl_listener *listener,
-                         void *data)
-{
-       struct ivi_layout_surface *ivisurface = data;
-
-       struct listener_layout_notification *notification =
-               container_of(listener,
-                            struct listener_layout_notification,
-                            listener);
-
-       struct ivi_layout_notification_callback *configure_changed_callback =
-               notification->userdata;
-
-       
((surface_configure_notification_func)configure_changed_callback->callback)
-               (ivisurface, configure_changed_callback->data);
-}
-
-static int32_t
-add_notification(struct wl_signal *signal,
-                wl_notify_func_t callback,
-                void *userdata)
-{
-       struct listener_layout_notification *notification = NULL;
-
-       notification = malloc(sizeof *notification);
-       if (notification == NULL) {
-               weston_log("fails to allocate memory\n");
-               free(userdata);
-               return IVI_FAILED;
-       }
-
-       notification->listener.notify = callback;
-       notification->userdata = userdata;
-
-       wl_signal_add(signal, &notification->listener);
-
-       return IVI_SUCCEEDED;
-}
-
-static void
 remove_notification(struct wl_list *listener_list, void *callback, void 
*userdata)
 {
        struct wl_listener *listener = NULL;
@@ -1062,28 +1022,18 @@ ivi_layout_add_listener_remove_surface(struct 
wl_listener *listener)
 }
 
 static int32_t
-ivi_layout_add_notification_configure_surface(surface_configure_notification_func
 callback,
-                                             void *userdata)
+ivi_layout_add_listener_configure_surface(struct wl_listener *listener)
 {
        struct ivi_layout *layout = get_instance();
-       struct ivi_layout_notification_callback *configure_changed_callback = 
NULL;
-       if (callback == NULL) {
-               weston_log("ivi_layout_add_notification_configure_surface: 
invalid argument\n");
-               return IVI_FAILED;
-       }
 
-       configure_changed_callback = malloc(sizeof *configure_changed_callback);
-       if (configure_changed_callback == NULL) {
-               weston_log("fails to allocate memory\n");
+       if (listener == NULL) {
+               weston_log("ivi_layout_add_listener_configure_surface: invalid 
argument\n");
                return IVI_FAILED;
        }
 
-       configure_changed_callback->callback = callback;
-       configure_changed_callback->data = userdata;
+       wl_signal_add(&layout->surface_notification.configure_changed, 
listener);
 
-       return add_notification(&layout->surface_notification.configure_changed,
-                               surface_configure_changed,
-                               configure_changed_callback);
+       return IVI_SUCCEEDED;
 }
 
 static void
@@ -2088,7 +2038,7 @@ static struct ivi_layout_interface ivi_layout_interface = 
{
         */
        .add_listener_create_surface    = 
ivi_layout_add_listener_create_surface,
        .add_listener_remove_surface    = 
ivi_layout_add_listener_remove_surface,
-       .add_notification_configure_surface     = 
ivi_layout_add_notification_configure_surface,
+       .add_listener_configure_surface = 
ivi_layout_add_listener_configure_surface,
        .remove_notification_configure_surface  = 
ivi_layout_remove_notification_configure_surface,
        .get_surfaces                           = ivi_layout_get_surfaces,
        .get_id_of_surface                      = ivi_layout_get_id_of_surface,
diff --git a/tests/ivi_layout-internal-test.c b/tests/ivi_layout-internal-test.c
index 72c045f..2b0d290 100644
--- a/tests/ivi_layout-internal-test.c
+++ b/tests/ivi_layout-internal-test.c
@@ -841,7 +841,7 @@ test_surface_bad_configure_notification(struct test_context 
*ctx)
 {
        const struct ivi_layout_interface *lyt = ctx->layout_interface;
 
-       iassert(lyt->add_notification_configure_surface(NULL, NULL) == 
IVI_FAILED);
+       iassert(lyt->add_listener_configure_surface(NULL) == IVI_FAILED);
 }
 
 static void
diff --git a/tests/ivi_layout-test-plugin.c b/tests/ivi_layout-test-plugin.c
index f01a2d5..3f7bc65 100644
--- a/tests/ivi_layout-test-plugin.c
+++ b/tests/ivi_layout-test-plugin.c
@@ -87,6 +87,7 @@ struct test_context {
        struct wl_listener surface_property_changed;
        struct wl_listener surface_created;
        struct wl_listener surface_removed;
+       struct wl_listener surface_configured;
 };
 
 static struct test_context static_context;
@@ -874,11 +875,13 @@ RUNNER_TEST(surface_properties_changed_notification)
 }
 
 static void
-test_surface_configure_notification_callback(struct ivi_layout_surface 
*ivisurf,
-                                            void *userdata)
+test_surface_configure_notification_callback(struct wl_listener *listener, 
void *data)
 {
-       struct test_context *ctx = userdata;
+       struct test_context *ctx =
+                       container_of(listener, struct test_context,
+                                       surface_configured);
        const struct ivi_layout_interface *lyt = ctx->layout_interface;
+       struct ivi_layout_surface *ivisurf = (struct ivi_layout_surface*) data;
 
        runner_assert_or_return(lyt->get_id_of_surface(ivisurf) == 
IVI_TEST_SURFACE_ID(0));
 
@@ -889,7 +892,8 @@ RUNNER_TEST(surface_configure_notification_p1)
 {
        const struct ivi_layout_interface *lyt = ctx->layout_interface;
 
-       runner_assert(IVI_SUCCEEDED == 
lyt->add_notification_configure_surface(test_surface_configure_notification_callback,
 ctx));
+       ctx->surface_configured.notify = 
test_surface_configure_notification_callback;
+       runner_assert(IVI_SUCCEEDED == 
lyt->add_listener_configure_surface(&ctx->surface_configured));
        lyt->commit_changes();
 
        ctx->user_flags = 0;
@@ -897,11 +901,10 @@ RUNNER_TEST(surface_configure_notification_p1)
 
 RUNNER_TEST(surface_configure_notification_p2)
 {
-       const struct ivi_layout_interface *lyt = ctx->layout_interface;
-
        runner_assert(ctx->user_flags == 1);
 
-       
lyt->remove_notification_configure_surface(test_surface_configure_notification_callback,
 ctx);
+       // remove surface configured listener.
+       wl_list_remove(&ctx->surface_configured.link);
        ctx->user_flags = 0;
 }
 
-- 
1.7.9.5

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to