mirror of
https://github.com/labwc/labwc.git
synced 2025-11-04 13:30:07 -05:00
osd: show alt-tab switcher center-aligned on all outputs
Fixes issue #283
This commit is contained in:
parent
a234e71b29
commit
48c9e6fda0
6 changed files with 30 additions and 20 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
32
src/osd.c
32
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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue