input: comments

This commit is contained in:
Daniel Eklöf 2020-01-11 18:59:46 +01:00
parent fed0e5c853
commit 53a437007e
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F

102
input.c
View file

@ -363,11 +363,9 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial,
"effective=0x%08x, repeats=%d", "effective=0x%08x, repeats=%d",
sym, mods, consumed, significant, effective_mods, should_repeat); sym, mods, consumed, significant, effective_mods, should_repeat);
enum modifier keymap_mods = MOD_NONE; /*
keymap_mods |= wayl->kbd.shift ? MOD_SHIFT : MOD_NONE; * Builtin shortcuts
keymap_mods |= wayl->kbd.alt ? MOD_ALT : MOD_NONE; */
keymap_mods |= wayl->kbd.ctrl ? MOD_CTRL : MOD_NONE;
keymap_mods |= wayl->kbd.meta ? MOD_META : MOD_NONE;
if (effective_mods == shift) { if (effective_mods == shift) {
if (sym == XKB_KEY_Page_Up) { if (sym == XKB_KEY_Page_Up) {
@ -404,6 +402,16 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial,
} }
} }
/*
* Keys generating escape sequences
*/
enum modifier keymap_mods = MOD_NONE;
keymap_mods |= wayl->kbd.shift ? MOD_SHIFT : MOD_NONE;
keymap_mods |= wayl->kbd.alt ? MOD_ALT : MOD_NONE;
keymap_mods |= wayl->kbd.ctrl ? MOD_CTRL : MOD_NONE;
keymap_mods |= wayl->kbd.meta ? MOD_META : MOD_NONE;
const struct key_data *keymap = keymap_lookup(term, sym, keymap_mods); const struct key_data *keymap = keymap_lookup(term, sym, keymap_mods);
if (keymap != NULL) { if (keymap != NULL) {
term_to_slave(term, keymap->seq, strlen(keymap->seq)); term_to_slave(term, keymap->seq, strlen(keymap->seq));
@ -413,6 +421,10 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial,
goto maybe_repeat; goto maybe_repeat;
} }
/*
* Compose, and maybe emit "normal" character
*/
uint8_t buf[64] = {0}; uint8_t buf[64] = {0};
int count = 0; int count = 0;
@ -427,55 +439,55 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial,
wayl->kbd.xkb_state, key, (char *)buf, sizeof(buf)); wayl->kbd.xkb_state, key, (char *)buf, sizeof(buf));
} }
if (count > 0) { if (count == 0)
goto maybe_repeat;
#define is_control_key(x) ((x) >= 0x40 && (x) <= 0x7f) #define is_control_key(x) ((x) >= 0x40 && (x) <= 0x7f)
#define IS_CTRL(x) ((x) < 0x20 || ((x) >= 0x7f && (x) <= 0x9f)) #define IS_CTRL(x) ((x) < 0x20 || ((x) >= 0x7f && (x) <= 0x9f))
if ((keymap_mods & MOD_CTRL) && if ((keymap_mods & MOD_CTRL) &&
!is_control_key(sym) && !is_control_key(sym) &&
(count == 1 && !IS_CTRL(buf[0])) && (count == 1 && !IS_CTRL(buf[0])) &&
sym < 256) sym < 256)
{ {
static const int mod_param_map[32] = { static const int mod_param_map[32] = {
[MOD_SHIFT] = 2, [MOD_SHIFT] = 2,
[MOD_ALT] = 3, [MOD_ALT] = 3,
[MOD_SHIFT | MOD_ALT] = 4, [MOD_SHIFT | MOD_ALT] = 4,
[MOD_CTRL] = 5, [MOD_CTRL] = 5,
[MOD_SHIFT | MOD_CTRL] = 6, [MOD_SHIFT | MOD_CTRL] = 6,
[MOD_ALT | MOD_CTRL] = 7, [MOD_ALT | MOD_CTRL] = 7,
[MOD_SHIFT | MOD_ALT | MOD_CTRL] = 8, [MOD_SHIFT | MOD_ALT | MOD_CTRL] = 8,
[MOD_META] = 9, [MOD_META] = 9,
[MOD_META | MOD_SHIFT] = 10, [MOD_META | MOD_SHIFT] = 10,
[MOD_META | MOD_ALT] = 11, [MOD_META | MOD_ALT] = 11,
[MOD_META | MOD_SHIFT | MOD_ALT] = 12, [MOD_META | MOD_SHIFT | MOD_ALT] = 12,
[MOD_META | MOD_CTRL] = 13, [MOD_META | MOD_CTRL] = 13,
[MOD_META | MOD_SHIFT | MOD_CTRL] = 14, [MOD_META | MOD_SHIFT | MOD_CTRL] = 14,
[MOD_META | MOD_ALT | MOD_CTRL] = 15, [MOD_META | MOD_ALT | MOD_CTRL] = 15,
[MOD_META | MOD_SHIFT | MOD_ALT | MOD_CTRL] = 16, [MOD_META | MOD_SHIFT | MOD_ALT | MOD_CTRL] = 16,
}; };
assert(keymap_mods < sizeof(mod_param_map) / sizeof(mod_param_map[0])); assert(keymap_mods < sizeof(mod_param_map) / sizeof(mod_param_map[0]));
int modify_param = mod_param_map[keymap_mods]; int modify_param = mod_param_map[keymap_mods];
assert(modify_param != 0); assert(modify_param != 0);
char reply[1024]; char reply[1024];
snprintf(reply, sizeof(reply), "\x1b[27;%d;%d~", modify_param, sym); snprintf(reply, sizeof(reply), "\x1b[27;%d;%d~", modify_param, sym);
term_to_slave(term, reply, strlen(reply)); term_to_slave(term, reply, strlen(reply));
} }
else { else {
if (effective_mods & alt) if (effective_mods & alt)
term_to_slave(term, "\x1b", 1); term_to_slave(term, "\x1b", 1);
term_to_slave(term, buf, count); term_to_slave(term, buf, count);
} }
clock_gettime( clock_gettime(
term->wl->presentation_clock_id, &term->render.input_time); term->wl->presentation_clock_id, &term->render.input_time);
term_reset_view(term); term_reset_view(term);
selection_cancel(term); selection_cancel(term);
}
maybe_repeat: maybe_repeat:
if (should_repeat) if (should_repeat)