xwm: Handle WM_TRANSIENT_FOR

Set up X windows that are transient for another window as transient
surfaces in shell.c.  This keeps the transient windows on top of their
parent as windows are raised, lowered for fullscreened.

https://bugs.freedesktop.org/show_bug.cgi?id=69443
This commit is contained in:
Kristian Høgsberg 2014-01-02 22:40:37 -08:00
parent 14613bacda
commit 9f7e331a20
2 changed files with 14 additions and 7 deletions

View file

@ -2127,6 +2127,10 @@ set_transient(struct shell_surface *shsurf,
{ {
assert(parent != NULL); assert(parent != NULL);
shell_surface_set_parent(shsurf, parent);
surface_clear_next_states(shsurf);
shsurf->transient.x = x; shsurf->transient.x = x;
shsurf->transient.y = y; shsurf->transient.y = y;
shsurf->transient.flags = flags; shsurf->transient.flags = flags;
@ -2149,9 +2153,6 @@ shell_surface_set_transient(struct wl_client *client,
struct weston_surface *parent = struct weston_surface *parent =
wl_resource_get_user_data(parent_resource); wl_resource_get_user_data(parent_resource);
shell_surface_set_parent(shsurf, parent);
surface_clear_next_states(shsurf);
set_transient(shsurf, parent, x, y, flags); set_transient(shsurf, parent, x, y, flags);
} }

View file

@ -2179,6 +2179,7 @@ xserver_map_shell_surface(struct weston_wm *wm,
struct weston_shell_interface *shell_interface = struct weston_shell_interface *shell_interface =
&wm->server->compositor->shell_interface; &wm->server->compositor->shell_interface;
struct weston_output *output; struct weston_output *output;
struct weston_wm_window *parent;
if (!shell_interface->create_shell_surface) if (!shell_interface->create_shell_surface)
return; return;
@ -2208,14 +2209,19 @@ xserver_map_shell_surface(struct weston_wm *wm,
shell_interface->set_fullscreen(window->shsurf, shell_interface->set_fullscreen(window->shsurf,
WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT, WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT,
0, output); 0, output);
} else if (!window->override_redirect && !window->transient_for) { } else if (window->override_redirect) {
shell_interface->set_toplevel(window->shsurf);
return;
} else {
shell_interface->set_xwayland(window->shsurf, shell_interface->set_xwayland(window->shsurf,
window->x, window->x,
window->y, window->y,
WL_SHELL_SURFACE_TRANSIENT_INACTIVE); WL_SHELL_SURFACE_TRANSIENT_INACTIVE);
} else if (window->transient_for) {
parent = window->transient_for;
shell_interface->set_transient(window->shsurf,
parent->surface,
parent->x - window->x,
parent->y - window->y, 0);
} else {
shell_interface->set_toplevel(window->shsurf);
} }
} }