diff --git a/include/view.h b/include/view.h index 613f9160..b1df8abf 100644 --- a/include/view.h +++ b/include/view.h @@ -75,13 +75,18 @@ enum view_wants_focus { /* View wants focus */ VIEW_WANTS_FOCUS_ALWAYS, /* - * View should be offered focus and may accept or decline - * (a.k.a. ICCCM Globally Active input model). Labwc generally - * avoids focusing these views automatically (e.g. when another - * view on top is closed) but they may be focused by user action - * (e.g. mouse click). + * The following values apply only to XWayland views using the + * Globally Active input model per the ICCCM. These views are + * offered focus and will voluntarily accept or decline it. + * + * In some cases, labwc needs to decide in advance whether to + * focus the view. For this purpose, these views are classified + * (by a heuristic) as likely or unlikely to want focus. However, + * it is still ultimately up to the client whether the view gets + * focus or not. */ - VIEW_WANTS_FOCUS_OFFER, + VIEW_WANTS_FOCUS_LIKELY, + VIEW_WANTS_FOCUS_UNLIKELY, }; /* diff --git a/src/desktop.c b/src/desktop.c index 47ae1fb4..df179eb2 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -84,7 +84,8 @@ desktop_focus_view(struct view *view, bool raise) seat_focus_surface(seat, view->surface); } break; - case VIEW_WANTS_FOCUS_OFFER: + case VIEW_WANTS_FOCUS_LIKELY: + case VIEW_WANTS_FOCUS_UNLIKELY: view_offer_focus(view); break; case VIEW_WANTS_FOCUS_NEVER: diff --git a/src/view.c b/src/view.c index 33b9ec39..2c4560be 100644 --- a/src/view.c +++ b/src/view.c @@ -392,10 +392,14 @@ view_is_focusable(struct view *view) if (!view->surface) { return false; } - if (view_wants_focus(view) != VIEW_WANTS_FOCUS_ALWAYS) { + + switch (view_wants_focus(view)) { + case VIEW_WANTS_FOCUS_ALWAYS: + case VIEW_WANTS_FOCUS_LIKELY: + return (view->mapped || view->minimized); + default: return false; } - return (view->mapped || view->minimized); } void diff --git a/src/xwayland.c b/src/xwayland.c index 4d2860e3..7a4aed9b 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -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.