diff --git a/include/view.h b/include/view.h index b0cb8471..53534670 100644 --- a/include/view.h +++ b/include/view.h @@ -351,14 +351,6 @@ void view_array_append(struct server *server, struct wl_array *views, 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 * @@ -380,10 +372,7 @@ enum view_edge view_edge_invert(enum view_edge 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); diff --git a/src/desktop.c b/src/desktop.c index 35d56b87..523f919c 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -214,8 +214,6 @@ desktop_cycle_view(struct server *server, struct view *start_view, 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; @@ -226,7 +224,7 @@ desktop_topmost_focusable_view(struct server *server) 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; } } diff --git a/src/view.c b/src/view.c index 52627643..a99ef91b 100644 --- a/src/view.c +++ b/src/view.c @@ -163,28 +163,16 @@ view_wants_focus(struct view *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); } /**