Replaced repeat kluge with detectable auto repeat.

This commit is contained in:
Camilla Berglund 2013-01-12 21:01:44 +01:00
parent 6a4c175816
commit fcb96967ba
3 changed files with 13 additions and 27 deletions

View File

@ -139,7 +139,9 @@ void _glfwInputKey(_GLFWwindow* window, int key, int action)
window->key[key] = GLFW_STICK;
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;
}

View File

@ -470,6 +470,8 @@ static void detectEWMH(void)
static GLboolean initDisplay(void)
{
Bool supported;
_glfw.x11.display = XOpenDisplay(NULL);
if (!_glfw.x11.display)
{
@ -528,6 +530,14 @@ static GLboolean initDisplay(void)
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
// FIXME: We should listen to XkbMapNotify events to track changes to
// the keyboard mapping.

View File

@ -498,32 +498,6 @@ static void processEvent(XEvent *event)
if (window == NULL)
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);
break;
}