cursor: also toggle mousebinds with ToggleKeybinds

Mousebinds can still be applied when the cursor is over their decoration
This commit is contained in:
tokyo4j 2025-07-24 11:08:03 +09:00 committed by Hiroaki Yamamoto
parent 73095f75cb
commit 024ab280a0
5 changed files with 26 additions and 12 deletions

View file

@ -227,10 +227,10 @@ Actions are used in menus and keyboard/mouse bindings.
window. window.
*<action name="ToggleKeybinds" />* *<action name="ToggleKeybinds" />*
Stop handling keybinds other than ToggleKeybinds itself. Stop handling keybinds/mousebinds other than ToggleKeybinds itself.
This can be used to allow A-Tab and similar keybinds to be delivered This can be used to allow A-Tab and similar keybinds/mousebinds to be
to Virtual Machines, VNC clients or nested compositors. delivered to Virtual Machines, VNC clients or nested compositors.
A second call will restore all original keybinds. A second call will restore all original keybinds/mousebinds.
This action will only affect the window that had keyboard focus when This action will only affect the window that had keyboard focus when
the binding was executed. Thus when switching to another window, all the binding was executed. Thus when switching to another window, all

View file

@ -229,7 +229,7 @@ struct view {
bool visible_on_all_workspaces; bool visible_on_all_workspaces;
enum view_edge tiled; enum view_edge tiled;
uint32_t edges_visible; /* enum wlr_edges bitset */ uint32_t edges_visible; /* enum wlr_edges bitset */
bool inhibits_keybinds; bool inhibits_keybinds; /* also inhibits mousebinds */
xkb_layout_index_t keyboard_layout; xkb_layout_index_t keyboard_layout;
/* Pointer to an output owned struct region, may be NULL */ /* 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 mappable_disconnect(struct mappable *mappable);
void view_toggle_keybinds(struct view *view); 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_activated(struct view *view, bool activated);
void view_set_output(struct view *view, struct output *output); void view_set_output(struct view *view, struct output *output);

View file

@ -610,6 +610,10 @@ cursor_process_motion(struct server *server, uint32_t time, double *sx, double *
struct mousebind *mousebind; struct mousebind *mousebind;
wl_list_for_each(mousebind, &rc.mousebinds, link) { 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 if (mousebind->mouse_event == MOUSE_ACTION_DRAG
&& mousebind->pressed_in_context) { && mousebind->pressed_in_context) {
/* /*
@ -949,6 +953,10 @@ process_release_mousebinding(struct server *server,
uint32_t modifiers = keyboard_get_all_modifiers(&server->seat); uint32_t modifiers = keyboard_get_all_modifiers(&server->seat);
wl_list_for_each(mousebind, &rc.mousebinds, link) { 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) if (ssd_part_contains(mousebind->context, ctx->type)
&& mousebind->button == button && mousebind->button == button
&& modifiers == mousebind->modifiers) { && 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); uint32_t modifiers = keyboard_get_all_modifiers(&server->seat);
wl_list_for_each(mousebind, &rc.mousebinds, link) { 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) if (ssd_part_contains(mousebind->context, ctx->type)
&& mousebind->button == button && mousebind->button == button
&& modifiers == mousebind->modifiers) { && modifiers == mousebind->modifiers) {

View file

@ -211,9 +211,7 @@ match_keybinding_for_sym(struct server *server, uint32_t modifiers,
if (modifiers ^ keybind->modifiers) { if (modifiers ^ keybind->modifiers) {
continue; continue;
} }
if (server->active_view if (view_inhibits_actions(server->active_view, &keybind->actions)) {
&& server->active_view->inhibits_keybinds
&& !actions_contain_toggle_keybinds(&keybind->actions)) {
continue; continue;
} }
if (sym == XKB_KEY_NoSymbol) { if (sym == XKB_KEY_NoSymbol) {

View file

@ -4,6 +4,7 @@
#include <strings.h> #include <strings.h>
#include <wlr/types/wlr_output_layout.h> #include <wlr/types/wlr_output_layout.h>
#include <wlr/types/wlr_security_context_v1.h> #include <wlr/types/wlr_security_context_v1.h>
#include "action.h"
#include "buffer.h" #include "buffer.h"
#include "common/box.h" #include "common/box.h"
#include "common/list.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 void
mappable_connect(struct mappable *mappable, struct wlr_surface *surface, mappable_connect(struct mappable *mappable, struct wlr_surface *surface,
wl_notify_func_t notify_map, wl_notify_func_t notify_unmap) 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); zfree(view->tiled_region_evacuate);
} }
if (view->inhibits_keybinds) {
view->inhibits_keybinds = false;
}
osd_on_view_destroy(view); osd_on_view_destroy(view);
undecorate(view); undecorate(view);