@ -34,95 +34,6 @@
# include <stdlib.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
//========================================================================
@ -1071,9 +982,6 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
SWP_NOMOVE | SWP_NOSIZE ) ;
}
setForegroundWindow ( window - > Win32 . handle ) ;
SetFocus ( window - > Win32 . handle ) ;
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
//========================================================================