xwm: don't set inactive surfaces as top level
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. Reviewed-by: Bryce Harrington <bryce@osg.samsung.com>
This commit is contained in:
parent
9bb133990a
commit
836b9c7177
@ -2273,6 +2273,18 @@ legacy_fullscreen(struct weston_wm *wm,
|
|||||||
return 0;
|
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
|
static void
|
||||||
xserver_map_shell_surface(struct weston_wm_window *window,
|
xserver_map_shell_surface(struct weston_wm_window *window,
|
||||||
struct weston_surface *surface)
|
struct weston_surface *surface)
|
||||||
@ -2282,6 +2294,7 @@ xserver_map_shell_surface(struct weston_wm_window *window,
|
|||||||
&wm->server->compositor->shell_interface;
|
&wm->server->compositor->shell_interface;
|
||||||
struct weston_output *output;
|
struct weston_output *output;
|
||||||
struct weston_wm_window *parent;
|
struct weston_wm_window *parent;
|
||||||
|
int flags = 0;
|
||||||
|
|
||||||
weston_wm_window_read_properties(window);
|
weston_wm_window_read_properties(window);
|
||||||
|
|
||||||
@ -2340,11 +2353,20 @@ xserver_map_shell_surface(struct weston_wm_window *window,
|
|||||||
WL_SHELL_SURFACE_TRANSIENT_INACTIVE);
|
WL_SHELL_SURFACE_TRANSIENT_INACTIVE);
|
||||||
} else if (window->transient_for && window->transient_for->surface) {
|
} else if (window->transient_for && window->transient_for->surface) {
|
||||||
parent = window->transient_for;
|
parent = window->transient_for;
|
||||||
|
if (weston_wm_window_type_inactive(window))
|
||||||
|
flags = WL_SHELL_SURFACE_TRANSIENT_INACTIVE;
|
||||||
shell_interface->set_transient(window->shsurf,
|
shell_interface->set_transient(window->shsurf,
|
||||||
parent->surface,
|
parent->surface,
|
||||||
window->x - parent->x,
|
window->x - parent->x,
|
||||||
window->y - parent->y, 0);
|
window->y - parent->y, flags);
|
||||||
} else {
|
} 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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user