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
