mirror of
https://github.com/labwc/labwc.git
synced 2025-10-29 05:40:24 -04:00
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:
parent
97ce4131bb
commit
8fb2ecefcb
4 changed files with 22 additions and 12 deletions
|
|
@ -75,13 +75,18 @@ enum view_wants_focus {
|
||||||
/* View wants focus */
|
/* View wants focus */
|
||||||
VIEW_WANTS_FOCUS_ALWAYS,
|
VIEW_WANTS_FOCUS_ALWAYS,
|
||||||
/*
|
/*
|
||||||
* View should be offered focus and may accept or decline
|
* The following values apply only to XWayland views using the
|
||||||
* (a.k.a. ICCCM Globally Active input model). Labwc generally
|
* Globally Active input model per the ICCCM. These views are
|
||||||
* avoids focusing these views automatically (e.g. when another
|
* offered focus and will voluntarily accept or decline it.
|
||||||
* view on top is closed) but they may be focused by user action
|
*
|
||||||
* (e.g. mouse click).
|
* 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,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -84,7 +84,8 @@ desktop_focus_view(struct view *view, bool raise)
|
||||||
seat_focus_surface(seat, view->surface);
|
seat_focus_surface(seat, view->surface);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case VIEW_WANTS_FOCUS_OFFER:
|
case VIEW_WANTS_FOCUS_LIKELY:
|
||||||
|
case VIEW_WANTS_FOCUS_UNLIKELY:
|
||||||
view_offer_focus(view);
|
view_offer_focus(view);
|
||||||
break;
|
break;
|
||||||
case VIEW_WANTS_FOCUS_NEVER:
|
case VIEW_WANTS_FOCUS_NEVER:
|
||||||
|
|
|
||||||
|
|
@ -392,10 +392,14 @@ view_is_focusable(struct view *view)
|
||||||
if (!view->surface) {
|
if (!view->surface) {
|
||||||
return false;
|
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 false;
|
||||||
}
|
}
|
||||||
return (view->mapped || view->minimized);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -116,8 +116,8 @@ xwayland_view_wants_focus(struct view *view)
|
||||||
*/
|
*/
|
||||||
case WLR_ICCCM_INPUT_MODEL_GLOBAL:
|
case WLR_ICCCM_INPUT_MODEL_GLOBAL:
|
||||||
/*
|
/*
|
||||||
* Assume that NORMAL and DIALOG windows always want
|
* Assume that NORMAL and DIALOG windows are likely to
|
||||||
* focus. These window types should show up in the
|
* want focus. These window types should show up in the
|
||||||
* Alt-Tab switcher and be automatically focused when
|
* Alt-Tab switcher and be automatically focused when
|
||||||
* they become topmost.
|
* they become topmost.
|
||||||
*/
|
*/
|
||||||
|
|
@ -125,7 +125,7 @@ xwayland_view_wants_focus(struct view *view)
|
||||||
WLR_XWAYLAND_NET_WM_WINDOW_TYPE_NORMAL)
|
WLR_XWAYLAND_NET_WM_WINDOW_TYPE_NORMAL)
|
||||||
|| wlr_xwayland_surface_has_window_type(xsurface,
|
|| wlr_xwayland_surface_has_window_type(xsurface,
|
||||||
WLR_XWAYLAND_NET_WM_WINDOW_TYPE_DIALOG)) ?
|
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.
|
* No Input - The client never expects keyboard input.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue