diff --git a/input.c b/input.c index 830a0293..e8cfb32d 100644 --- a/input.c +++ b/input.c @@ -31,9 +31,9 @@ #include "terminal.h" #include "vt.h" -static void -execute_binding(struct terminal *term, enum binding_action action, - uint32_t serial) +void +input_execute_binding(struct terminal *term, enum binding_action action, + uint32_t serial) { switch (action) { case BIND_ACTION_SCROLLBACK_UP: @@ -196,8 +196,13 @@ keyboard_keymap(void *data, struct wl_keyboard *wl_keyboard, close(fd); for (size_t i = 0; i < BIND_ACTION_COUNT; i++) { - const char *combos = wayl->conf->bindings.key[i]; - parse_key_binding_for_action(wayl->kbd.xkb_keymap, i, combos, &wayl->kbd.bindings.key); + parse_key_binding_for_action( + wayl->kbd.xkb_keymap, i, + wayl->conf->bindings.key[i], &wayl->kbd.bindings.key); + + parse_key_binding_for_action( + wayl->kbd.xkb_keymap, i, + wayl->conf->bindings.search[i], &wayl->kbd.bindings.search); } } @@ -476,7 +481,7 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, if (term->is_searching) { if (should_repeat) start_repeater(wayl, key - 8); - search_input(term, key, sym, effective_mods); + search_input(term, key, sym, effective_mods, serial); return; } @@ -497,7 +502,7 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, */ tll_foreach(wayl->kbd.bindings.key, it) { if (it->item.mods == effective_mods && it->item.sym == sym) { - execute_binding(term, it->item.action, serial); + input_execute_binding(term, it->item.action, serial); goto maybe_repeat; } } diff --git a/input.h b/input.h index 2483389a..5507a269 100644 --- a/input.h +++ b/input.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include "wayland.h" @@ -8,3 +9,5 @@ extern const struct wl_keyboard_listener keyboard_listener; extern const struct wl_pointer_listener pointer_listener; void input_repeat(struct wayland *wayl, uint32_t key); +void input_execute_binding( + struct terminal *term, enum binding_action action, uint32_t serial); diff --git a/search.c b/search.c index 2c58f3f2..98ad64eb 100644 --- a/search.c +++ b/search.c @@ -11,6 +11,7 @@ #define LOG_ENABLE_DBG 0 #include "log.h" #include "grid.h" +#include "input.h" #include "misc.h" #include "render.h" #include "selection.h" @@ -412,7 +413,8 @@ distance_prev_word(const struct terminal *term) } void -search_input(struct terminal *term, uint32_t key, xkb_keysym_t sym, xkb_mod_mask_t mods) +search_input(struct terminal *term, uint32_t key, xkb_keysym_t sym, + xkb_mod_mask_t mods, uint32_t serial) { LOG_DBG("search: input: sym=%d/0x%x, mods=0x%08x", sym, sym, mods); @@ -424,6 +426,16 @@ search_input(struct terminal *term, uint32_t key, xkb_keysym_t sym, xkb_mod_mask enum xkb_compose_status compose_status = xkb_compose_state_get_status( term->wl->kbd.xkb_compose_state); + /* + * User configurable bindings + */ + tll_foreach(term->wl->kbd.bindings.search, it) { + if (it->item.mods == mods && it->item.sym == sym) { + input_execute_binding(term, it->item.action, serial); + return; + } + } + /* Cancel search */ if ((mods == 0 && sym == XKB_KEY_Escape) || (mods == ctrl && sym == XKB_KEY_g)) diff --git a/search.h b/search.h index 4ea59c1f..69930c07 100644 --- a/search.h +++ b/search.h @@ -5,4 +5,5 @@ void search_begin(struct terminal *term); void search_cancel(struct terminal *term); -void search_input(struct terminal *term, uint32_t key, xkb_keysym_t sym, xkb_mod_mask_t mods); +void search_input(struct terminal *term, uint32_t key, xkb_keysym_t sym, xkb_mod_mask_t mods, + uint32_t serial); diff --git a/wayland.h b/wayland.h index 219e4b8d..bf765f04 100644 --- a/wayland.h +++ b/wayland.h @@ -90,6 +90,7 @@ struct kbd { struct { key_binding_list_t key; + key_binding_list_t search; } bindings; };