mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-04 04:06:06 -05:00
input: keyboard_key: don't start repeater unless we generated output
I.e. what we're effectively doing is *not* repeating modifier keys. Besides being the "right" thing to do, this also works around another Sway 1.2 bug, where being in a focused foot window and then switching to a vt and back would cause us to be stuck in an endless key repeat loop that would only stop when unfocusing, focusing back and then unfocusing once again.
This commit is contained in:
parent
9d24e68e62
commit
fd82ffdf52
1 changed files with 59 additions and 56 deletions
115
input.c
115
input.c
|
|
@ -256,7 +256,12 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial,
|
|||
}
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < sizeof(key_map) / sizeof(key_map[0]) && !found_map; i++) {
|
||||
if (found_map) {
|
||||
start_repeater(wayl, key - 8);
|
||||
return;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < sizeof(key_map) / sizeof(key_map[0]); i++) {
|
||||
const struct key_map *k = &key_map[i];
|
||||
if (k->sym != sym)
|
||||
continue;
|
||||
|
|
@ -275,77 +280,75 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial,
|
|||
continue;
|
||||
|
||||
term_to_slave(term, info->seq, strlen(info->seq));
|
||||
found_map = true;
|
||||
|
||||
term_reset_view(term);
|
||||
selection_cancel(term);
|
||||
break;
|
||||
start_repeater(wayl, key - 8);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found_map) {
|
||||
uint8_t buf[64] = {0};
|
||||
int count = 0;
|
||||
uint8_t buf[64] = {0};
|
||||
int count = 0;
|
||||
|
||||
if (compose_status == XKB_COMPOSE_COMPOSED) {
|
||||
count = xkb_compose_state_get_utf8(
|
||||
wayl->kbd.xkb_compose_state, (char *)buf, sizeof(buf));
|
||||
xkb_compose_state_reset(wayl->kbd.xkb_compose_state);
|
||||
} else {
|
||||
count = xkb_state_key_get_utf8(
|
||||
wayl->kbd.xkb_state, key, (char *)buf, sizeof(buf));
|
||||
}
|
||||
if (compose_status == XKB_COMPOSE_COMPOSED) {
|
||||
count = xkb_compose_state_get_utf8(
|
||||
wayl->kbd.xkb_compose_state, (char *)buf, sizeof(buf));
|
||||
xkb_compose_state_reset(wayl->kbd.xkb_compose_state);
|
||||
} else {
|
||||
count = xkb_state_key_get_utf8(
|
||||
wayl->kbd.xkb_state, key, (char *)buf, sizeof(buf));
|
||||
}
|
||||
|
||||
if (count > 0) {
|
||||
if (count > 0) {
|
||||
|
||||
#define is_control_key(x) ((x) >= 0x40 && (x) <= 0x7f)
|
||||
#define IS_CTRL(x) ((x) < 0x20 || ((x) >= 0x7f && (x) <= 0x9f))
|
||||
|
||||
if ((keymap_mods & MOD_CTRL) &&
|
||||
!is_control_key(sym) &&
|
||||
(count == 1 && !IS_CTRL(buf[0])) &&
|
||||
sym < 256)
|
||||
{
|
||||
static const int mod_param_map[32] = {
|
||||
[MOD_SHIFT] = 2,
|
||||
[MOD_ALT] = 3,
|
||||
[MOD_SHIFT | MOD_ALT] = 4,
|
||||
[MOD_CTRL] = 5,
|
||||
[MOD_SHIFT | MOD_CTRL] = 6,
|
||||
[MOD_ALT | MOD_CTRL] = 7,
|
||||
[MOD_SHIFT | MOD_ALT | MOD_CTRL] = 8,
|
||||
[MOD_META] = 9,
|
||||
[MOD_META | MOD_SHIFT] = 10,
|
||||
[MOD_META | MOD_ALT] = 11,
|
||||
[MOD_META | MOD_SHIFT | MOD_ALT] = 12,
|
||||
[MOD_META | MOD_CTRL] = 13,
|
||||
[MOD_META | MOD_SHIFT | MOD_CTRL] = 14,
|
||||
[MOD_META | MOD_ALT | MOD_CTRL] = 15,
|
||||
[MOD_META | MOD_SHIFT | MOD_ALT | MOD_CTRL] = 16,
|
||||
};
|
||||
if ((keymap_mods & MOD_CTRL) &&
|
||||
!is_control_key(sym) &&
|
||||
(count == 1 && !IS_CTRL(buf[0])) &&
|
||||
sym < 256)
|
||||
{
|
||||
static const int mod_param_map[32] = {
|
||||
[MOD_SHIFT] = 2,
|
||||
[MOD_ALT] = 3,
|
||||
[MOD_SHIFT | MOD_ALT] = 4,
|
||||
[MOD_CTRL] = 5,
|
||||
[MOD_SHIFT | MOD_CTRL] = 6,
|
||||
[MOD_ALT | MOD_CTRL] = 7,
|
||||
[MOD_SHIFT | MOD_ALT | MOD_CTRL] = 8,
|
||||
[MOD_META] = 9,
|
||||
[MOD_META | MOD_SHIFT] = 10,
|
||||
[MOD_META | MOD_ALT] = 11,
|
||||
[MOD_META | MOD_SHIFT | MOD_ALT] = 12,
|
||||
[MOD_META | MOD_CTRL] = 13,
|
||||
[MOD_META | MOD_SHIFT | MOD_CTRL] = 14,
|
||||
[MOD_META | MOD_ALT | MOD_CTRL] = 15,
|
||||
[MOD_META | MOD_SHIFT | MOD_ALT | MOD_CTRL] = 16,
|
||||
};
|
||||
|
||||
assert(keymap_mods < sizeof(mod_param_map) / sizeof(mod_param_map[0]));
|
||||
int modify_param = mod_param_map[keymap_mods];
|
||||
assert(modify_param != 0);
|
||||
assert(keymap_mods < sizeof(mod_param_map) / sizeof(mod_param_map[0]));
|
||||
int modify_param = mod_param_map[keymap_mods];
|
||||
assert(modify_param != 0);
|
||||
|
||||
char reply[1024];
|
||||
snprintf(reply, sizeof(reply), "\x1b[27;%d;%d~", modify_param, sym);
|
||||
term_to_slave(term, reply, strlen(reply));
|
||||
}
|
||||
|
||||
else {
|
||||
if (effective_mods & alt)
|
||||
term_to_slave(term, "\x1b", 1);
|
||||
|
||||
term_to_slave(term, buf, count);
|
||||
}
|
||||
|
||||
term_reset_view(term);
|
||||
selection_cancel(term);
|
||||
char reply[1024];
|
||||
snprintf(reply, sizeof(reply), "\x1b[27;%d;%d~", modify_param, sym);
|
||||
term_to_slave(term, reply, strlen(reply));
|
||||
}
|
||||
}
|
||||
|
||||
start_repeater(wayl, key - 8);
|
||||
else {
|
||||
if (effective_mods & alt)
|
||||
term_to_slave(term, "\x1b", 1);
|
||||
|
||||
term_to_slave(term, buf, count);
|
||||
}
|
||||
|
||||
term_reset_view(term);
|
||||
selection_cancel(term);
|
||||
start_repeater(wayl, key - 8);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue