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

Bryce Harrington bryce at osg.samsung.com
Mon Jan 26 11:26:40 PST 2015


On Sat, Jan 24, 2015 at 05:54:21PM +0200, Giulio Camuffo wrote:
> 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 of some types.

Thanks, applied.
   9bb1339..836b9c7  master -> master


> ---
>  xwayland/window-manager.c | 26 ++++++++++++++++++++++++--
>  1 file changed, 24 insertions(+), 2 deletions(-)
> 
> diff --git a/xwayland/window-manager.c b/xwayland/window-manager.c
> index 9284a05..6f1996f 100644
> --- a/xwayland/window-manager.c
> +++ b/xwayland/window-manager.c
> @@ -2273,6 +2273,18 @@ legacy_fullscreen(struct weston_wm *wm,
>  	return 0;
>  }
>  
> +static bool
> +weston_wm_window_type_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)
> @@ -2282,6 +2294,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);
>  
> @@ -2340,11 +2353,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;
> +		if (weston_wm_window_type_inactive(window))
> +			flags = WL_SHELL_SURFACE_TRANSIENT_INACTIVE;
>  		shell_interface->set_transient(window->shsurf,
>  					       parent->surface,
>  					       window->x - parent->x,
> -					       window->y - parent->y, 0);
> +					       window->y - parent->y, flags);
>  	} else {
> -		shell_interface->set_toplevel(window->shsurf);
> +		if (weston_wm_window_type_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.2
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list