[PATCH weston 08/16] ivi-shell: rework create_layer_notification

Ucan, Emre (ADITG/SW1) eucan at de.adit-jv.com
Thu Mar 31 11:09:31 UTC 2016


The add_notification_create_layer API accepts a simple
wl_listener instead of a ivi-shell specific notification
function. Therefore, the API is renamed to add_listener_create_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 <eucan at de.adit-jv.com>
---
 ivi-shell/ivi-layout-export.h    |    4 +---
 ivi-shell/ivi-layout.c           |   40 ++++++--------------------------------
 tests/ivi_layout-internal-test.c |   18 ++++++++++-------
 3 files changed, 18 insertions(+), 44 deletions(-)

diff --git a/ivi-shell/ivi-layout-export.h b/ivi-shell/ivi-layout-export.h
index b03fd43..b2c3d2e 100644
--- a/ivi-shell/ivi-layout-export.h
+++ b/ivi-shell/ivi-layout-export.h
@@ -336,9 +336,7 @@ struct ivi_layout_interface {
 	/**
 	 * \brief register/unregister for notification when ivi_layer is created
 	 */
-	int32_t (*add_notification_create_layer)(
-				layer_create_notification_func callback,
-				void *userdata);
+	int32_t (*add_listener_create_layer)(struct wl_listener *listener);
 
 	void (*remove_notification_create_layer)(
 				layer_create_notification_func callback,
diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c
index 4b4114f..ac96083 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_created(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 *created_callback =
-		notification->userdata;
-
-	((layer_create_notification_func)created_callback->callback)
-		(ivilayer, created_callback->data);
-}
-
-static void
 layer_removed(struct wl_listener *listener, void *data)
 {
 	struct ivi_layout_layer *ivilayer = data;
@@ -1053,29 +1036,18 @@ remove_notification(struct wl_list *listener_list, void *callback, void *userdat
  * Brief of APIs is described in ivi-layout-export.h.
  */
 static int32_t
-ivi_layout_add_notification_create_layer(layer_create_notification_func callback,
-					 void *userdata)
+ivi_layout_add_listener_create_layer(struct wl_listener *listener)
 {
 	struct ivi_layout *layout = get_instance();
-	struct ivi_layout_notification_callback *created_callback = NULL;
-
-	if (callback == NULL) {
-		weston_log("ivi_layout_add_notification_create_layer: invalid argument\n");
-		return IVI_FAILED;
-	}
 
-	created_callback = malloc(sizeof *created_callback);
-	if (created_callback == NULL) {
-		weston_log("fails to allocate memory\n");
+	if (listener == NULL) {
+		weston_log("ivi_layout_add_listener_create_layer: invalid argument\n");
 		return IVI_FAILED;
 	}
 
-	created_callback->callback = callback;
-	created_callback->data = userdata;
+	wl_signal_add(&layout->layer_notification.created, listener);
 
-	return add_notification(&layout->layer_notification.created,
-				layer_created,
-				created_callback);
+	return IVI_SUCCEEDED;
 }
 
 static void
@@ -2216,7 +2188,7 @@ static struct ivi_layout_interface ivi_layout_interface = {
 	/**
 	 * layer controller interfaces
 	 */
-	.add_notification_create_layer		= ivi_layout_add_notification_create_layer,
+	.add_listener_create_layer			= ivi_layout_add_listener_create_layer,
 	.remove_notification_create_layer	= ivi_layout_remove_notification_create_layer,
 	.add_notification_remove_layer		= ivi_layout_add_notification_remove_layer,
 	.remove_notification_remove_layer	= ivi_layout_remove_notification_remove_layer,
diff --git a/tests/ivi_layout-internal-test.c b/tests/ivi_layout-internal-test.c
index f95c9e3..500aa99 100644
--- a/tests/ivi_layout-internal-test.c
+++ b/tests/ivi_layout-internal-test.c
@@ -43,6 +43,7 @@ struct test_context {
 	uint32_t user_flags;
 
 	struct wl_listener layer_property_changed;
+	struct wl_listener layer_created;
 };
 
 static void
@@ -718,11 +719,13 @@ test_layer_properties_changed_notification(struct test_context *ctx)
 }
 
 static void
-test_layer_create_notification_callback(struct ivi_layout_layer *ivilayer,
-					void *userdata)
+test_layer_create_notification_callback(struct wl_listener *listener, void *data)
 {
-	struct test_context *ctx = userdata;
+	struct test_context *ctx =
+			container_of(listener, struct test_context,
+					layer_created);
 	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));
@@ -743,15 +746,16 @@ test_layer_create_notification(struct test_context *ctx)
 	struct ivi_layout_layer *ivilayers[LAYER_NUM] = {};
 
 	ctx->user_flags = 0;
+	ctx->layer_created.notify = test_layer_create_notification_callback;
 
-	iassert(lyt->add_notification_create_layer(
-		    test_layer_create_notification_callback, ctx) == IVI_SUCCEEDED);
+	iassert(lyt->add_listener_create_layer(&ctx->layer_created) == IVI_SUCCEEDED);
 	ivilayers[0] = lyt->layer_create_with_dimension(layers[0], 200, 300);
 
 	iassert(ctx->user_flags == 1);
 
 	ctx->user_flags = 0;
-	lyt->remove_notification_create_layer(test_layer_create_notification_callback, ctx);
+	// remove layer created listener.
+	wl_list_remove(&ctx->layer_created.link);
 
 	ivilayers[1] = lyt->layer_create_with_dimension(layers[1], 400, 500);
 
@@ -840,7 +844,7 @@ test_layer_bad_create_notification(struct test_context *ctx)
 {
 	const struct ivi_layout_interface *lyt = ctx->layout_interface;
 
-	iassert(lyt->add_notification_create_layer(NULL, NULL) == IVI_FAILED);
+	iassert(lyt->add_listener_create_layer(NULL) == IVI_FAILED);
 }
 
 static void
-- 
1.7.9.5



More information about the wayland-devel mailing list