enum view_wants_focus view_wants_focus(struct view *view);
-/**
- * view_is_focusable_from() - variant of view_is_focusable()
- * that takes into account the previously focused surface
- * @view: view to be checked
- * @prev_surface: previously focused surface
- */
-bool view_is_focusable_from(struct view *view, struct wlr_surface *prev);
-
/**
* view_edge_invert() - select the opposite of a provided edge
*
* The only views that are allowed to be focusd are those that have a surface
* and have been mapped at some point since creation.
*/
-static inline bool
-view_is_focusable(struct view *view) {
- return view_is_focusable_from(view, NULL);
-}
+bool view_is_focusable(struct view *view);
void mappable_connect(struct mappable *mappable, struct wlr_surface *surface,
wl_notify_func_t notify_map, wl_notify_func_t notify_unmap);
struct view *
desktop_topmost_focusable_view(struct server *server)
{
- struct wlr_surface *prev =
- server->seat.seat->keyboard_state.focused_surface;
struct view *view;
struct wl_list *node_list;
struct wlr_scene_node *node;
continue;
}
view = node_view_from_node(node);
- if (view->mapped && view_is_focusable_from(view, prev)) {
+ if (view->mapped && view_is_focusable(view)) {
return view;
}
}
}
bool
-view_is_focusable_from(struct view *view, struct wlr_surface *prev)
+view_is_focusable(struct view *view)
{
assert(view);
if (!view->surface) {
return false;
}
- if (!view->mapped && !view->minimized) {
+ if (view_wants_focus(view) != VIEW_WANTS_FOCUS_ALWAYS) {
return false;
}
- enum view_wants_focus wants_focus = view_wants_focus(view);
- /*
- * Consider "offer focus" (Globally Active) views as focusable
- * only if another surface from the same application already had
- * focus. The goal is to allow focusing a parent window when a
- * dialog/popup is closed, but still avoid focusing standalone
- * panels/toolbars/notifications. Note that we are basically
- * guessing whether Globally Active views want focus, and will
- * probably be wrong some of the time.
- */
- return (wants_focus == VIEW_WANTS_FOCUS_ALWAYS
- || (wants_focus == VIEW_WANTS_FOCUS_OFFER
- && prev && view_is_related(view, prev)));
+ return (view->mapped || view->minimized);
}
/**