Wayland: Fix reappearing key repeat

If the key or character callback performs actions that indirectly
updates the key repeat timer, those changes would be undone once the key
callback returned.

This fixes the order of operations so that key repeat is fully set up
before the key related events are emitted.
This commit is contained in:
Camilla Löwy 2022-07-13 12:54:24 +02:00
parent 9180923ea0
commit 40b5a8a37c

View File

@ -1466,14 +1466,11 @@ static void keyboardHandleKey(void* userData,
state == WL_KEYBOARD_KEY_STATE_PRESSED ? GLFW_PRESS : GLFW_RELEASE; state == WL_KEYBOARD_KEY_STATE_PRESSED ? GLFW_PRESS : GLFW_RELEASE;
_glfw.wl.serial = serial; _glfw.wl.serial = serial;
_glfwInputKey(window, key, scancode, action, _glfw.wl.xkb.modifiers);
struct itimerspec timer = {0}; struct itimerspec timer = {0};
if (action == GLFW_PRESS) if (action == GLFW_PRESS)
{ {
inputText(window, scancode);
const xkb_keycode_t keycode = scancode + 8; const xkb_keycode_t keycode = scancode + 8;
if (xkb_keymap_key_repeats(_glfw.wl.xkb.keymap, keycode) && if (xkb_keymap_key_repeats(_glfw.wl.xkb.keymap, keycode) &&
@ -1491,6 +1488,11 @@ static void keyboardHandleKey(void* userData,
} }
timerfd_settime(_glfw.wl.keyRepeatTimerfd, 0, &timer, NULL); timerfd_settime(_glfw.wl.keyRepeatTimerfd, 0, &timer, NULL);
_glfwInputKey(window, key, scancode, action, _glfw.wl.xkb.modifiers);
if (action == GLFW_PRESS)
inputText(window, scancode);
} }
static void keyboardHandleModifiers(void* userData, static void keyboardHandleModifiers(void* userData,