From bd03484b2876e8113071aed429a84bbbf296840f Mon Sep 17 00:00:00 2001 From: Zakariyya Von Forslun Date: Wed, 22 Jun 2022 08:56:21 +1000 Subject: [PATCH] Xwayland: restrict OR focus changes based on ICCCM input model Some popup menus are not covered by the `overrideRedirectWantsFocus()` heuristic (e.g. in IntelliJ IDEA), so before focusing an OR window, its input model should also be checked to ensure that it is able to take input focus. This appears to fix the popup menus in IntelliJ IDEA, which would otherwise disappear immediately due to unwanted focus. --- river/Cursor.zig | 4 +++- river/XwaylandOverrideRedirect.zig | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/river/Cursor.zig b/river/Cursor.zig index 4557bad..f66d2be 100644 --- a/river/Cursor.zig +++ b/river/Cursor.zig @@ -317,7 +317,9 @@ fn handleButton(listener: *wl.Listener(*wlr.Pointer.event.Button), event: *wlr.P }, .xwayland_override_redirect => |override_redirect| { if (!build_options.xwayland) unreachable; - if (override_redirect.xwayland_surface.overrideRedirectWantsFocus()) { + if (override_redirect.xwayland_surface.overrideRedirectWantsFocus() and + override_redirect.xwayland_surface.icccmInputModel() != .none) + { self.seat.setFocusRaw(.{ .xwayland_override_redirect = override_redirect }); } }, diff --git a/river/XwaylandOverrideRedirect.zig b/river/XwaylandOverrideRedirect.zig index a6916ec..77cd74b 100644 --- a/river/XwaylandOverrideRedirect.zig +++ b/river/XwaylandOverrideRedirect.zig @@ -96,7 +96,9 @@ pub fn handleMap(listener: *wl.Listener(*wlr.XwaylandSurface), xwayland_surface: xwayland_surface.surface.?.events.commit.add(&self.commit); - if (self.xwayland_surface.overrideRedirectWantsFocus()) { + if (self.xwayland_surface.overrideRedirectWantsFocus() and + self.xwayland_surface.icccmInputModel() != .none) + { server.input_manager.defaultSeat().setFocusRaw(.{ .xwayland_override_redirect = self }); } }