#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;
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;
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);
}
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);
}
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;
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);
}
}
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