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:
parent
c0c1497f99
commit
45a7c27f2b
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user