]> git.mdlowis.com Git - proto/labwc.git/commitdiff
osd: show alt-tab switcher center-aligned on all outputs
authorJohan Malm <jgm323@gmail.com>
Wed, 20 Apr 2022 16:45:10 +0000 (17:45 +0100)
committerJohan Malm <jgm323@gmail.com>
Wed, 20 Apr 2022 16:45:10 +0000 (17:45 +0100)
Fixes issue #283

include/labwc.h
src/debug.c
src/desktop.c
src/osd.c
src/output.c
src/server.c

index ac8732eef5cbaa51e8fdb5392dcb6a2d570f6ca1..55c40b4ff2da7e954f44e545e7fcfd0f5682576c 100644 (file)
@@ -183,8 +183,6 @@ struct server {
 #endif
        /* Tree for built in menu */
        struct wlr_scene_tree *menu_tree;
-       /* Tree for built in OSD / app switcher */
-       struct wlr_scene_tree *osd_tree;
 
        struct wl_list outputs;
        struct wl_listener new_output;
@@ -225,6 +223,7 @@ struct output {
        struct wl_list layers[LAB_NR_LAYERS];
        struct wlr_scene_tree *layer_tree[LAB_NR_LAYERS];
        struct wlr_scene_tree *layer_popup_tree;
+       struct wlr_scene_tree *osd_tree;
        struct wlr_box usable_area;
 
        struct lab_data_buffer *osd_buffer;
index 697aacdf5c829da76b5c8feb72cbfcc280e451a9..ccf51dc4232e8908d814e166eeb22579df559869 100644 (file)
@@ -87,15 +87,15 @@ get_special(struct server *server, struct wlr_scene_node *node,
        if (node == &server->scene->node) {
                return "server->scene";
        }
-       if (node == &server->osd_tree->node) {
-               return "server->osd_tree";
-       }
        if (node == &server->menu_tree->node) {
                return "server->menu_tree";
        }
        if (node->parent == &server->scene->node) {
                struct output *output;
                wl_list_for_each(output, &server->outputs, link) {
+                       if (node == &output->osd_tree->node) {
+                               return "output->osd_tree";
+                       }
                        for (int i = 0; i < 4; i++) {
                                if (node == &output->layer_tree[i]->node) {
                                        return get_layer_name(i);
index 4a69a7c369704942b259073f75f6d4e6190e0430..c9301a31062fa2ba05cfd5a09fde9ae434cd681f 100644 (file)
@@ -284,7 +284,6 @@ desktop_node_and_view_at(struct server *server, double lx, double ly,
                }
 #endif
        }
-       struct wlr_scene_node *osd = &server->osd_tree->node;
        while (node) {
                struct node_descriptor *desc = node->data;
                /* TODO: convert to switch() */
@@ -307,10 +306,6 @@ desktop_node_and_view_at(struct server *server, double lx, double ly,
                                return NULL;
                        }
                }
-               if (node == osd) {
-                       *view_area = LAB_SSD_OSD;
-                       return NULL;
-               }
                node = node->parent;
        }
        if (!node) {
index 98bc888114c31507f76065997471217b358ddb24..8f5fa670f123d166c9577b10559ef3751fe5b2a4 100644 (file)
--- a/src/osd.c
+++ b/src/osd.c
@@ -75,10 +75,10 @@ get_osd_height(struct wl_list *views)
 }
 
 static void
-destroy_osd_nodes(struct server *server)
+destroy_osd_nodes(struct output *output)
 {
        struct wlr_scene_node *child, *next;
-       struct wl_list *children = &server->osd_tree->node.state.children;
+       struct wl_list *children = &output->osd_tree->node.state.children;
        wl_list_for_each_safe(child, next, children, state.link) {
                wlr_scene_node_destroy(child);
        }
@@ -87,18 +87,25 @@ destroy_osd_nodes(struct server *server)
 void
 osd_finish(struct server *server)
 {
-       destroy_osd_nodes(server);
-       wlr_scene_node_set_enabled(&server->osd_tree->node, false);
+       struct output *output;
+       wl_list_for_each(output, &server->outputs, link) {
+               destroy_osd_nodes(output);
+               wlr_scene_node_set_enabled(&output->osd_tree->node, false);
+       }
 }
 
 void
 osd_update(struct server *server)
 {
+       if (wl_list_empty(&server->views)) {
+               return;
+       }
+
        struct theme *theme = server->theme;
 
-       destroy_osd_nodes(server);
        struct output *output;
        wl_list_for_each(output, &server->outputs, link) {
+               destroy_osd_nodes(output);
                float scale = output->wlr_output->scale;
                int w = (OSD_ITEM_WIDTH + (2 * OSD_BORDER_WIDTH)) * scale;
                int h = get_osd_height(&server->views) * scale;
@@ -201,10 +208,17 @@ osd_update(struct server *server)
                cairo_surface_flush(surf);
 
                struct wlr_scene_buffer *scene_buffer = wlr_scene_buffer_create(
-                       &server->osd_tree->node, &output->osd_buffer->base);
-
-               /* TODO: set position properly */
-               wlr_scene_node_set_position(&scene_buffer->node, 10, 10);
-               wlr_scene_node_set_enabled(&server->osd_tree->node, true);
+                       &output->osd_tree->node, &output->osd_buffer->base);
+
+               /* Center OSD */
+               struct wlr_box output_box;
+               wlr_output_layout_get_box(output->server->output_layout,
+                       output->wlr_output, &output_box);
+               int lx = output->usable_area.x + output->usable_area.width / 2
+                       - w / 2 + output_box.x;
+               int ly = output->usable_area.y + output->usable_area.height / 2
+                       - h / 2 + output_box.y;
+               wlr_scene_node_set_position(&output->osd_tree->node, lx, ly);
+               wlr_scene_node_set_enabled(&output->osd_tree->node, true);
        }
 }
index 512295211b1588976e6a6b362c92dab8f5dce1a7..d4863a9ffcba0522e4daf15957f271c669a3267c 100644 (file)
@@ -142,6 +142,9 @@ new_output_notify(struct wl_listener *listener, void *data)
        output->layer_popup_tree = wlr_scene_tree_create(&server->scene->node);
        node_descriptor_create(&output->layer_popup_tree->node,
                LAB_NODE_DESC_TREE, NULL);
+       output->osd_tree = wlr_scene_tree_create(&server->scene->node);
+       node_descriptor_create(&output->osd_tree->node,
+               LAB_NODE_DESC_TREE, NULL);
 
        /*
         * Set the z-positions to achieve the following order (from top to
index adeb4fb7507830e651c630266e5152342de176ea..b3adad51dedc4f77874f0106e13f0438d9747188 100644 (file)
@@ -240,7 +240,6 @@ server_init(struct server *server)
        server->unmanaged_tree = wlr_scene_tree_create(&server->scene->node);
 #endif
        server->menu_tree = wlr_scene_tree_create(&server->scene->node);
-       server->osd_tree = wlr_scene_tree_create(&server->scene->node);
 
        output_init(server);