mirror of
https://github.com/glfw/glfw.git
synced 2025-10-04 21:56:36 +00:00
Add window occlusion callback
This commit is contained in:
parent
5595fa3ae6
commit
9ebcfb4764
@ -1120,6 +1120,39 @@ not supported, the application as a whole. Once the user has given it
|
|||||||
attention, the system will automatically end the request.
|
attention, the system will automatically end the request.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection window_occlusion Window occlusion state
|
||||||
|
|
||||||
|
A window may not be visible to the user because it is occluded by other windows.
|
||||||
|
In contrast to a hidden window it will still be shown in the task bar, dock or
|
||||||
|
window list. The occluded state can change without any direct interaction with
|
||||||
|
the window, e.g. if the user moves an overlapping window out of the way.
|
||||||
|
|
||||||
|
If you wish to be notified when a window becomes occluded or when a part of it
|
||||||
|
becomes visible again, set an occlusion callback.
|
||||||
|
|
||||||
|
@code
|
||||||
|
glfwSetWindowOcclusionCallback(window, window_occlusion_callback);
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
The callback function receives changes in the occlusion state of the window.
|
||||||
|
|
||||||
|
@code
|
||||||
|
void window_occlusion_callback(GLFWwindow* window, int occluded)
|
||||||
|
{
|
||||||
|
if (occluded)
|
||||||
|
{
|
||||||
|
// The window became fully occluded by other windows
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// The window is no longer fully occluded
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
@note This is currently implemented on macOS only.
|
||||||
|
|
||||||
|
|
||||||
@subsection window_refresh Window damage and refresh
|
@subsection window_refresh Window damage and refresh
|
||||||
|
|
||||||
If you wish to be notified when the contents of a window is damaged and needs
|
If you wish to be notified when the contents of a window is damaged and needs
|
||||||
|
@ -1239,6 +1239,23 @@ typedef void (* GLFWwindowrefreshfun)(GLFWwindow*);
|
|||||||
*/
|
*/
|
||||||
typedef void (* GLFWwindowfocusfun)(GLFWwindow*,int);
|
typedef void (* GLFWwindowfocusfun)(GLFWwindow*,int);
|
||||||
|
|
||||||
|
/*! @brief The function signature for window occlusion callbacks.
|
||||||
|
*
|
||||||
|
* This is the function signature for window occlusion callback functions.
|
||||||
|
*
|
||||||
|
* @param[in] window The window whose occlusion state changed.
|
||||||
|
* @param[in] occluded `GLFW_TRUE` if the window was occluded, or `GLFW_FALSE`
|
||||||
|
* if the window is no longer occluded.
|
||||||
|
*
|
||||||
|
* @sa @ref window_occlusion
|
||||||
|
* @sa @ref glfwSetWindowOcclusionCallback
|
||||||
|
*
|
||||||
|
* @since Added in version 3.3.
|
||||||
|
*
|
||||||
|
* @ingroup window
|
||||||
|
*/
|
||||||
|
typedef void (* GLFWwindowocclusionfun)(GLFWwindow*,int);
|
||||||
|
|
||||||
/*! @brief The function signature for window iconify/restore callbacks.
|
/*! @brief The function signature for window iconify/restore callbacks.
|
||||||
*
|
*
|
||||||
* This is the function signature for window iconify/restore callback
|
* This is the function signature for window iconify/restore callback
|
||||||
@ -3543,6 +3560,31 @@ GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GL
|
|||||||
*/
|
*/
|
||||||
GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwindowfocusfun cbfun);
|
GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwindowfocusfun cbfun);
|
||||||
|
|
||||||
|
/*! @brief Sets the occlusion callback for the specified window.
|
||||||
|
*
|
||||||
|
* This function sets the occlusion callback of the specified window, which is
|
||||||
|
* called when the window becomes (fully) occluded by other windows or when (a
|
||||||
|
* part of) the window becomes visible again because an overlapping window is
|
||||||
|
* moved away.
|
||||||
|
*
|
||||||
|
* @param[in] window The window whose callback to set.
|
||||||
|
* @param[in] cbfun The new callback, or `NULL` to remove the currently set
|
||||||
|
* callback.
|
||||||
|
* @return The previously set callback, or `NULL` if no callback was set or the
|
||||||
|
* library had not been [initialized](@ref intro_init).
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
|
||||||
|
*
|
||||||
|
* @thread_safety This function must only be called from the main thread.
|
||||||
|
*
|
||||||
|
* @sa @ref window_occlusion
|
||||||
|
*
|
||||||
|
* @since Added in version 3.3.
|
||||||
|
*
|
||||||
|
* @ingroup window
|
||||||
|
*/
|
||||||
|
GLFWAPI GLFWwindowocclusionfun glfwSetWindowOcclusionCallback(GLFWwindow* window, GLFWwindowocclusionfun cbfun);
|
||||||
|
|
||||||
/*! @brief Sets the iconify callback for the specified window.
|
/*! @brief Sets the iconify callback for the specified window.
|
||||||
*
|
*
|
||||||
* This function sets the iconification callback of the specified window, which
|
* This function sets the iconification callback of the specified window, which
|
||||||
|
@ -329,6 +329,11 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
|
|||||||
_glfwInputWindowPos(window, x, y);
|
_glfwInputWindowPos(window, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)windowDidChangeOcclusionState:(NSNotification *)notification
|
||||||
|
{
|
||||||
|
_glfwInputWindowOcclusion(window, !([window->ns.object occlusionState] & NSWindowOcclusionStateVisible));
|
||||||
|
}
|
||||||
|
|
||||||
- (void)windowDidMiniaturize:(NSNotification *)notification
|
- (void)windowDidMiniaturize:(NSNotification *)notification
|
||||||
{
|
{
|
||||||
if (window->monitor)
|
if (window->monitor)
|
||||||
|
@ -399,6 +399,7 @@ struct _GLFWwindow
|
|||||||
GLFWwindowclosefun close;
|
GLFWwindowclosefun close;
|
||||||
GLFWwindowrefreshfun refresh;
|
GLFWwindowrefreshfun refresh;
|
||||||
GLFWwindowfocusfun focus;
|
GLFWwindowfocusfun focus;
|
||||||
|
GLFWwindowocclusionfun occlusion;
|
||||||
GLFWwindowiconifyfun iconify;
|
GLFWwindowiconifyfun iconify;
|
||||||
GLFWwindowmaximizefun maximize;
|
GLFWwindowmaximizefun maximize;
|
||||||
GLFWframebuffersizefun fbsize;
|
GLFWframebuffersizefun fbsize;
|
||||||
@ -697,6 +698,7 @@ void _glfwPlatformUnlockMutex(_GLFWmutex* mutex);
|
|||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void _glfwInputWindowFocus(_GLFWwindow* window, GLFWbool focused);
|
void _glfwInputWindowFocus(_GLFWwindow* window, GLFWbool focused);
|
||||||
|
void _glfwInputWindowOcclusion(_GLFWwindow* window, GLFWbool occluded);
|
||||||
void _glfwInputWindowPos(_GLFWwindow* window, int xpos, int ypos);
|
void _glfwInputWindowPos(_GLFWwindow* window, int xpos, int ypos);
|
||||||
void _glfwInputWindowSize(_GLFWwindow* window, int width, int height);
|
void _glfwInputWindowSize(_GLFWwindow* window, int width, int height);
|
||||||
void _glfwInputFramebufferSize(_GLFWwindow* window, int width, int height);
|
void _glfwInputFramebufferSize(_GLFWwindow* window, int width, int height);
|
||||||
|
19
src/window.c
19
src/window.c
@ -66,6 +66,14 @@ void _glfwInputWindowFocus(_GLFWwindow* window, GLFWbool focused)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Notifies shared code that a window's occlusion state has changed
|
||||||
|
//
|
||||||
|
void _glfwInputWindowOcclusion(_GLFWwindow* window, GLFWbool occluded)
|
||||||
|
{
|
||||||
|
if (window->callbacks.occlusion)
|
||||||
|
window->callbacks.occlusion((GLFWwindow*) window, occluded);
|
||||||
|
}
|
||||||
|
|
||||||
// Notifies shared code that a window has moved
|
// Notifies shared code that a window has moved
|
||||||
// The position is specified in client-area relative screen coordinates
|
// The position is specified in client-area relative screen coordinates
|
||||||
//
|
//
|
||||||
@ -1025,6 +1033,17 @@ GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* handle,
|
|||||||
return cbfun;
|
return cbfun;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLFWAPI GLFWwindowocclusionfun glfwSetWindowOcclusionCallback(GLFWwindow* handle,
|
||||||
|
GLFWwindowocclusionfun cbfun)
|
||||||
|
{
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
_GLFW_SWAP_POINTERS(window->callbacks.occlusion, cbfun);
|
||||||
|
return cbfun;
|
||||||
|
}
|
||||||
|
|
||||||
GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* handle,
|
GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* handle,
|
||||||
GLFWwindowiconifyfun cbfun)
|
GLFWwindowiconifyfun cbfun)
|
||||||
{
|
{
|
||||||
|
@ -326,6 +326,14 @@ static void window_focus_callback(GLFWwindow* window, int focused)
|
|||||||
focused ? "focused" : "defocused");
|
focused ? "focused" : "defocused");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void window_occlusion_callback(GLFWwindow* window, int occluded)
|
||||||
|
{
|
||||||
|
Slot* slot = glfwGetWindowUserPointer(window);
|
||||||
|
printf("%08x to %i at %0.3f: Window %s\n",
|
||||||
|
counter++, slot->number, glfwGetTime(),
|
||||||
|
occluded ? "occluded" : "not occluded");
|
||||||
|
}
|
||||||
|
|
||||||
static void window_iconify_callback(GLFWwindow* window, int iconified)
|
static void window_iconify_callback(GLFWwindow* window, int iconified)
|
||||||
{
|
{
|
||||||
Slot* slot = glfwGetWindowUserPointer(window);
|
Slot* slot = glfwGetWindowUserPointer(window);
|
||||||
@ -608,6 +616,7 @@ int main(int argc, char** argv)
|
|||||||
glfwSetWindowCloseCallback(slots[i].window, window_close_callback);
|
glfwSetWindowCloseCallback(slots[i].window, window_close_callback);
|
||||||
glfwSetWindowRefreshCallback(slots[i].window, window_refresh_callback);
|
glfwSetWindowRefreshCallback(slots[i].window, window_refresh_callback);
|
||||||
glfwSetWindowFocusCallback(slots[i].window, window_focus_callback);
|
glfwSetWindowFocusCallback(slots[i].window, window_focus_callback);
|
||||||
|
glfwSetWindowOcclusionCallback(slots[i].window, window_occlusion_callback);
|
||||||
glfwSetWindowIconifyCallback(slots[i].window, window_iconify_callback);
|
glfwSetWindowIconifyCallback(slots[i].window, window_iconify_callback);
|
||||||
glfwSetWindowMaximizeCallback(slots[i].window, window_maximize_callback);
|
glfwSetWindowMaximizeCallback(slots[i].window, window_maximize_callback);
|
||||||
glfwSetMouseButtonCallback(slots[i].window, mouse_button_callback);
|
glfwSetMouseButtonCallback(slots[i].window, mouse_button_callback);
|
||||||
|
Loading…
Reference in New Issue
Block a user