[PATCH weston 3/3] ivi-shell: add API for weston_surface -> ivi_layout_surface

Pekka Paalanen ppaalanen at gmail.com
Tue May 10 14:20:39 UTC 2016


From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>

Add ivi-layout API for getting an ivi_layout_surface from a
weston_surface if it exists. This can be used by controllers that hook
up to core Weston callbacks and get handed a weston_surface, but need to
use ivi-layout API to manipulate it.

The only ways ivi-layout itself would be able to go from weston_surface
to ivi_layout_surface are either searching through the list of all
ivi_layout_surfaces or adding a dummy destroy listener to the
weston_surface. Therefore the implementation is delegated to
ivi-shell.c.

Ivi-shell.c can easily look up the ivi_shell_surface for a
weston_surface, and that will map 1:1 to an ivi_layout_surface.

Signed-off-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
---
 ivi-shell/ivi-layout-export.h |  9 +++++++++
 ivi-shell/ivi-layout.c        |  1 +
 ivi-shell/ivi-shell.c         | 12 ++++++++++++
 ivi-shell/ivi-shell.h         |  5 +++++
 4 files changed, 27 insertions(+)

diff --git a/ivi-shell/ivi-layout-export.h b/ivi-shell/ivi-layout-export.h
index 33aa820..e437d9e 100644
--- a/ivi-shell/ivi-layout-export.h
+++ b/ivi-shell/ivi-layout-export.h
@@ -567,6 +567,15 @@ struct ivi_layout_interface {
 				void *target, size_t size,
 				int32_t x, int32_t y,
 				int32_t width, int32_t height);
+
+	/**
+	 * Returns the ivi_layout_surface or NULL
+	 *
+	 * NULL is returned if there is no ivi_layout_surface corresponding
+	 * to the given weston_surface.
+	 */
+	struct ivi_layout_surface *
+		(*get_surface)(struct weston_surface *surface);
 };
 
 #ifdef __cplusplus
diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c
index 1601787..0aa3edb 100644
--- a/ivi-shell/ivi-layout.c
+++ b/ivi-shell/ivi-layout.c
@@ -1992,6 +1992,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_listener_configure_surface	= ivi_layout_add_listener_configure_surface,
+	.get_surface				= shell_get_ivi_layout_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/ivi-shell/ivi-shell.c b/ivi-shell/ivi-shell.c
index c502c74..59ffe0c 100644
--- a/ivi-shell/ivi-shell.c
+++ b/ivi-shell/ivi-shell.c
@@ -93,6 +93,18 @@ get_ivi_shell_surface(struct weston_surface *surface)
 	return shsurf;
 }
 
+struct ivi_layout_surface *
+shell_get_ivi_layout_surface(struct weston_surface *surface)
+{
+	struct ivi_shell_surface *shsurf;
+
+	shsurf = get_ivi_shell_surface(surface);
+	if (!shsurf)
+		return NULL;
+
+	return shsurf->layout_surface;
+}
+
 void
 shell_surface_send_configure(struct weston_surface *surface,
 			     int32_t width, int32_t height)
diff --git a/ivi-shell/ivi-shell.h b/ivi-shell/ivi-shell.h
index 45faceb..369e5f8 100644
--- a/ivi-shell/ivi-shell.h
+++ b/ivi-shell/ivi-shell.h
@@ -73,4 +73,9 @@ void
 shell_surface_send_configure(struct weston_surface *surface,
 			     int32_t width, int32_t height);
 
+struct ivi_layout_surface;
+
+struct ivi_layout_surface *
+shell_get_ivi_layout_surface(struct weston_surface *surface);
+
 #endif /* WESTON_IVI_SHELL_H */
-- 
2.7.3



More information about the wayland-devel mailing list