summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ivi-shell/hmi-controller.c14
-rw-r--r--ivi-shell/ivi-layout-export.h19
-rw-r--r--ivi-shell/ivi-layout.c111
-rw-r--r--tests/ivi_layout-internal-test.c2
-rw-r--r--tests/ivi_layout-test-plugin.c17
5 files changed, 33 insertions, 130 deletions
diff --git a/ivi-shell/hmi-controller.c b/ivi-shell/hmi-controller.c
index b27f87b2..97f78af5 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 = 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 1485d3f3..9c5225c9 100644
--- a/ivi-shell/ivi-layout-export.h
+++ b/ivi-shell/ivi-layout-export.h
@@ -138,10 +138,6 @@ enum ivi_layout_transition_type{
IVI_LAYOUT_TRANSITION_MAX,
};
-typedef void (*surface_configure_notification_func)(
- struct ivi_layout_surface *ivisurf,
- void *userdata);
-
struct ivi_layout_interface {
/**
@@ -178,15 +174,14 @@ struct ivi_layout_interface {
int32_t (*add_listener_remove_surface)(struct wl_listener *listener);
/**
- * \brief register/unregister for notification when ivi_surface is configured
+ * \brief add a listener for notification when ivi_surface is configured
+ *
+ * When an ivi_surface is configured, a signal is emitted
+ * to the listening controller plugins.
+ * The pointer of the configured ivi_surface is sent as the void *data argument
+ * to the wl_listener::notify callback function of the listener.
*/
- int32_t (*add_notification_configure_surface)(
- surface_configure_notification_func callback,
- void *userdata);
-
- void (*remove_notification_configure_surface)(
- surface_configure_notification_func callback,
- void *userdata);
+ int32_t (*add_listener_configure_surface)(struct wl_listener *listener);
/**
* \brief Get all ivi_surfaces which are currently registered and managed
diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c
index 23f23120..e3452d2c 100644
--- a/ivi-shell/ivi-layout.c
+++ b/ivi-shell/ivi-layout.c
@@ -71,11 +71,6 @@
#define max(a, b) ((a) > (b) ? (a) : (b))
-struct listener_layout_notification {
- void *userdata;
- struct wl_listener listener;
-};
-
struct ivi_layout;
struct ivi_layout_screen {
@@ -96,11 +91,6 @@ struct ivi_layout_screen {
} order;
};
-struct ivi_layout_notification_callback {
- void *callback;
- void *data;
-};
-
struct ivi_rectangle
{
int32_t x;
@@ -109,9 +99,6 @@ struct ivi_rectangle
int32_t height;
};
-static void
-remove_notification(struct wl_list *listener_list, void *callback, void *userdata);
-
static struct ivi_layout ivilayout = {0};
struct ivi_layout *
@@ -930,73 +917,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;
- struct wl_listener *next = NULL;
-
- wl_list_for_each_safe(listener, next, listener_list, link) {
- struct listener_layout_notification *notification =
- container_of(listener,
- struct listener_layout_notification,
- listener);
-
- struct ivi_layout_notification_callback *notification_callback =
- notification->userdata;
-
- if ((notification_callback->callback != callback) ||
- (notification_callback->data != userdata)) {
- continue;
- }
-
- wl_list_remove(&listener->link);
-
- free(notification->userdata);
- free(notification);
- }
-}
-
/**
* Exported APIs of ivi-layout library are implemented from here.
* Brief of APIs is described in ivi-layout-export.h.
@@ -1062,36 +982,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);
-}
-
-static void
-ivi_layout_remove_notification_configure_surface(surface_configure_notification_func callback,
- void *userdata)
-{
- struct ivi_layout *layout = get_instance();
- remove_notification(&layout->surface_notification.configure_changed.listener_list, callback, userdata);
+ return IVI_SUCCEEDED;
}
uint32_t
@@ -2088,8 +1990,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,
- .remove_notification_configure_surface = ivi_layout_remove_notification_configure_surface,
+ .add_listener_configure_surface = ivi_layout_add_listener_configure_surface,
.get_surfaces = ivi_layout_get_surfaces,
.get_id_of_surface = ivi_layout_get_id_of_surface,
.get_surface_from_id = ivi_layout_get_surface_from_id,
diff --git a/tests/ivi_layout-internal-test.c b/tests/ivi_layout-internal-test.c
index 4e173571..f5e296cb 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 6796b33e..80fcdf7f 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 = 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;
}