diff --git a/README.md b/README.md index 80bc5c8d4..8daaf1e34 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,8 @@ The following dependencies are needed by the examples and test programs: - Added native monitor handle access to native API - Added `glfwSetDropCallback` and `GLFWdropfun` for receiving dropped files + - Added `glfwPostEmptyEvent` for allowing secondary threads to cause + `glfwWaitEvents` to return - [Cocoa] Added `_GLFW_USE_RETINA` to control whether windows will use the full resolution on Retina displays - [Cocoa] Bugfix: Using a 1x1 cursor for hidden mode caused some screen diff --git a/docs/news.dox b/docs/news.dox index b02861ec6..0be9cd065 100644 --- a/docs/news.dox +++ b/docs/news.dox @@ -13,6 +13,13 @@ GLFW now provides a callback for receiving the paths of files dropped onto GLFW windows. The callback is set with the @ref glfwSetDropCallback function. +@subsection news_31_emptyevent Empty event support + +GLFW now provides the @ref glfwPostEmptyEvent function for posting an empty +event from a secondary thread to the main thread event queue, causing @ref +glfwWaitEvents to return. + + @section news_30 New features in version 3.0 @subsection news_30_cmake CMake build system diff --git a/include/GLFW/glfw3.h b/include/GLFW/glfw3.h index 282443703..e2c7fe098 100644 --- a/include/GLFW/glfw3.h +++ b/include/GLFW/glfw3.h @@ -1758,6 +1758,19 @@ GLFWAPI void glfwPollEvents(void); */ GLFWAPI void glfwWaitEvents(void); +/*! @brief Posts an empty event to the event queue. + * + * This function posts an empty event from the current thread to the main + * thread event queue, causing @ref glfwWaitEvents to return. + * + * @remarks This function may be called from secondary threads. + * + * @sa glfwWaitEvents + * + * @ingroup window + */ +GLFWAPI void glfwPostEmptyEvent(void); + /*! @brief Returns the value of an input option for the specified window. * * @param[in] window The window to query. diff --git a/src/cocoa_window.m b/src/cocoa_window.m index b0f59e905..5e5e01ac1 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -1148,6 +1148,10 @@ void _glfwPlatformWaitEvents(void) _glfwPlatformPollEvents(); } +void _glfwPlatformPostEmptyEvent(void) +{ +} + void _glfwPlatformSetCursorPos(_GLFWwindow* window, double x, double y) { setModeCursor(window); diff --git a/src/internal.h b/src/internal.h index 1e06460ee..dfcc87555 100644 --- a/src/internal.h +++ b/src/internal.h @@ -523,6 +523,11 @@ void _glfwPlatformPollEvents(void); */ void _glfwPlatformWaitEvents(void); +/*! @copydoc glfwPostEmptyEvent + * @ingroup platform + */ +void _glfwPlatformPostEmptyEvent(void); + /*! @copydoc glfwMakeContextCurrent * @ingroup platform */ diff --git a/src/win32_window.c b/src/win32_window.c index ae520c447..727fc7744 100644 --- a/src/win32_window.c +++ b/src/win32_window.c @@ -1179,6 +1179,10 @@ void _glfwPlatformWaitEvents(void) _glfwPlatformPollEvents(); } +void _glfwPlatformPostEmptyEvent(void) +{ +} + void _glfwPlatformSetCursorPos(_GLFWwindow* window, double xpos, double ypos) { POINT pos = { (int) xpos, (int) ypos }; diff --git a/src/window.c b/src/window.c index 03d08fa3b..06dd9a362 100644 --- a/src/window.c +++ b/src/window.c @@ -672,3 +672,9 @@ GLFWAPI void glfwWaitEvents(void) _glfwPlatformWaitEvents(); } +GLFWAPI void glfwPostEmptyEvent(void) +{ + _GLFW_REQUIRE_INIT(); + _glfwPlatformPostEmptyEvent(); +} + diff --git a/src/x11_window.c b/src/x11_window.c index fd7fbd219..851405e3d 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -1297,6 +1297,10 @@ void _glfwPlatformWaitEvents(void) _glfwPlatformPollEvents(); } +void _glfwPlatformPostEmptyEvent(void) +{ +} + void _glfwPlatformSetCursorPos(_GLFWwindow* window, double x, double y) { // Store the new position so it can be recognized later