clients: If available, prefer top level surfaces for move or rotate

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>
This commit is contained in:
Derek Foreman 2015-09-11 14:27:40 -05:00 committed by Bryce Harrington
parent c0c1497f99
commit 45a7c27f2b

View 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 static void
send_configure_for_surface(struct shell_surface *shsurf) send_configure_for_surface(struct shell_surface *shsurf)
{ {
@ -1770,6 +1789,8 @@ surface_move(struct shell_surface *shsurf, struct weston_pointer *pointer,
if (!shsurf) if (!shsurf)
return -1; return -1;
shsurf = find_toplevel_surface(shsurf);
if (shsurf->grabbed || if (shsurf->grabbed ||
shsurf->state.fullscreen || shsurf->state.maximized) shsurf->state.fullscreen || shsurf->state.maximized)
return 0; return 0;
@ -4994,6 +5015,8 @@ surface_rotate(struct shell_surface *surface, struct weston_pointer *pointer)
float dx, dy; float dx, dy;
float r; float r;
surface = find_toplevel_surface(surface);
rotate = malloc(sizeof *rotate); rotate = malloc(sizeof *rotate);
if (!rotate) if (!rotate)
return; return;