On X the global absolute coordinates are sent in ConfigureNotify and the window is mapped exactly on that position. On Wayland we don't have that, and that's a problem for transient windows without transient_for hint set.
So this solution is a workaround. It guess a parent based on the last focused window to determine the relative position of the transient surface. This put transient windows of Chrome browser back to work now. Signed-off-by: Tiago Vignatti <[email protected]> --- src/xwayland/window-manager.c | 13 ++++++++++++- src/xwayland/xwayland.h | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/xwayland/window-manager.c b/src/xwayland/window-manager.c index 2d6b35a..8637536 100644 --- a/src/xwayland/window-manager.c +++ b/src/xwayland/window-manager.c @@ -437,6 +437,8 @@ weston_wm_window_activate(struct wl_listener *listener, void *data) if (wm->focus_window) weston_wm_window_schedule_repaint(wm->focus_window); wm->focus_window = window; + if (window) + wm->focus_latest = window; if (wm->focus_window) weston_wm_window_schedule_repaint(wm->focus_window); } @@ -1324,6 +1326,7 @@ xserver_map_shell_surface(struct weston_wm *wm, &wm->server->compositor->shell_interface; struct weston_wm_window *parent; struct theme *t = window->wm->theme; + int parent_id; int x = 0, y = 0; if (!shell_interface->create_shell_surface) @@ -1340,7 +1343,15 @@ xserver_map_shell_surface(struct weston_wm *wm, return; } - parent = hash_table_lookup(wm->window_hash, window->transient_for->id); + /* not all non-toplevel has transient_for set. So we need this hack to + * guess a parent that will determine the relative position of the + * transient surface */ + if (!window->transient_for) + parent_id = wm->focus_latest->id; + else + parent_id = window->transient_for->id; + + parent = hash_table_lookup(wm->window_hash, parent_id); /* non-decorated and non-toplevel windows, e.g. sub-menus */ if (!parent->decorate && parent->override_redirect) { diff --git a/src/xwayland/xwayland.h b/src/xwayland/xwayland.h index 438b7be..31a96cf 100644 --- a/src/xwayland/xwayland.h +++ b/src/xwayland/xwayland.h @@ -57,6 +57,7 @@ struct weston_wm { struct weston_xserver *server; xcb_window_t wm_window; struct weston_wm_window *focus_window; + struct weston_wm_window *focus_latest; struct theme *theme; xcb_render_pictforminfo_t render_format; struct wl_listener activate_listener; -- 1.7.9.5 _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
