diff --git a/src/x11_clipboard.c b/src/x11_clipboard.c index 37d002b5..cd0b5976 100644 --- a/src/x11_clipboard.c +++ b/src/x11_clipboard.c @@ -135,11 +135,10 @@ size_t _glfwPlatformGetClipboardString(_GLFWwindow* window, char* data, size_t s _glfwLibrary.X11.selection.atom, _glfwLibrary.X11.selection.request, None, window->X11.handle, CurrentTime); - XFlush(_glfwLibrary.X11.display); - // Process pending events until we get a SelectionNotify. - while (!_glfwLibrary.X11.selection.converted) - _glfwPlatformWaitEvents(); + // Process the resulting SelectionNotify event + XSync(_glfwLibrary.X11.display, False); + _glfwProcessPendingEvents(); // Successful? if (_glfwLibrary.X11.selection.converted == 1) diff --git a/src/x11_platform.h b/src/x11_platform.h index f3c4dd35..8de54ead 100644 --- a/src/x11_platform.h +++ b/src/x11_platform.h @@ -283,4 +283,7 @@ long _glfwKeySym2Unicode(KeySym keysym); // Clipboard handling Atom _glfwSelectionRequest(XSelectionRequestEvent *request); +// Event processing +void _glfwProcessPendingEvents(void); + #endif // _platform_h_ diff --git a/src/x11_window.c b/src/x11_window.c index 57871d65..854480c5 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -1299,6 +1299,23 @@ static void processSingleEvent(void) } +////////////////////////////////////////////////////////////////////////// +////// GLFW internal API ////// +////////////////////////////////////////////////////////////////////////// + +//======================================================================== +// Processes all pending events +//======================================================================== + +void _glfwProcessPendingEvents(void) +{ + int i, count = XPending(_glfwLibrary.X11.display); + + for (i = 0; i < count; i++) + processSingleEvent(); +} + + ////////////////////////////////////////////////////////////////////////// ////// GLFW platform API ////// ////////////////////////////////////////////////////////////////////////// @@ -1369,7 +1386,7 @@ int _glfwPlatformOpenWindow(_GLFWwindow* window, } // Process the window map event and any other that may have arrived - _glfwPlatformPollEvents(); + _glfwProcessPendingEvents(); // Retrieve and set initial cursor position {