From: tokyo4j Date: Thu, 24 Jul 2025 02:08:03 +0000 (+0900) Subject: cursor: also toggle mousebinds with ToggleKeybinds X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=024ab280a055ffc3666649a7be03fe804155de37;p=proto%2Flabwc.git cursor: also toggle mousebinds with ToggleKeybinds Mousebinds can still be applied when the cursor is over their decoration --- diff --git a/docs/labwc-actions.5.scd b/docs/labwc-actions.5.scd index 52a3d2fb..604a8468 100644 --- a/docs/labwc-actions.5.scd +++ b/docs/labwc-actions.5.scd @@ -227,10 +227,10 @@ Actions are used in menus and keyboard/mouse bindings. window. ** - Stop handling keybinds other than ToggleKeybinds itself. - This can be used to allow A-Tab and similar keybinds to be delivered - to Virtual Machines, VNC clients or nested compositors. - A second call will restore all original keybinds. + Stop handling keybinds/mousebinds other than ToggleKeybinds itself. + This can be used to allow A-Tab and similar keybinds/mousebinds to be + delivered to Virtual Machines, VNC clients or nested compositors. + A second call will restore all original keybinds/mousebinds. This action will only affect the window that had keyboard focus when the binding was executed. Thus when switching to another window, all diff --git a/include/view.h b/include/view.h index 1e54f898..5e1c5baf 100644 --- a/include/view.h +++ b/include/view.h @@ -229,7 +229,7 @@ struct view { bool visible_on_all_workspaces; enum view_edge tiled; uint32_t edges_visible; /* enum wlr_edges bitset */ - bool inhibits_keybinds; + bool inhibits_keybinds; /* also inhibits mousebinds */ xkb_layout_index_t keyboard_layout; /* Pointer to an output owned struct region, may be NULL */ @@ -526,6 +526,7 @@ void mappable_connect(struct mappable *mappable, struct wlr_surface *surface, void mappable_disconnect(struct mappable *mappable); void view_toggle_keybinds(struct view *view); +bool view_inhibits_actions(struct view *view, struct wl_list *actions); void view_set_activated(struct view *view, bool activated); void view_set_output(struct view *view, struct output *output); diff --git a/src/input/cursor.c b/src/input/cursor.c index d55e6bc0..6ce81dab 100644 --- a/src/input/cursor.c +++ b/src/input/cursor.c @@ -610,6 +610,10 @@ cursor_process_motion(struct server *server, uint32_t time, double *sx, double * struct mousebind *mousebind; wl_list_for_each(mousebind, &rc.mousebinds, link) { + if (ctx.type == LAB_SSD_CLIENT + && view_inhibits_actions(ctx.view, &mousebind->actions)) { + continue; + } if (mousebind->mouse_event == MOUSE_ACTION_DRAG && mousebind->pressed_in_context) { /* @@ -949,6 +953,10 @@ process_release_mousebinding(struct server *server, uint32_t modifiers = keyboard_get_all_modifiers(&server->seat); wl_list_for_each(mousebind, &rc.mousebinds, link) { + if (ctx->type == LAB_SSD_CLIENT + && view_inhibits_actions(ctx->view, &mousebind->actions)) { + continue; + } if (ssd_part_contains(mousebind->context, ctx->type) && mousebind->button == button && modifiers == mousebind->modifiers) { @@ -1016,6 +1024,10 @@ process_press_mousebinding(struct server *server, struct cursor_context *ctx, uint32_t modifiers = keyboard_get_all_modifiers(&server->seat); wl_list_for_each(mousebind, &rc.mousebinds, link) { + if (ctx->type == LAB_SSD_CLIENT + && view_inhibits_actions(ctx->view, &mousebind->actions)) { + continue; + } if (ssd_part_contains(mousebind->context, ctx->type) && mousebind->button == button && modifiers == mousebind->modifiers) { diff --git a/src/input/keyboard.c b/src/input/keyboard.c index 676366d9..0739529d 100644 --- a/src/input/keyboard.c +++ b/src/input/keyboard.c @@ -211,9 +211,7 @@ match_keybinding_for_sym(struct server *server, uint32_t modifiers, if (modifiers ^ keybind->modifiers) { continue; } - if (server->active_view - && server->active_view->inhibits_keybinds - && !actions_contain_toggle_keybinds(&keybind->actions)) { + if (view_inhibits_actions(server->active_view, &keybind->actions)) { continue; } if (sym == XKB_KEY_NoSymbol) { diff --git a/src/view.c b/src/view.c index bc3cf35c..3a6fa0bd 100644 --- a/src/view.c +++ b/src/view.c @@ -4,6 +4,7 @@ #include #include #include +#include "action.h" #include "buffer.h" #include "common/box.h" #include "common/list.h" @@ -2444,6 +2445,12 @@ view_toggle_keybinds(struct view *view) } } +bool +view_inhibits_actions(struct view *view, struct wl_list *actions) +{ + return view && view->inhibits_keybinds && !actions_contain_toggle_keybinds(actions); +} + void mappable_connect(struct mappable *mappable, struct wlr_surface *surface, wl_notify_func_t notify_map, wl_notify_func_t notify_unmap) @@ -2614,10 +2621,6 @@ view_destroy(struct view *view) zfree(view->tiled_region_evacuate); } - if (view->inhibits_keybinds) { - view->inhibits_keybinds = false; - } - osd_on_view_destroy(view); undecorate(view);