diff --git a/README.md b/README.md index 43ad0575..41f776c8 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,7 @@ GLFW bundles a number of dependencies in the `deps/` directory. - [X11] Bugfix: The response to `_NET_WM_PING` was sent to the wrong window - [X11] Bugfix: Character input via XIM did not work in many cases - [X11] Bugfix: No fallback existed for missing `_NET_ACTIVE_WINDOW` support + - [X11] Bugfix: Some significant window focus events were ignored - [WGL] Removed `GLFW_USE_DWM_SWAP_INTERVAL` compile-time option - [WGL] Bugfix: Swap interval was ignored when DWM was enabled - [GLX] Added dependency on `libdl` on systems where it provides `dlopen` diff --git a/src/x11_window.c b/src/x11_window.c index 48f25011..def84616 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -1220,33 +1220,43 @@ static void processEvent(XEvent *event) case FocusIn: { - if (event->xfocus.mode == NotifyNormal) + if (event->xfocus.mode == NotifyGrab || + event->xfocus.mode == NotifyUngrab) { - if (window->x11.ic) - XSetICFocus(window->x11.ic); - - _glfwInputWindowFocus(window, GL_TRUE); - - if (window->cursorMode == GLFW_CURSOR_DISABLED) - disableCursor(window); + // Ignore focus events from popup indicator windows, window menu + // key chords and window dragging + return; } + if (window->x11.ic) + XSetICFocus(window->x11.ic); + + _glfwInputWindowFocus(window, GL_TRUE); + + if (window->cursorMode == GLFW_CURSOR_DISABLED) + disableCursor(window); + return; } case FocusOut: { - if (event->xfocus.mode == NotifyNormal) + if (event->xfocus.mode == NotifyGrab || + event->xfocus.mode == NotifyUngrab) { - if (window->x11.ic) - XUnsetICFocus(window->x11.ic); - - _glfwInputWindowFocus(window, GL_FALSE); - - if (window->cursorMode == GLFW_CURSOR_DISABLED) - restoreCursor(window); + // Ignore focus events from popup indicator windows, window menu + // key chords and window dragging + return; } + if (window->x11.ic) + XUnsetICFocus(window->x11.ic); + + _glfwInputWindowFocus(window, GL_FALSE); + + if (window->cursorMode == GLFW_CURSOR_DISABLED) + restoreCursor(window); + return; }