X11: Fix IM-duplicated key events leaking through

Fixes #747.
Fixes #964.
This commit is contained in:
Camilla Löwy 2017-03-27 01:19:41 +02:00
parent 72d58d7b93
commit 4ff66a7818
3 changed files with 8 additions and 9 deletions

View File

@ -173,6 +173,7 @@ information on what to include when reporting a bug.
- [X11] Bugfix: Window creation on 64-bit would read past top of stack (#951) - [X11] Bugfix: Window creation on 64-bit would read past top of stack (#951)
- [X11] Bugfix: XDND support had multiple non-conformance issues (#968) - [X11] Bugfix: XDND support had multiple non-conformance issues (#968)
- [X11] Bugfix: The RandR monitor path was disabled despite working RandR (#972) - [X11] Bugfix: The RandR monitor path was disabled despite working RandR (#972)
- [X11] Bugfix: IM-duplicated key events would leak at low polling rates (#747)
- [Linux] Bugfix: Event processing did not detect joystick disconnection (#932) - [Linux] Bugfix: Event processing did not detect joystick disconnection (#932)
- [Cocoa] Added support for Vulkan window surface creation via - [Cocoa] Added support for Vulkan window surface creation via
[MoltenVK](https://moltengl.com/moltenvk/) (#870) [MoltenVK](https://moltengl.com/moltenvk/) (#870)

View File

@ -141,8 +141,7 @@ typedef struct _GLFWwindowX11
// The last position the cursor was warped to by GLFW // The last position the cursor was warped to by GLFW
int warpCursorPosX, warpCursorPosY; int warpCursorPosX, warpCursorPosY;
// The information from the last KeyPress event // The time of the last KeyPress event
unsigned int lastKeyCode;
Time lastKeyTime; Time lastKeyTime;
} _GLFWwindowX11; } _GLFWwindowX11;

View File

@ -992,17 +992,16 @@ static void processEvent(XEvent *event)
if (window->x11.ic) if (window->x11.ic)
{ {
// HACK: Ignore duplicate key press events generated by ibus // HACK: Ignore duplicate key press events generated by ibus
// Corresponding release events are filtered out by the // These have the same timestamp as the original event
// GLFW key repeat logic // Corresponding release events are filtered out
if (window->x11.lastKeyCode != keycode || // implicitly by the GLFW key repeat logic
window->x11.lastKeyTime != event->xkey.time) if (window->x11.lastKeyTime < event->xkey.time)
{ {
if (keycode) if (keycode)
_glfwInputKey(window, key, keycode, GLFW_PRESS, mods); _glfwInputKey(window, key, keycode, GLFW_PRESS, mods);
}
window->x11.lastKeyCode = keycode;
window->x11.lastKeyTime = event->xkey.time; window->x11.lastKeyTime = event->xkey.time;
}
if (!filtered) if (!filtered)
{ {