diff options
Diffstat (limited to 'dwl.c')
| -rw-r--r-- | dwl.c | 24 |
1 files changed, 18 insertions, 6 deletions
@@ -160,6 +160,10 @@ typedef struct { xkb_keysym_t keysym; void (*func)(const Arg *); const Arg arg; + + int on_press; + int on_repeat; + int on_release; } Key; typedef struct { @@ -315,7 +319,7 @@ static int hidecursor(void *data); static void handlesig(int signo); static void incnmaster(const Arg *arg); static void inputdevice(struct wl_listener *listener, void *data); -static int keybinding(uint32_t mods, xkb_keysym_t sym); +static int keybinding(uint32_t mods, xkb_keysym_t sym, int on_press, int on_repeat, int on_release); static void keypress(struct wl_listener *listener, void *data); static void keypressmod(struct wl_listener *listener, void *data); static int keyrepeat(void *data); @@ -1710,7 +1714,7 @@ inputdevice(struct wl_listener *listener, void *data) } int -keybinding(uint32_t mods, xkb_keysym_t sym) +keybinding(uint32_t mods, xkb_keysym_t sym, int on_press, int on_repeat, int on_release) { /* * Here we handle compositor keybindings. This is when the compositor is @@ -1724,8 +1728,14 @@ keybinding(uint32_t mods, xkb_keysym_t sym) && chainkey == -1 && k->chain == -1 && k->func) { - k->func(&k->arg); - return 1; + if ((k->on_press == 0 && k->on_repeat == 0 && k->on_release == 0) || + (on_press && k->on_press) || + (on_repeat && k->on_repeat) || + (on_release && k->on_release) + ) { + k->func(&k->arg); + return 1; + } } else if (sym == k->keysym && chainkey != -1 @@ -1771,7 +1781,8 @@ keypress(struct wl_listener *listener, void *data) * attempt to process a compositor keybinding. */ if (!locked && event->state == WL_KEYBOARD_KEY_STATE_PRESSED) { for (i = 0; i < nsyms; i++) - handled = keybinding(mods, syms[i]) || handled; + handled = keybinding(mods, syms[i], event->state == WL_KEYBOARD_KEY_STATE_PRESSED, 0, event->state == WL_KEYBOARD_KEY_STATE_RELEASED) || handled; + } if (handled && group->wlr_group->keyboard.repeat_info.delay > 0) { @@ -1819,7 +1830,8 @@ keyrepeat(void *data) 1000 / group->wlr_group->keyboard.repeat_info.rate); for (i = 0; i < group->nsyms; i++) - keybinding(group->mods, group->keysyms[i]); + keybinding(group->mods, group->keysyms[i], 0, 1, 0); + return 0; } |
