mirror of
https://github.com/glfw/glfw.git
synced 2024-11-29 23:54:37 +00:00
Replaced repeat kluge with detectable auto repeat.
This commit is contained in:
parent
6a4c175816
commit
fcb96967ba
@ -139,7 +139,9 @@ void _glfwInputKey(_GLFWwindow* window, int key, int action)
|
|||||||
window->key[key] = GLFW_STICK;
|
window->key[key] = GLFW_STICK;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
repeated = (window->key[key] == GLFW_PRESS) && (action == GLFW_PRESS);
|
if (action == GLFW_PRESS && window->key[key] == GLFW_PRESS)
|
||||||
|
repeated = GL_TRUE;
|
||||||
|
|
||||||
window->key[key] = (char) action;
|
window->key[key] = (char) action;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -470,6 +470,8 @@ static void detectEWMH(void)
|
|||||||
|
|
||||||
static GLboolean initDisplay(void)
|
static GLboolean initDisplay(void)
|
||||||
{
|
{
|
||||||
|
Bool supported;
|
||||||
|
|
||||||
_glfw.x11.display = XOpenDisplay(NULL);
|
_glfw.x11.display = XOpenDisplay(NULL);
|
||||||
if (!_glfw.x11.display)
|
if (!_glfw.x11.display)
|
||||||
{
|
{
|
||||||
@ -528,6 +530,14 @@ static GLboolean initDisplay(void)
|
|||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
XkbSetDetectableAutoRepeat(_glfw.x11.display, True, &supported);
|
||||||
|
if (!supported)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
|
"X11: Detectable key repeat is not available");
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
// Update the key code LUT
|
// Update the key code LUT
|
||||||
// FIXME: We should listen to XkbMapNotify events to track changes to
|
// FIXME: We should listen to XkbMapNotify events to track changes to
|
||||||
// the keyboard mapping.
|
// the keyboard mapping.
|
||||||
|
@ -498,32 +498,6 @@ static void processEvent(XEvent *event)
|
|||||||
if (window == NULL)
|
if (window == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Do not report key releases for key repeats. For key repeats we
|
|
||||||
// will get KeyRelease/KeyPress pairs with similar or identical
|
|
||||||
// time stamps. User selected key repeat filtering is handled in
|
|
||||||
// _glfwInputKey/_glfwInputChar.
|
|
||||||
if (XEventsQueued(_glfw.x11.display, QueuedAfterReading))
|
|
||||||
{
|
|
||||||
XEvent nextEvent;
|
|
||||||
XPeekEvent(_glfw.x11.display, &nextEvent);
|
|
||||||
|
|
||||||
if (nextEvent.type == KeyPress &&
|
|
||||||
nextEvent.xkey.window == event->xkey.window &&
|
|
||||||
nextEvent.xkey.keycode == event->xkey.keycode)
|
|
||||||
{
|
|
||||||
// This last check is a hack to work around key repeats
|
|
||||||
// leaking through due to some sort of time drift
|
|
||||||
// Toshiyuki Takahashi can press a button 16 times per
|
|
||||||
// second so it's fairly safe to assume that no human is
|
|
||||||
// pressing the key 50 times per second (value is ms)
|
|
||||||
if ((nextEvent.xkey.time - event->xkey.time) < 20)
|
|
||||||
{
|
|
||||||
// Do not report anything for this event
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_glfwInputKey(window, translateKey(event->xkey.keycode), GLFW_RELEASE);
|
_glfwInputKey(window, translateKey(event->xkey.keycode), GLFW_RELEASE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user