From e39fd341ec1eba2cd6d65e89587aec9dbc9f346b Mon Sep 17 00:00:00 2001 From: Consolatis <35009135+Consolatis@users.noreply.github.com> Date: Thu, 29 Dec 2022 04:50:21 +0100 Subject: [PATCH] src/workspaces.c: prevent re-focus for always-on-top views Before this patch a focused always-on-top view lost its keyboard focus when switching workspaces. Now the view keeps its focus. --- include/view.h | 1 + src/view.c | 7 ++++--- src/workspaces.c | 12 +++++++----- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/include/view.h b/include/view.h index f65f7f90..cf3637cf 100644 --- a/include/view.h +++ b/include/view.h @@ -143,6 +143,7 @@ void view_set_fullscreen(struct view *view, bool fullscreen, void view_toggle_maximize(struct view *view); void view_toggle_decorations(struct view *view); void view_toggle_always_on_top(struct view *view); +bool view_is_always_on_top(struct view *view); void view_move_to_workspace(struct view *view, struct workspace *workspace); void view_set_decorations(struct view *view, bool decorations); void view_toggle_fullscreen(struct view *view); diff --git a/src/view.c b/src/view.c index b367045e..f520b3e6 100644 --- a/src/view.c +++ b/src/view.c @@ -522,9 +522,10 @@ view_toggle_decorations(struct view *view) view_set_decorations(view, !view->ssd_enabled); } -static bool -is_always_on_top(struct view *view) +bool +view_is_always_on_top(struct view *view) { + assert(view); return view->scene_tree->node.parent == view->server->view_tree_always_on_top; } @@ -533,7 +534,7 @@ void view_toggle_always_on_top(struct view *view) { assert(view); - if (is_always_on_top(view)) { + if (view_is_always_on_top(view)) { view->workspace = view->server->workspace_current; wlr_scene_node_reparent(&view->scene_tree->node, view->workspace->tree); diff --git a/src/workspaces.c b/src/workspaces.c index 90614e5d..e3c149de 100644 --- a/src/workspaces.c +++ b/src/workspaces.c @@ -13,6 +13,7 @@ #include "common/list.h" #include "common/mem.h" #include "labwc.h" +#include "view.h" #include "workspaces.h" /* Internal helpers */ @@ -259,13 +260,14 @@ workspaces_switch_to(struct workspace *target) /* Make sure new views will spawn on the new workspace */ server->workspace_current = target; - /** + /* * Make sure we are focusing what the user sees. - * - * TODO: This is an issue for always-on-top views as they will - * loose keyboard focus once switching to another workspace. + * Only refocus if the focus is not already on an always-on-top view. */ - desktop_focus_topmost_mapped_view(target->server); + struct view *view = desktop_focused_view(server); + if (!view || !view_is_always_on_top(view)) { + desktop_focus_topmost_mapped_view(server); + } /* And finally show the OSD */ _osd_show(server); -- 2.52.0