]> git.mdlowis.com Git - proto/labwc.git/commitdiff
Add ToggleAlwaysOnTop action
authorConsolatis <35009135+Consolatis@users.noreply.github.com>
Fri, 8 Apr 2022 23:16:09 +0000 (01:16 +0200)
committerJohan Malm <johanmalm@users.noreply.github.com>
Sat, 9 Apr 2022 16:18:39 +0000 (17:18 +0100)
docs/labwc-actions.5.scd
docs/menu.xml
include/labwc.h
src/action.c
src/debug.c
src/menu/menu.c
src/server.c
src/view.c

index a47f93e71823ce2327eb8f9900dc953b5620291b..ef65a52486d9a5b600edd7af128951261b3fd2bf 100644 (file)
@@ -61,6 +61,9 @@ Actions are used in keyboard bindings.
 *<action name="ToggleMaximize">*
        Toggle maximize state of focused window.
 
+*<action name="ToggleAlwaysOnTop">*
+       Toggle always-on-top of focused window.
+
 # SEE ALSO
 
 labwc(1), labwc-config(5), labwc-theme(5)
index 45c4ba9808703b8d99cbfc1657f8af92dce7cec9..485077d0b88fad2d3b1b1ced1e1e74af87231407 100644 (file)
@@ -14,6 +14,9 @@
        <item label="Decorations">
                <action name="ToggleDecorations" />
        </item>
+       <item label="AlwaysOnTop">
+               <action name="ToggleAlwaysOnTop" />
+       </item>
        <item label="Close">
                <action name="Close" />
        </item>
index 2670a8ce00447350407eff8163c6afc2d267de2f..ac8732eef5cbaa51e8fdb5392dcb6a2d570f6ca1 100644 (file)
@@ -175,6 +175,8 @@ struct server {
 
        /* Tree for all non-layer xdg/xwayland-shell surfaces */
        struct wlr_scene_tree *view_tree;
+       /* Tree for all non-layer xdg/xwayland-shell surfaces with always-on-top */
+       struct wlr_scene_tree *view_tree_always_on_top;
 #if HAVE_XWAYLAND
        /* Tree for unmanaged xsurfaces without initialized view (usually popups) */
        struct wlr_scene_tree *unmanaged_tree;
@@ -399,6 +401,7 @@ void view_set_fullscreen(struct view *view, bool fullscreen,
        struct wlr_output *wlr_output);
 void view_toggle_maximize(struct view *view);
 void view_toggle_decorations(struct view *view);
+void view_toggle_always_on_top(struct view *view);
 void view_set_decorations(struct view *view, bool decorations);
 void view_toggle_fullscreen(struct view *view);
 void view_adjust_for_layout_change(struct view *view);
index 314c0fe6780c69e70d6a379f8fda2766e84bcdaa..646ca4d8cb74fdeb443524be0bf249fc18b5e02d 100644 (file)
@@ -24,6 +24,7 @@ enum action_type {
        ACTION_TYPE_TOGGLE_MAXIMIZE,
        ACTION_TYPE_TOGGLE_FULLSCREEN,
        ACTION_TYPE_TOGGLE_DECORATIONS,
+       ACTION_TYPE_TOGGLE_ALWAYS_ON_TOP,
        ACTION_TYPE_FOCUS,
        ACTION_TYPE_ICONIFY,
        ACTION_TYPE_MOVE,
@@ -46,6 +47,7 @@ const char *action_names[] = {
        "ToggleMaximize",
        "ToggleFullscreen",
        "ToggleDecorations",
+       "ToggleAlwaysOnTop",
        "Focus",
        "Iconify",
        "Move",
@@ -209,6 +211,11 @@ actions_run(struct view *activator, struct server *server,
                                view_toggle_decorations(view);
                        }
                        break;
+               case ACTION_TYPE_TOGGLE_ALWAYS_ON_TOP:
+                       if (view) {
+                               view_toggle_always_on_top(view);
+                       }
+                       break;
                case ACTION_TYPE_FOCUS:
                        view = desktop_view_at_cursor(server);
                        if (view) {
index 68dcbc2a669c22e045810e0033a9d44f7d920339..697aacdf5c829da76b5c8feb72cbfcc280e451a9 100644 (file)
@@ -111,7 +111,12 @@ get_special(struct server *server, struct wlr_scene_node *node,
        if (node == &server->view_tree->node) {
                return "server->view_tree";
        }
-       if (node->parent == &server->view_tree->node) {
+       if (node == &server->view_tree_always_on_top->node) {
+               return "server->view_tree_always_on_top";
+       }
+       if (node->parent == &server->view_tree->node ||
+                       node->parent == &server->view_tree_always_on_top->node) {
+               *last_view = node_view_from_node(node);
                *last_view = node_view_from_node(node);
        }
        const char *view_part = get_view_part(*last_view, node);
index 67bdeb449987fcbd8b6ea1dc8491df14f6b593e6..c74b8daa4f6a09032669f2a186fd7a50d1e5c78c 100644 (file)
@@ -452,6 +452,8 @@ menu_init_windowmenu(struct server *server)
                fill_item("name.action", "ToggleFullscreen");
                current_item = item_create(menu, "Decorations");
                fill_item("name.action", "ToggleDecorations");
+               current_item = item_create(menu, "AlwaysOnTop");
+               fill_item("name.action", "ToggleAlwaysOnTop");
                current_item = item_create(menu, "Close");
                fill_item("name.action", "Close");
        }
index 4865c417c9579713957fb249f3b9375882ac619e..adeb4fb7507830e651c630266e5152342de176ea 100644 (file)
@@ -235,6 +235,7 @@ server_init(struct server *server)
                exit(EXIT_FAILURE);
        }
        server->view_tree = wlr_scene_tree_create(&server->scene->node);
+       server->view_tree_always_on_top = wlr_scene_tree_create(&server->scene->node);
 #if HAVE_XWAYLAND
        server->unmanaged_tree = wlr_scene_tree_create(&server->scene->node);
 #endif
index c14731e6c69a1c307cae5ffc9f17149986b0ce9f..2ce0084d76cd689b553feba6d27c219befad5188 100644 (file)
@@ -281,6 +281,25 @@ view_toggle_decorations(struct view *view)
        }
 }
 
+static bool
+is_always_on_top(struct view *view)
+{
+       return view->scene_tree->node.parent ==
+               &view->server->view_tree_always_on_top->node;
+}
+
+void
+view_toggle_always_on_top(struct view *view)
+{
+       if (is_always_on_top(view)) {
+               wlr_scene_node_reparent(&view->scene_tree->node,
+                       &view->server->view_tree->node);
+       } else {
+               wlr_scene_node_reparent(&view->scene_tree->node,
+                       &view->server->view_tree_always_on_top->node);
+       }
+}
+
 void
 view_set_decorations(struct view *view, bool decorations)
 {