Merge pull request #1165 from Ongy/reintroduce_is_unmanaged

reintroduce xwayland is_unmanaged
This commit is contained in:
Drew DeVault 2018-07-29 10:49:29 -04:00 committed by GitHub
commit 5734d0530c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 51 additions and 1 deletions

View file

@ -209,4 +209,29 @@ struct wlr_xwayland_surface *wlr_xwayland_surface_from_wlr_surface(
void wlr_xwayland_surface_ping(struct wlr_xwayland_surface *surface); void wlr_xwayland_surface_ping(struct wlr_xwayland_surface *surface);
/** Metric to guess if an OR window should "receive" focus
*
* In the pure X setups, window managers usually straight up ignore override
* redirect windows, and never touch them. (we have to handle them for mapping)
*
* When such a window wants to receive keyboard input (e.g. rofi/dzen) it will
* use mechanics we don't support (sniffing/grabbing input).
* [Sadly this is unrelated to xwayland-keyboard-grab]
*
* To still support these windows, while keeping general OR semantics as is, we
* need to hand a subset of windows focus.
* The dirty truth is, we need to hand focus to any Xwayland window, though
* pretending this window has focus makes it easier to handle unmap.
*
* This function provides a handy metric based on the window type to guess if
* the OR window wants focus.
* It's probably not perfect, nor exactly intended but works in practice.
*
* Returns: true if the window should receive focus
* false if it should be ignored
*/
bool wlr_xwayland_or_surface_wants_focus(
const struct wlr_xwayland_surface *surface);
#endif #endif

View file

@ -1124,7 +1124,8 @@ void roots_seat_set_focus(struct roots_seat *seat, struct roots_view *view) {
#ifdef WLR_HAS_XWAYLAND #ifdef WLR_HAS_XWAYLAND
if (view && view->type == ROOTS_XWAYLAND_VIEW && if (view && view->type == ROOTS_XWAYLAND_VIEW &&
view->xwayland_surface->override_redirect) { !wlr_xwayland_or_surface_wants_focus(
view->xwayland_surface)) {
return; return;
} }
#endif #endif

View file

@ -1703,3 +1703,27 @@ void wlr_xwayland_surface_ping(struct wlr_xwayland_surface *surface) {
surface->xwm->ping_timeout); surface->xwm->ping_timeout);
surface->pinging = true; surface->pinging = true;
} }
bool wlr_xwayland_or_surface_wants_focus(
const struct wlr_xwayland_surface *surface) {
bool ret = true;
static enum atom_name needles[] = {
NET_WM_WINDOW_TYPE_COMBO,
NET_WM_WINDOW_TYPE_DND,
NET_WM_WINDOW_TYPE_DROPDOWN_MENU,
NET_WM_WINDOW_TYPE_MENU,
NET_WM_WINDOW_TYPE_NOTIFICATION,
NET_WM_WINDOW_TYPE_POPUP_MENU,
NET_WM_WINDOW_TYPE_SPLASH,
NET_WM_WINDOW_TYPE_TOOLTIP,
NET_WM_WINDOW_TYPE_UTILITY,
};
for (size_t i = 0; i < sizeof(needles) / sizeof(needles[0]); ++i) {
if (xwm_atoms_contains(surface->xwm, surface->window_type,
surface->window_type_len, needles[i])) {
ret = false;
}
}
return ret;
}