diff --git a/ivi-shell/ivi-layout-export.h b/ivi-shell/ivi-layout-export.h index 05f3668f..d7a880ca 100644 --- a/ivi-shell/ivi-layout-export.h +++ b/ivi-shell/ivi-layout-export.h @@ -138,12 +138,6 @@ enum ivi_layout_transition_type{ IVI_LAYOUT_TRANSITION_MAX, }; -typedef void (*layer_property_notification_func)( - struct ivi_layout_layer *ivilayer, - const struct ivi_layout_layer_properties *, - enum ivi_layout_notification_mask mask, - void *userdata); - typedef void (*layer_create_notification_func)( struct ivi_layout_layer *ivilayer, void *userdata); @@ -522,19 +516,18 @@ struct ivi_layout_interface { int32_t number); /** - * \brief register for notification on property changes of ivi_layer + * \brief add a listener to listen property changes of ivi_layer + * + * When a property of the ivi_layer is changed, the property_changed + * signal is emitted to the listening controller plugins. + * The pointer of the ivi_layer is sent as the void *data argument + * to the wl_listener::notify callback function of the listener. * * \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); - - /** - * \brief remove notification on property changes of ivi_layer - */ - void (*layer_remove_notification)(struct ivi_layout_layer *ivilayer); + int32_t (*layer_add_listener)(struct ivi_layout_layer *ivilayer, + struct wl_listener *listener); /** * \brief set type of transition animation @@ -596,13 +589,6 @@ struct ivi_layout_interface { void *target, size_t size, int32_t x, int32_t y, int32_t width, int32_t height); - - /** - * \brief remove notification by callback on property changes of ivi_layer - */ - void (*layer_remove_notification_by_callback)(struct ivi_layout_layer *ivilayer, - layer_property_notification_func callback, - void *userdata); }; #ifdef __cplusplus diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c index 013e0968..75350a39 100644 --- a/ivi-shell/ivi-layout.c +++ b/ivi-shell/ivi-layout.c @@ -181,26 +181,6 @@ get_screen_from_output(struct weston_output *output) return NULL; } -static void -remove_all_notification(struct wl_list *listener_list) -{ - struct wl_listener *listener = NULL; - struct wl_listener *next = NULL; - - wl_list_for_each_safe(listener, next, listener_list, link) { - struct listener_layout_notification *notification = NULL; - wl_list_remove(&listener->link); - - notification = - container_of(listener, - struct listener_layout_notification, - listener); - - free(notification->userdata); - free(notification); - } -} - /** * Called at destruction of wl_surface/ivi_surface */ @@ -984,23 +964,6 @@ layer_removed(struct wl_listener *listener, void *data) (ivilayer, removed_callback->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) { @@ -1581,30 +1544,6 @@ ivi_layout_layer_create_with_dimension(uint32_t id_layer, return ivilayer; } -static void -ivi_layout_layer_remove_notification(struct ivi_layout_layer *ivilayer) -{ - if (ivilayer == NULL) { - weston_log("ivi_layout_layer_remove_notification: invalid argument\n"); - return; - } - - remove_all_notification(&ivilayer->property_changed.listener_list); -} - -static void -ivi_layout_layer_remove_notification_by_callback(struct ivi_layout_layer *ivilayer, - layer_property_notification_func callback, - void *userdata) -{ - if (ivilayer == NULL) { - weston_log("ivi_layout_layer_remove_notification_by_callback: invalid argument\n"); - return; - } - - remove_notification(&ivilayer->property_changed.listener_list, callback, userdata); -} - static void ivi_layout_layer_destroy(struct ivi_layout_layer *ivilayer) { @@ -1627,8 +1566,6 @@ ivi_layout_layer_destroy(struct ivi_layout_layer *ivilayer) wl_list_remove(&ivilayer->order.link); wl_list_remove(&ivilayer->link); - ivi_layout_layer_remove_notification(ivilayer); - free(ivilayer); } @@ -1983,29 +1920,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"); + if (ivilayer == NULL || listener == NULL) { + weston_log("ivi_layout_layer_add_listener: invalid argument\n"); return IVI_FAILED; } - prop_callback = malloc(sizeof *prop_callback); - if (prop_callback == NULL) { - weston_log("fails to allocate memory\n"); - return IVI_FAILED; - } + wl_signal_add(&ivilayer->property_changed, listener); - prop_callback->callback = callback; - prop_callback->data = userdata; - - return add_notification(&ivilayer->property_changed, - layer_prop_changed, - prop_callback); + return IVI_SUCCEEDED; } static const struct ivi_layout_surface_properties * @@ -2348,8 +2273,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_remove_notification = ivi_layout_layer_remove_notification, + .layer_add_listener = ivi_layout_layer_add_listener, .layer_set_transition = ivi_layout_layer_set_transition, /** @@ -2370,11 +2294,6 @@ static struct ivi_layout_interface ivi_layout_interface = { */ .surface_get_size = ivi_layout_surface_get_size, .surface_dump = ivi_layout_surface_dump, - - /** - * remove notification by callback on property changes of ivi_surface/layer - */ - .layer_remove_notification_by_callback = ivi_layout_layer_remove_notification_by_callback }; int diff --git a/tests/ivi_layout-internal-test.c b/tests/ivi_layout-internal-test.c index 99d10a4f..ed78754a 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 = 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); }