diff --git a/include/labwc.h b/include/labwc.h index ac8732ee..55c40b4f 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -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; diff --git a/src/debug.c b/src/debug.c index 697aacdf..ccf51dc4 100644 --- a/src/debug.c +++ b/src/debug.c @@ -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); diff --git a/src/desktop.c b/src/desktop.c index 4a69a7c3..c9301a31 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -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) { diff --git a/src/osd.c b/src/osd.c index 98bc8881..8f5fa670 100644 --- 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); + &output->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); + /* 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); } } diff --git a/src/output.c b/src/output.c index 51229521..d4863a9f 100644 --- a/src/output.c +++ b/src/output.c @@ -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 diff --git a/src/server.c b/src/server.c index adeb4fb7..b3adad51 100644 --- a/src/server.c +++ b/src/server.c @@ -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);