aboutsummaryrefslogtreecommitdiff
path: root/xwayland
diff options
context:
space:
mode:
authorMarkus Ongyerth <ongy@ongy.net>2018-07-29 11:20:16 +0200
committerMarkus Ongyerth <ongy@ongy.net>2018-07-29 14:43:17 +0200
commit81cc842f8f27461742710b4195443da64c7bfeef (patch)
treeb06e78f383a6705fa931d1053cc584f7763c7716 /xwayland
parentf1b65b34a6caff8db7c729b6362ec57f2707aa1a (diff)
reintroduce xwayland is_unmanaged
153f37bdf57c61e7fb09162a6791afe8b9b4d0ef (#1145) removed the wlr_xwayland_is_unamanged function while fixing OR, because it was belieived that it's supposed to work around the broken OR handling. This was a misunderstanding. is_unmanaged is (while sort of a hack) intended to work around inherent differences between "real" X sessions and our Xwayland/wayland situation. The main reason it exists is to support applications like rofi and dzen, while not handing focus to other OR windows (which should *not* be required). Traditionally, these applications just grabbed input from X and didn't need to be focused by any logic in the WM. Which of course doesn't work in wayland compositors. So we have to give them focus in some way. Giving *every* OR window focus, breaks other applications that don't expect focus to change. A testcase that was pointed out to me where wlr_xwayland_is_unamanged was breaking things is https://github.com/swaywm/sway/issues/2128 (syncplay, gitk, gitgui) Supposedly it broke using keyboard to navigate the menus. I can't reproduce this with this patch. The popups can be navigated as long as the parent has focus.
Diffstat (limited to 'xwayland')
-rw-r--r--xwayland/xwm.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/xwayland/xwm.c b/xwayland/xwm.c
index 7999480a..c939d8ea 100644
--- a/xwayland/xwm.c
+++ b/xwayland/xwm.c
@@ -1703,3 +1703,27 @@ void wlr_xwayland_surface_ping(struct wlr_xwayland_surface *surface) {
surface->xwm->ping_timeout);
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;
+}