[PATCH weston 6/6] xwm: use last focused valid window for guessing transient parent

Tiago Vignatti tiago.vignatti at intel.com
Mon Jun 4 10:01:48 PDT 2012


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 <tiago.vignatti at intel.com>
---
 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



More information about the wayland-devel mailing list