osd: show alt-tab switcher center-aligned on all outputs

Fixes issue #283
This commit is contained in:
Johan Malm 2022-04-20 17:45:10 +01:00
parent a234e71b29
commit 48c9e6fda0
6 changed files with 30 additions and 20 deletions

View 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;

View 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);

View 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) {

View file

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

View 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

View 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);