]> git.mdlowis.com Git - proto/labwc.git/commitdiff
osd: show preview for windows on other workspaces
authorJohan Malm <jgm323@gmail.com>
Tue, 5 Mar 2024 21:01:39 +0000 (21:01 +0000)
committerConsolatis <35009135+Consolatis@users.noreply.github.com>
Tue, 5 Mar 2024 21:16:55 +0000 (22:16 +0100)
Written-by: @Consolatis
include/labwc.h
src/osd.c

index abe32a6c2958aaec7c2fd94e29acdb72a94a79a9..204f60e3c36ff60ab66b781e61c6435618bf3227 100644 (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;
index d283459fb66bda0d76442200dbc1250283220ca1..b0b59a784fa21a859bc72798d96d76268cbf54b0 100644 (file)
--- a/src/osd.c
+++ b/src/osd.c
@@ -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);
 }