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.
This commit is contained in:
Consolatis 2022-12-29 04:50:21 +01:00
parent f7c8663f67
commit e39fd341ec
3 changed files with 12 additions and 8 deletions

View file

@ -143,6 +143,7 @@ void view_set_fullscreen(struct view *view, bool fullscreen,
void view_toggle_maximize(struct view *view); void view_toggle_maximize(struct view *view);
void view_toggle_decorations(struct view *view); void view_toggle_decorations(struct view *view);
void view_toggle_always_on_top(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_move_to_workspace(struct view *view, struct workspace *workspace);
void view_set_decorations(struct view *view, bool decorations); void view_set_decorations(struct view *view, bool decorations);
void view_toggle_fullscreen(struct view *view); void view_toggle_fullscreen(struct view *view);

View file

@ -522,9 +522,10 @@ view_toggle_decorations(struct view *view)
view_set_decorations(view, !view->ssd_enabled); view_set_decorations(view, !view->ssd_enabled);
} }
static bool bool
is_always_on_top(struct view *view) view_is_always_on_top(struct view *view)
{ {
assert(view);
return view->scene_tree->node.parent == return view->scene_tree->node.parent ==
view->server->view_tree_always_on_top; view->server->view_tree_always_on_top;
} }
@ -533,7 +534,7 @@ void
view_toggle_always_on_top(struct view *view) view_toggle_always_on_top(struct view *view)
{ {
assert(view); assert(view);
if (is_always_on_top(view)) { if (view_is_always_on_top(view)) {
view->workspace = view->server->workspace_current; view->workspace = view->server->workspace_current;
wlr_scene_node_reparent(&view->scene_tree->node, wlr_scene_node_reparent(&view->scene_tree->node,
view->workspace->tree); view->workspace->tree);

View file

@ -13,6 +13,7 @@
#include "common/list.h" #include "common/list.h"
#include "common/mem.h" #include "common/mem.h"
#include "labwc.h" #include "labwc.h"
#include "view.h"
#include "workspaces.h" #include "workspaces.h"
/* Internal helpers */ /* Internal helpers */
@ -259,13 +260,14 @@ workspaces_switch_to(struct workspace *target)
/* Make sure new views will spawn on the new workspace */ /* Make sure new views will spawn on the new workspace */
server->workspace_current = target; server->workspace_current = target;
/** /*
* Make sure we are focusing what the user sees. * Make sure we are focusing what the user sees.
* * Only refocus if the focus is not already on an always-on-top view.
* TODO: This is an issue for always-on-top views as they will
* loose keyboard focus once switching to another workspace.
*/ */
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 */ /* And finally show the OSD */
_osd_show(server); _osd_show(server);