clients: If available, prefer top level surfaces for move or rotate
authorDerek Foreman <derekf@osg.samsung.com>
Fri, 11 Sep 2015 19:27:40 +0000 (14:27 -0500)
committerBryce Harrington <bryce@osg.samsung.com>
Tue, 15 Sep 2015 13:51:15 +0000 (06:51 -0700)
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@osg.samsung.com>
Reviewed-by: Bryce Harrington <bryce@osg.samsung.com>
desktop-shell/shell.c

index ecc42c5..3c6a3da 100644 (file)
@@ -481,6 +481,25 @@ 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 no top level surface was found, just use whatever surface was
+          originally provided. */
+       if (!surface || surface->type != SHELL_SURFACE_TOPLEVEL)
+               surface = in_surface;
+
+       return surface;
+}
+
 static void
 send_configure_for_surface(struct shell_surface *shsurf)
 {
@@ -1770,6 +1789,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;
@@ -4994,6 +5015,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;