From 77d1747f1ba70d90e6381e7afec002b2c0508c65 Mon Sep 17 00:00:00 2001 From: Consolatis <35009135+Consolatis@users.noreply.github.com> Date: Tue, 12 Nov 2024 01:23:37 +0100 Subject: [PATCH] workspaces: keep focus on omnipresent windows when switching workspaces Fixes: #2329 --- src/workspaces.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/workspaces.c b/src/workspaces.c index 96e19635..190549e6 100644 --- a/src/workspaces.c +++ b/src/workspaces.c @@ -339,12 +339,19 @@ workspaces_switch_to(struct workspace *target, bool update_focus) server->workspaces.current = target; /* - * Make sure we are focusing what the user sees. - * Only refocus if the focus is not already on an always-on-top view. + * Make sure we are focusing what the user sees. Only refocus if + * the focus is not already on an omnipresent or always-on-top view. + * + * TODO: Decouple always-on-top views from the omnipresent state. + * One option for that would be to create a new scene tree + * as child of every workspace tree and then reparent a-o-t + * windows to that one. Combined with adjusting the condition + * below that should take care of the issue. */ if (update_focus) { struct view *view = server->active_view; - if (!view || !view_is_always_on_top(view)) { + if (!view || (!view->visible_on_all_workspaces + && !view_is_always_on_top(view))) { desktop_focus_topmost_view(server); } }