Wayland: Use a timerfd for key repeat

This commit is contained in:
Emmanuel Gil Peyrot
2018-01-30 16:22:25 +01:00
committed by linkmauve
parent c14a35e21e
commit 90f5edc0b8
3 changed files with 45 additions and 3 deletions
+19
View File
@@ -32,6 +32,7 @@
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/timerfd.h>
#include <unistd.h>
#include <wayland-client.h>
@@ -365,6 +366,7 @@ static void keyboardHandleKey(void* data,
int keyCode;
int action;
_GLFWwindow* window = _glfw.wl.keyboardFocus;
struct itimerspec timer = {};
if (!window)
return;
@@ -377,7 +379,20 @@ static void keyboardHandleKey(void* data,
_glfw.wl.xkb.modifiers);
if (action == GLFW_PRESS)
{
inputChar(window, key);
if (_glfw.wl.keyboardRepeatRate > 0)
{
_glfw.wl.keyboardLastKey = keyCode;
_glfw.wl.keyboardLastScancode = key;
timer.it_interval.tv_sec = _glfw.wl.keyboardRepeatRate / 1000;
timer.it_interval.tv_nsec = (_glfw.wl.keyboardRepeatRate % 1000) * 1000000;
timer.it_value.tv_sec = _glfw.wl.keyboardRepeatDelay / 1000;
timer.it_value.tv_nsec = (_glfw.wl.keyboardRepeatDelay % 1000) * 1000000;
}
}
timerfd_settime(_glfw.wl.timerfd, 0, &timer, NULL);
}
static void keyboardHandleModifiers(void* data,
@@ -822,6 +837,10 @@ int _glfwPlatformInit(void)
_glfwInitTimerPOSIX();
_glfw.wl.timerfd = -1;
if (_glfw.wl.seatVersion >= 4)
_glfw.wl.timerfd = timerfd_create(CLOCK_MONOTONIC, 0);
if (_glfw.wl.pointer && _glfw.wl.shm)
{
_glfw.wl.cursorTheme = wl_cursor_theme_load(NULL, 32, _glfw.wl.shm);