mirror of
https://github.com/glfw/glfw.git
synced 2024-11-22 21:14:35 +00:00
Add glfwShowWindow, glfwHideWindow
Add glfwShowWindow and glfwHideWindow functions to allow explicit control over show/hide window. Remove platform specific show window code from _glfwPlatformCreateWindow but call glfwShowWindow from glfwCreateWindow to avoid breaking things (for now).
This commit is contained in:
parent
b77bdea734
commit
596132c3a1
@ -540,6 +540,8 @@ GLFWAPI void glfwGetWindowPos(GLFWwindow, int* xpos, int* ypos);
|
|||||||
GLFWAPI void glfwSetWindowPos(GLFWwindow, int xpos, int ypos);
|
GLFWAPI void glfwSetWindowPos(GLFWwindow, int xpos, int ypos);
|
||||||
GLFWAPI void glfwIconifyWindow(GLFWwindow window);
|
GLFWAPI void glfwIconifyWindow(GLFWwindow window);
|
||||||
GLFWAPI void glfwRestoreWindow(GLFWwindow window);
|
GLFWAPI void glfwRestoreWindow(GLFWwindow window);
|
||||||
|
GLFWAPI void glfwShowWindow(GLFWwindow window);
|
||||||
|
GLFWAPI void glfwHideWindow(GLFWwindow window);
|
||||||
GLFWAPI int glfwGetWindowParam(GLFWwindow window, int param);
|
GLFWAPI int glfwGetWindowParam(GLFWwindow window, int param);
|
||||||
GLFWAPI void glfwSetWindowUserPointer(GLFWwindow window, void* pointer);
|
GLFWAPI void glfwSetWindowUserPointer(GLFWwindow window, void* pointer);
|
||||||
GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow window);
|
GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow window);
|
||||||
|
@ -906,7 +906,6 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
|
|||||||
if (!createContext(window, wndconfig, fbconfig))
|
if (!createContext(window, wndconfig, fbconfig))
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
|
|
||||||
[window->NS.object makeKeyAndOrderFront:nil];
|
|
||||||
[window->NSGL.context setView:[window->NS.object contentView]];
|
[window->NSGL.context setView:[window->NS.object contentView]];
|
||||||
|
|
||||||
if (wndconfig->mode == GLFW_FULLSCREEN)
|
if (wndconfig->mode == GLFW_FULLSCREEN)
|
||||||
@ -1030,6 +1029,25 @@ void _glfwPlatformRestoreWindow(_GLFWwindow* window)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Show window
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformShowWindow(_GLFWwindow* window)
|
||||||
|
{
|
||||||
|
[window->NS.object makeKeyAndOrderFront:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Hide window
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformHideWindow(_GLFWwindow* window)
|
||||||
|
{
|
||||||
|
[window->NS.object orderOut:nil];
|
||||||
|
}
|
||||||
|
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// Write back window parameters into GLFW window structure
|
// Write back window parameters into GLFW window structure
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
@ -302,6 +302,8 @@ void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height);
|
|||||||
void _glfwPlatformSetWindowPos(_GLFWwindow* window, int x, int y);
|
void _glfwPlatformSetWindowPos(_GLFWwindow* window, int x, int y);
|
||||||
void _glfwPlatformIconifyWindow(_GLFWwindow* window);
|
void _glfwPlatformIconifyWindow(_GLFWwindow* window);
|
||||||
void _glfwPlatformRestoreWindow(_GLFWwindow* window);
|
void _glfwPlatformRestoreWindow(_GLFWwindow* window);
|
||||||
|
void _glfwPlatformShowWindow(_GLFWwindow* window);
|
||||||
|
void _glfwPlatformHideWindow(_GLFWwindow* window);
|
||||||
|
|
||||||
// Event management
|
// Event management
|
||||||
void _glfwPlatformPollEvents(void);
|
void _glfwPlatformPollEvents(void);
|
||||||
|
@ -34,95 +34,6 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
|
||||||
|
|
||||||
//========================================================================
|
|
||||||
// Enable/disable minimize/restore animations
|
|
||||||
//========================================================================
|
|
||||||
|
|
||||||
static int setMinMaxAnimations(int enable)
|
|
||||||
{
|
|
||||||
ANIMATIONINFO AI;
|
|
||||||
int old_enable;
|
|
||||||
|
|
||||||
// Get old animation setting
|
|
||||||
AI.cbSize = sizeof(ANIMATIONINFO);
|
|
||||||
SystemParametersInfo(SPI_GETANIMATION, AI.cbSize, &AI, 0);
|
|
||||||
old_enable = AI.iMinAnimate;
|
|
||||||
|
|
||||||
// If requested, change setting
|
|
||||||
if (old_enable != enable)
|
|
||||||
{
|
|
||||||
AI.iMinAnimate = enable;
|
|
||||||
SystemParametersInfo(SPI_SETANIMATION, AI.cbSize, &AI,
|
|
||||||
SPIF_SENDCHANGE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return old_enable;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//========================================================================
|
|
||||||
// Focus the window and bring it to the top of the stack
|
|
||||||
// Due to some nastiness with how XP handles SetForegroundWindow we have
|
|
||||||
// to go through some really bizarre measures to achieve this
|
|
||||||
//========================================================================
|
|
||||||
|
|
||||||
static void setForegroundWindow(HWND hWnd)
|
|
||||||
{
|
|
||||||
int try_count = 0;
|
|
||||||
int old_animate;
|
|
||||||
|
|
||||||
// Try the standard approach first...
|
|
||||||
BringWindowToTop(hWnd);
|
|
||||||
SetForegroundWindow(hWnd);
|
|
||||||
|
|
||||||
// If it worked, return now
|
|
||||||
if (hWnd == GetForegroundWindow())
|
|
||||||
{
|
|
||||||
// Try to modify the system settings (since this is the foreground
|
|
||||||
// process, we are allowed to do this)
|
|
||||||
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID) 0,
|
|
||||||
SPIF_SENDCHANGE);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// For other Windows versions than 95 & NT4.0, the standard approach
|
|
||||||
// may not work, so if we failed we have to "trick" Windows into
|
|
||||||
// making our window the foureground window: Iconify and restore
|
|
||||||
// again. It is ugly, but it seems to work (we turn off those annoying
|
|
||||||
// zoom animations to make it look a bit better at least).
|
|
||||||
|
|
||||||
// Turn off minimize/restore animations
|
|
||||||
old_animate = setMinMaxAnimations(0);
|
|
||||||
|
|
||||||
// We try this a few times, just to be on the safe side of things...
|
|
||||||
do
|
|
||||||
{
|
|
||||||
// Iconify & restore
|
|
||||||
ShowWindow(hWnd, SW_HIDE);
|
|
||||||
ShowWindow(hWnd, SW_SHOWMINIMIZED);
|
|
||||||
ShowWindow(hWnd, SW_SHOWNORMAL);
|
|
||||||
|
|
||||||
// Try to get focus
|
|
||||||
BringWindowToTop(hWnd);
|
|
||||||
SetForegroundWindow(hWnd);
|
|
||||||
|
|
||||||
// We do not want to keep going on forever, so we keep track of
|
|
||||||
// how many times we tried
|
|
||||||
try_count++;
|
|
||||||
}
|
|
||||||
while (hWnd != GetForegroundWindow() && try_count <= 3);
|
|
||||||
|
|
||||||
// Restore the system minimize/restore animation setting
|
|
||||||
setMinMaxAnimations(old_animate);
|
|
||||||
|
|
||||||
// Try to modify the system settings (since this is now hopefully the
|
|
||||||
// foreground process, we are probably allowed to do this)
|
|
||||||
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID) 0,
|
|
||||||
SPIF_SENDCHANGE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// Hide mouse cursor
|
// Hide mouse cursor
|
||||||
//========================================================================
|
//========================================================================
|
||||||
@ -1071,9 +982,6 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
|
|||||||
SWP_NOMOVE | SWP_NOSIZE);
|
SWP_NOMOVE | SWP_NOSIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
setForegroundWindow(window->Win32.handle);
|
|
||||||
SetFocus(window->Win32.handle);
|
|
||||||
|
|
||||||
return GL_TRUE;
|
return GL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1193,6 +1101,28 @@ void _glfwPlatformRestoreWindow(_GLFWwindow* window)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Show or hide window
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformShowWindow(_GLFWwindow* window)
|
||||||
|
{
|
||||||
|
ShowWindow(window->Win32.handle, SW_SHOWNORMAL);
|
||||||
|
BringWindowToTop(window->Win32.handle);
|
||||||
|
SetForegroundWindow(window->Win32.handle);
|
||||||
|
SetFocus(window->Win32.handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Show or hide window
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformHideWindow(_GLFWwindow* window)
|
||||||
|
{
|
||||||
|
ShowWindow(window->Win32.handle, SW_HIDE);
|
||||||
|
}
|
||||||
|
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// Write back window parameters into GLFW window structure
|
// Write back window parameters into GLFW window structure
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
34
src/window.c
34
src/window.c
@ -318,6 +318,8 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height,
|
|||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glfwShowWindow(window, 1); // TODO: consider if this is necessary!
|
||||||
|
|
||||||
// Cache the actual (as opposed to requested) window parameters
|
// Cache the actual (as opposed to requested) window parameters
|
||||||
_glfwPlatformRefreshWindowParams(window);
|
_glfwPlatformRefreshWindowParams(window);
|
||||||
|
|
||||||
@ -623,6 +625,38 @@ GLFWAPI void glfwIconifyWindow(GLFWwindow handle)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Window show
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI void glfwShowWindow(GLFWwindow window)
|
||||||
|
{
|
||||||
|
if (!_glfwInitialized)
|
||||||
|
{
|
||||||
|
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_glfwPlatformShowWindow((_GLFWwindow*)window);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Window hide
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI void glfwHideWindow(GLFWwindow window)
|
||||||
|
{
|
||||||
|
if (!_glfwInitialized)
|
||||||
|
{
|
||||||
|
_glfwSetError(GLFW_NOT_INITIALIZED, NULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_glfwPlatformHideWindow((_GLFWwindow*)window);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// Window un-iconification
|
// Window un-iconification
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
@ -230,10 +230,6 @@ static GLboolean createWindow(_GLFWwindow* window,
|
|||||||
|
|
||||||
_glfwPlatformSetWindowTitle(window, wndconfig->title);
|
_glfwPlatformSetWindowTitle(window, wndconfig->title);
|
||||||
|
|
||||||
// Make sure the window is mapped before proceeding
|
|
||||||
XMapWindow(_glfwLibrary.X11.display, window->X11.handle);
|
|
||||||
XFlush(_glfwLibrary.X11.display);
|
|
||||||
|
|
||||||
return GL_TRUE;
|
return GL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1099,6 +1095,28 @@ void _glfwPlatformRestoreWindow(_GLFWwindow* window)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Show window
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformShowWindow(_GLFWwindow* window)
|
||||||
|
{
|
||||||
|
XMapRaised(_glfwLibrary.X11.display, window->X11.handle);
|
||||||
|
XFlush(_glfwLibrary.X11.display);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Hide window
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformHideWindow(_GLFWwindow* window)
|
||||||
|
{
|
||||||
|
XUnmapWindow(_glfwLibrary.X11.display, window->X11.handle);
|
||||||
|
XFlush(_glfwLibrary.X11.display);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//========================================================================
|
//========================================================================
|
||||||
// Read back framebuffer parameters from the context
|
// Read back framebuffer parameters from the context
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
Loading…
Reference in New Issue
Block a user