xwayland: always offer focus in Globally Active case

In 9e3785f8cd, a heuristic was added to assume that NORMAL and DIALOG
window types were always focusable. (This was before we had the "offer
focus" mechanism in place.)

However, we should still call wlr_xwayland_surface_offer_focus() for
these views, in case they actually don't want focus. (This is uncommon
but has recently been seen with WeChat popups, which have both NORMAL
and UTILITY type.)

To make this possible, refine view_wants_focus() to return either
LIKELY or UNLIKELY for Globally Active input windows. This decouples
the question of "should we try to focus this view" from the actual
mechanism used to do so.
This commit is contained in:
John Lindgren 2025-06-09 11:11:32 -04:00
parent 97ce4131bb
commit 8fb2ecefcb
4 changed files with 22 additions and 12 deletions

View file

@ -116,8 +116,8 @@ xwayland_view_wants_focus(struct view *view)
*/
case WLR_ICCCM_INPUT_MODEL_GLOBAL:
/*
* Assume that NORMAL and DIALOG windows always want
* focus. These window types should show up in the
* Assume that NORMAL and DIALOG windows are likely to
* want focus. These window types should show up in the
* Alt-Tab switcher and be automatically focused when
* they become topmost.
*/
@ -125,7 +125,7 @@ xwayland_view_wants_focus(struct view *view)
WLR_XWAYLAND_NET_WM_WINDOW_TYPE_NORMAL)
|| wlr_xwayland_surface_has_window_type(xsurface,
WLR_XWAYLAND_NET_WM_WINDOW_TYPE_DIALOG)) ?
VIEW_WANTS_FOCUS_ALWAYS : VIEW_WANTS_FOCUS_OFFER;
VIEW_WANTS_FOCUS_LIKELY : VIEW_WANTS_FOCUS_UNLIKELY;
/*
* No Input - The client never expects keyboard input.