[PATCH weston] xwm: don't set inactive surfaces as top level

Giulio Camuffo giuliocamuffo at gmail.com
Mon Jan 12 09:14:32 PST 2015


Some X clients create popup or tooltips windows as top level, without
setting them as override redirect or as transient. Since we don't want
to take the focus away from a surface when one of its popup is opened,
check the _NET_WM_WINDOW_TYPE of the X surfaces being mapped and set
them as inactive if it is one some types.
---
 xwayland/window-manager.c | 27 +++++++++++++++++++++++----
 1 file changed, 23 insertions(+), 4 deletions(-)

diff --git a/xwayland/window-manager.c b/xwayland/window-manager.c
index 748c896..e9a0609 100644
--- a/xwayland/window-manager.c
+++ b/xwayland/window-manager.c
@@ -2306,6 +2306,18 @@ legacy_fullscreen(struct weston_wm *wm,
 	return 0;
 }
 
+static bool
+weston_wm_window_inactive(struct weston_wm_window *window)
+{
+	struct weston_wm *wm = window->wm;
+
+	return window->type == wm->atom.net_wm_window_type_tooltip ||
+	       window->type == wm->atom.net_wm_window_type_dropdown ||
+	       window->type == wm->atom.net_wm_window_type_dnd ||
+	       window->type == wm->atom.net_wm_window_type_combo ||
+	       window->type == wm->atom.net_wm_window_type_popup;
+}
+
 static void
 xserver_map_shell_surface(struct weston_wm_window *window,
 			  struct weston_surface *surface)
@@ -2315,6 +2327,7 @@ xserver_map_shell_surface(struct weston_wm_window *window,
 		&wm->server->compositor->shell_interface;
 	struct weston_output *output;
 	struct weston_wm_window *parent;
+	int flags = 0;
 
 	weston_wm_window_read_properties(window);
 
@@ -2375,14 +2388,20 @@ xserver_map_shell_surface(struct weston_wm_window *window,
 					      WL_SHELL_SURFACE_TRANSIENT_INACTIVE);
 	} else if (window->transient_for && window->transient_for->surface) {
 		parent = window->transient_for;
-		int flags = 0;
-		if (window->type == wm->atom.net_wm_window_type_tooltip)
-			flags |= WL_SHELL_SURFACE_TRANSIENT_INACTIVE;
+		if (weston_wm_window_inactive(window))
+			flags = WL_SHELL_SURFACE_TRANSIENT_INACTIVE;
 		shell_interface->set_transient(window->shsurf,
 					       parent->surface,
 					       window->x - parent->x,
 					       window->y - parent->y, flags);
 	} else {
-		shell_interface->set_toplevel(window->shsurf);
+		if (weston_wm_window_inactive(window)) {
+			shell_interface->set_xwayland(window->shsurf,
+							window->x,
+							window->y,
+							WL_SHELL_SURFACE_TRANSIENT_INACTIVE);
+		} else {
+			shell_interface->set_toplevel(window->shsurf);
+		}
 	}
 }
-- 
2.2.1



More information about the wayland-devel mailing list