osd: allow clicking an osd item to focus the window

This commit is contained in:
tokyo4j 2025-10-30 03:22:45 +09:00 committed by Johan Malm
parent 00f0a46ef7
commit 9197eb468a
9 changed files with 55 additions and 1 deletions

View file

@ -161,6 +161,8 @@ osd_classic_create(struct output *output, struct wl_array *views)
wl_list_append(&output->osd_scene.items, &item->base.link);
item->base.view = *view;
item->base.tree = wlr_scene_tree_create(output->osd_scene.tree);
node_descriptor_create(&item->base.tree->node,
LAB_NODE_OSD_ITEM, NULL, item);
/*
* OSD border
* +---------------------------------+
@ -200,6 +202,11 @@ osd_classic_create(struct output *output, struct wl_array *views)
item->active_tree, &highlight_opts);
wlr_scene_node_set_position(&highlight_rect->tree->node, padding, y);
/* hitbox for mouse clicks */
struct wlr_scene_rect *hitbox = wlr_scene_rect_create(item->base.tree,
w - 2 * padding, switcher_theme->item_height, (float[4]) {0});
wlr_scene_node_set_position(&hitbox->node, padding, y);
create_fields_scene(server, *view, item->normal_tree,
text_color, bg_color, field_widths_sum, x, y);
create_fields_scene(server, *view, item->active_tree,

View file

@ -128,6 +128,7 @@ create_item_scene(struct wlr_scene_tree *parent, struct view *view,
struct osd_thumbnail_item *item = znew(*item);
wl_list_append(&output->osd_scene.items, &item->base.link);
struct wlr_scene_tree *tree = wlr_scene_tree_create(parent);
node_descriptor_create(&tree->node, LAB_NODE_OSD_ITEM, NULL, item);
item->base.tree = tree;
item->base.view = view;
@ -142,6 +143,10 @@ create_item_scene(struct wlr_scene_tree *parent, struct view *view,
};
item->active_bg = lab_scene_rect_create(tree, &opts);
/* hitbox for mouse clicks */
wlr_scene_rect_create(tree, switcher_theme->item_width,
switcher_theme->item_height, (float[4]) {0});
/* thumbnail */
struct wlr_buffer *thumb_buffer = render_thumb(output, view);
if (thumb_buffer) {

View file

@ -144,6 +144,16 @@ osd_on_view_destroy(struct view *view)
}
}
void
osd_on_cursor_release(struct server *server, struct wlr_scene_node *node)
{
assert(server->input_mode == LAB_INPUT_STATE_WINDOW_SWITCHER);
struct osd_item *item = node_osd_item_from_node(node);
server->osd_state.cycle_view = item->view;
osd_finish(server, /*switch_focus*/ true);
}
static void
restore_preview_node(struct server *server)
{