mirror of
https://github.com/labwc/labwc.git
synced 2025-11-30 06:59:52 -05:00
osd: allow clicking an osd item to focus the window
This commit is contained in:
parent
00f0a46ef7
commit
9197eb468a
9 changed files with 55 additions and 1 deletions
|
|
@ -340,6 +340,11 @@ get_cursor_context(struct server *server)
|
|||
ret.node = node;
|
||||
ret.type = LAB_NODE_MENUITEM;
|
||||
return ret;
|
||||
case LAB_NODE_OSD_ITEM:
|
||||
/* Always return the top scene node for osd items */
|
||||
ret.node = node;
|
||||
ret.type = LAB_NODE_OSD_ITEM;
|
||||
return ret;
|
||||
case LAB_NODE_BUTTON_FIRST...LAB_NODE_BUTTON_LAST:
|
||||
case LAB_NODE_SSD_ROOT:
|
||||
case LAB_NODE_TITLE:
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
#include "labwc.h"
|
||||
#include "layers.h"
|
||||
#include "menu/menu.h"
|
||||
#include "osd.h"
|
||||
#include "output.h"
|
||||
#include "resistance.h"
|
||||
#include "resize-outlines.h"
|
||||
|
|
@ -1190,6 +1191,12 @@ cursor_process_button_release(struct seat *seat, uint32_t button,
|
|||
}
|
||||
return notify;
|
||||
}
|
||||
if (server->input_mode == LAB_INPUT_STATE_WINDOW_SWITCHER) {
|
||||
if (ctx.type == LAB_NODE_OSD_ITEM) {
|
||||
osd_on_cursor_release(server, ctx.node);
|
||||
}
|
||||
return notify;
|
||||
}
|
||||
|
||||
if (server->input_mode != LAB_INPUT_STATE_PASSTHROUGH) {
|
||||
return notify;
|
||||
|
|
|
|||
|
|
@ -59,6 +59,15 @@ node_menuitem_from_node(struct wlr_scene_node *wlr_scene_node)
|
|||
return (struct menuitem *)node_descriptor->data;
|
||||
}
|
||||
|
||||
struct osd_item *
|
||||
node_osd_item_from_node(struct wlr_scene_node *wlr_scene_node)
|
||||
{
|
||||
assert(wlr_scene_node->data);
|
||||
struct node_descriptor *node_descriptor = wlr_scene_node->data;
|
||||
assert(node_descriptor->type == LAB_NODE_OSD_ITEM);
|
||||
return (struct osd_item *)node_descriptor->data;
|
||||
}
|
||||
|
||||
struct ssd_button *
|
||||
node_try_ssd_button_from_node(struct wlr_scene_node *wlr_scene_node)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue