osd: show preview for windows on other workspaces

Written-by: @Consolatis
This commit is contained in:
Johan Malm 2024-03-05 21:01:39 +00:00 committed by Consolatis
parent 72a41058af
commit 4d68ee424a
2 changed files with 17 additions and 1 deletions

View file

@ -337,6 +337,7 @@ struct server {
struct view *cycle_view;
bool preview_was_enabled;
struct wlr_scene_node *preview_node;
struct wlr_scene_tree *preview_parent;
struct wlr_scene_node *preview_anchor;
struct multi_rect *preview_outline;
} osd_state;

View file

@ -163,6 +163,9 @@ osd_preview_restore(struct server *server)
{
struct osd_state *osd_state = &server->osd_state;
if (osd_state->preview_node) {
wlr_scene_node_reparent(osd_state->preview_node,
osd_state->preview_parent);
if (osd_state->preview_anchor) {
wlr_scene_node_place_above(osd_state->preview_node,
osd_state->preview_anchor);
@ -176,6 +179,7 @@ osd_preview_restore(struct server *server)
wlr_scene_node_set_enabled(osd_state->preview_node, false);
}
osd_state->preview_node = NULL;
osd_state->preview_parent = NULL;
osd_state->preview_anchor = NULL;
}
}
@ -190,8 +194,11 @@ preview_cycled_view(struct view *view)
/* Move previous selected node back to its original place */
osd_preview_restore(view->server);
/* Remember the sibling right before the selected node */
/* Store some pointers so we can reset the preview later on */
osd_state->preview_node = &view->scene_tree->node;
osd_state->preview_parent = view->scene_tree->node.parent;
/* Remember the sibling right before the selected node */
osd_state->preview_anchor = lab_wlr_scene_get_prev_node(
osd_state->preview_node);
while (osd_state->preview_anchor && !osd_state->preview_anchor->data) {
@ -206,6 +213,14 @@ preview_cycled_view(struct view *view)
wlr_scene_node_set_enabled(osd_state->preview_node, true);
}
/*
* FIXME: This abuses an implementation detail of the always-on-top tree.
* Create a permanent server->osd_preview_tree instead that can
* also be used as parent for the preview outlines.
*/
wlr_scene_node_reparent(osd_state->preview_node,
view->server->view_tree_always_on_top);
/* Finally raise selected node to the top */
wlr_scene_node_raise_to_top(osd_state->preview_node);
}