search: add support for user configurable key bindings

No default bindings defined yet, though.
This commit is contained in:
Daniel Eklöf 2020-03-08 15:28:47 +01:00
parent fcf4832775
commit 0d188895c3
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
5 changed files with 31 additions and 9 deletions

19
input.c
View file

@ -31,9 +31,9 @@
#include "terminal.h" #include "terminal.h"
#include "vt.h" #include "vt.h"
static void void
execute_binding(struct terminal *term, enum binding_action action, input_execute_binding(struct terminal *term, enum binding_action action,
uint32_t serial) uint32_t serial)
{ {
switch (action) { switch (action) {
case BIND_ACTION_SCROLLBACK_UP: case BIND_ACTION_SCROLLBACK_UP:
@ -196,8 +196,13 @@ keyboard_keymap(void *data, struct wl_keyboard *wl_keyboard,
close(fd); close(fd);
for (size_t i = 0; i < BIND_ACTION_COUNT; i++) { for (size_t i = 0; i < BIND_ACTION_COUNT; i++) {
const char *combos = wayl->conf->bindings.key[i]; parse_key_binding_for_action(
parse_key_binding_for_action(wayl->kbd.xkb_keymap, i, combos, &wayl->kbd.bindings.key); 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 (term->is_searching) {
if (should_repeat) if (should_repeat)
start_repeater(wayl, key - 8); start_repeater(wayl, key - 8);
search_input(term, key, sym, effective_mods); search_input(term, key, sym, effective_mods, serial);
return; return;
} }
@ -497,7 +502,7 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial,
*/ */
tll_foreach(wayl->kbd.bindings.key, it) { tll_foreach(wayl->kbd.bindings.key, it) {
if (it->item.mods == effective_mods && it->item.sym == sym) { 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; goto maybe_repeat;
} }
} }

View file

@ -1,5 +1,6 @@
#pragma once #pragma once
#include <stdint.h>
#include <wayland-client.h> #include <wayland-client.h>
#include "wayland.h" #include "wayland.h"
@ -8,3 +9,5 @@ extern const struct wl_keyboard_listener keyboard_listener;
extern const struct wl_pointer_listener pointer_listener; extern const struct wl_pointer_listener pointer_listener;
void input_repeat(struct wayland *wayl, uint32_t key); void input_repeat(struct wayland *wayl, uint32_t key);
void input_execute_binding(
struct terminal *term, enum binding_action action, uint32_t serial);

View file

@ -11,6 +11,7 @@
#define LOG_ENABLE_DBG 0 #define LOG_ENABLE_DBG 0
#include "log.h" #include "log.h"
#include "grid.h" #include "grid.h"
#include "input.h"
#include "misc.h" #include "misc.h"
#include "render.h" #include "render.h"
#include "selection.h" #include "selection.h"
@ -412,7 +413,8 @@ distance_prev_word(const struct terminal *term)
} }
void 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); 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( enum xkb_compose_status compose_status = xkb_compose_state_get_status(
term->wl->kbd.xkb_compose_state); 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 */ /* Cancel search */
if ((mods == 0 && sym == XKB_KEY_Escape) || if ((mods == 0 && sym == XKB_KEY_Escape) ||
(mods == ctrl && sym == XKB_KEY_g)) (mods == ctrl && sym == XKB_KEY_g))

View file

@ -5,4 +5,5 @@
void search_begin(struct terminal *term); void search_begin(struct terminal *term);
void search_cancel(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);

View file

@ -90,6 +90,7 @@ struct kbd {
struct { struct {
key_binding_list_t key; key_binding_list_t key;
key_binding_list_t search;
} bindings; } bindings;
}; };