From 78cc7f78ca70144fa29361f22082e13a1aebc12c Mon Sep 17 00:00:00 2001 From: Rutherther Date: Thu, 9 May 2024 19:12:25 +0200 Subject: [PATCH] feat: apply keyboard shortcuts inhibit patch --- dwl.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/dwl.c b/dwl.c index bf763df..496d51b 100644 --- a/dwl.c +++ b/dwl.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -265,6 +266,7 @@ static void createnotify(struct wl_listener *listener, void *data); static void createpointer(struct wlr_pointer *pointer); static void createpointerconstraint(struct wl_listener *listener, void *data); static void cursorconstrain(struct wlr_pointer_constraint_v1 *constraint); +static void createshortcutsinhibitor(struct wl_listener *listener, void *data); static void cursorframe(struct wl_listener *listener, void *data); static void cursorwarptohint(void); static void destroydecoration(struct wl_listener *listener, void *data); @@ -277,6 +279,7 @@ static void destroynotify(struct wl_listener *listener, void *data); static void destroypointerconstraint(struct wl_listener *listener, void *data); static void destroysessionlock(struct wl_listener *listener, void *data); static void destroysessionmgr(struct wl_listener *listener, void *data); +static void destroyshortcutsinhibitmgr(struct wl_listener *listener, void *data); static Monitor *dirtomon(enum wlr_direction dir); static void focusclient(Client *c, int lift); static void focusmon(const Arg *arg); @@ -372,6 +375,7 @@ static struct wl_list clients; /* tiling order */ static struct wl_list fstack; /* focus order */ static struct wlr_idle_notifier_v1 *idle_notifier; static struct wlr_idle_inhibit_manager_v1 *idle_inhibit_mgr; +static struct wlr_keyboard_shortcuts_inhibit_manager_v1 *shortcuts_inhibit_mgr; static struct wlr_layer_shell_v1 *layer_shell; static struct wlr_output_manager_v1 *output_mgr; static struct wlr_gamma_control_manager_v1 *gamma_control_mgr; @@ -391,6 +395,7 @@ static struct wlr_session_lock_manager_v1 *session_lock_mgr; static struct wlr_scene_rect *locked_bg; static struct wlr_session_lock_v1 *cur_lock; static struct wl_listener lock_listener = {.notify = locksession}; +static struct wl_listener new_shortcuts_inhibitor = {.notify = createshortcutsinhibitor}; static struct wlr_seat *seat; static KeyboardGroup kb_group = {0}; @@ -1032,6 +1037,10 @@ createpointer(struct wlr_pointer *pointer) wlr_cursor_attach_input_device(cursor, &pointer->base); } +void createshortcutsinhibitor(struct wl_listener *listener, void *data) { + wlr_keyboard_shortcuts_inhibitor_v1_activate(data); +} + void createpointerconstraint(struct wl_listener *listener, void *data) { @@ -1217,6 +1226,11 @@ destroysessionmgr(struct wl_listener *listener, void *data) wl_list_remove(&listener->link); } +void destroyshortcutsinhibitmgr(struct wl_listener *listener, void *data) { + wl_list_remove(&new_shortcuts_inhibitor.link); + wl_list_remove(&listener->link); +} + Monitor * dirtomon(enum wlr_direction dir) { @@ -1468,7 +1482,9 @@ keypress(struct wl_listener *listener, void *data) /* On _press_ if there is no active screen locker, * attempt to process a compositor keybinding. */ - if (!locked && event->state == WL_KEYBOARD_KEY_STATE_PRESSED) { + if (!locked + && event->state == WL_KEYBOARD_KEY_STATE_PRESSED + && wl_list_empty(&shortcuts_inhibit_mgr->inhibitors)) { for (i = 0; i < nsyms; i++) handled = keybinding(mods, syms[i]) || handled; } @@ -2389,6 +2405,10 @@ setup(void) (float [4]){0.1f, 0.1f, 0.1f, 1.0f}); wlr_scene_node_set_enabled(&locked_bg->node, 0); + shortcuts_inhibit_mgr = wlr_keyboard_shortcuts_inhibit_v1_create(dpy); + wl_signal_add(&shortcuts_inhibit_mgr->events.new_inhibitor, &new_shortcuts_inhibitor); + LISTEN_STATIC(&shortcuts_inhibit_mgr->events.destroy, destroyshortcutsinhibitmgr); + /* Use decoration protocols to negotiate server-side decorations */ wlr_server_decoration_manager_set_default_mode( wlr_server_decoration_manager_create(dpy), -- 2.48.1