[PATCH weston v2] clients: If available, prefer top level surfaces for move or rotate

Derek Foreman derekf at osg.samsung.com
Fri Sep 11 12:27:40 PDT 2015


This stops us from rotating or moving pop-up menus by instead rotating
their parents.

This is easiest to see using a multi-seat configuration.

Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
---
 desktop-shell/shell.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
index 034d39b..90a3ded 100644
--- a/desktop-shell/shell.c
+++ b/desktop-shell/shell.c
@@ -481,6 +481,23 @@ get_output_work_area(struct desktop_shell *shell,
 	}
 }
 
+static struct shell_surface *
+find_toplevel_surface(struct shell_surface *in_surface)
+{
+	struct shell_surface *surface = in_surface;
+
+	if (!surface)
+		return NULL;
+
+	while (surface->parent)
+		surface = get_shell_surface(surface->parent);
+
+	if (!surface || surface->type != SHELL_SURFACE_TOPLEVEL)
+		surface = in_surface;
+
+	return surface;
+}
+
 static void
 send_configure_for_surface(struct shell_surface *shsurf)
 {
@@ -1770,6 +1787,8 @@ surface_move(struct shell_surface *shsurf, struct weston_pointer *pointer,
 	if (!shsurf)
 		return -1;
 
+	shsurf = find_toplevel_surface(shsurf);
+
 	if (shsurf->grabbed ||
 	    shsurf->state.fullscreen || shsurf->state.maximized)
 		return 0;
@@ -4993,6 +5012,8 @@ surface_rotate(struct shell_surface *surface, struct weston_pointer *pointer)
 	float dx, dy;
 	float r;
 
+	surface = find_toplevel_surface(surface);
+
 	rotate = malloc(sizeof *rotate);
 	if (!rotate)
 		return;
-- 
2.5.1



More information about the wayland-devel mailing list