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 c5f9e4ae..123ea920 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);