diff --git a/README.md b/README.md index c453739d..456c7533 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,7 @@ information on what to include when reporting a bug. - [Wayland] Bugfix: Ignore key repeat events when no window has keyboard focus (#2727) - [Wayland] Bugfix: Reset key repeat timer when window destroyed (#2741,#2727) - [Wayland] Bugfix: Memory would leak if reading a data offer failed midway + - [Wayland] Bugfix: Keyboard leave event handler now processes key repeats (#2736) - [X11] Bugfix: Running without a WM could trigger an assert (#2593,#2601,#2631) - [Null] Added Vulkan 'window' surface creation via `VK_EXT_headless_surface` - [Null] Added EGL context creation on Mesa via `EGL_MESA_platform_surfaceless` diff --git a/src/wl_window.c b/src/wl_window.c index def3b870..7e15a3d0 100644 --- a/src/wl_window.c +++ b/src/wl_window.c @@ -1760,6 +1760,24 @@ static void keyboardHandleLeave(void* userData, if (!window) return; + // Handle any key repeats up to this point. We don't poll as this should be infrequent. + uint64_t repeats; + if (read(_glfw.wl.keyRepeatTimerfd, &repeats, sizeof(repeats)) == 8) + { + if(_glfw.wl.keyboardFocus) + { + for (uint64_t i = 0; i < repeats; i++) + { + _glfwInputKey(_glfw.wl.keyboardFocus, + translateKey(_glfw.wl.keyRepeatScancode), + _glfw.wl.keyRepeatScancode, + GLFW_PRESS, + _glfw.wl.xkb.modifiers); + inputText(_glfw.wl.keyboardFocus, _glfw.wl.keyRepeatScancode); + } + } + } + struct itimerspec timer = {0}; timerfd_settime(_glfw.wl.keyRepeatTimerfd, 0, &timer, NULL);