reworked fullscreen code based on implementation of Chromium. can now handle/restore windows in maximized state and no longer uses WS_POPUP.
git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1510 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
parent
5fa61c0c64
commit
ddda931bac
@ -91,8 +91,10 @@ struct tagSFG_PlatformContext
|
|||||||
typedef struct tagSFG_PlatformWindowState SFG_PlatformWindowState;
|
typedef struct tagSFG_PlatformWindowState SFG_PlatformWindowState;
|
||||||
struct tagSFG_PlatformWindowState
|
struct tagSFG_PlatformWindowState
|
||||||
{
|
{
|
||||||
RECT OldRect; /* window rect - stored before the window is made fullscreen */
|
RECT OldRect; /* window rect - stored before the window is made fullscreen */
|
||||||
DWORD OldStyle; /* window style - stored before the window is made fullscreen */
|
DWORD OldStyle; /* window style - stored before the window is made fullscreen */
|
||||||
|
DWORD OldStyleEx; /* window Ex style - stored before the window is made fullscreen */
|
||||||
|
BOOL OldMaximized; /* window maximized state - stored before the window is made fullscreen */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -980,7 +980,6 @@ void fgPlatformGlutFullScreen( SFG_Window *win )
|
|||||||
|
|
||||||
{
|
{
|
||||||
#if(WINVER >= 0x0500) /* Windows 2000 or later */
|
#if(WINVER >= 0x0500) /* Windows 2000 or later */
|
||||||
DWORD s;
|
|
||||||
RECT rect;
|
RECT rect;
|
||||||
HMONITOR hMonitor;
|
HMONITOR hMonitor;
|
||||||
MONITORINFO mi;
|
MONITORINFO mi;
|
||||||
@ -992,16 +991,25 @@ void fgPlatformGlutFullScreen( SFG_Window *win )
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/* store current window rect */
|
/* save current window rect, style, exstyle and maximized state */
|
||||||
|
win->State.pWState.OldMaximized = !!IsZoomed(win->Window.Handle);
|
||||||
|
if (win->State.pWState.OldMaximized)
|
||||||
|
/* We force the window into restored mode before going
|
||||||
|
* fullscreen because Windows doesn't seem to hide the
|
||||||
|
* taskbar if the window is in the maximized state.
|
||||||
|
*/
|
||||||
|
SendMessage(win->Window.Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
|
||||||
|
|
||||||
GetWindowRect( win->Window.Handle, &win->State.pWState.OldRect );
|
GetWindowRect( win->Window.Handle, &win->State.pWState.OldRect );
|
||||||
|
win->State.pWState.OldStyle = GetWindowLong(win->Window.Handle, GWL_STYLE);
|
||||||
|
win->State.pWState.OldStyleEx = GetWindowLong(win->Window.Handle, GWL_EXSTYLE);
|
||||||
|
|
||||||
/* store current window style */
|
/* remove decorations from style */
|
||||||
win->State.pWState.OldStyle = s = GetWindowLong(win->Window.Handle, GWL_STYLE);
|
SetWindowLong(win->Window.Handle, GWL_STYLE,
|
||||||
|
win->State.pWState.OldStyle & ~(WS_CAPTION | WS_THICKFRAME));
|
||||||
/* remove decorations from style and add popup style*/
|
SetWindowLong(win->Window.Handle, GWL_EXSTYLE,
|
||||||
s &= ~WS_OVERLAPPEDWINDOW;
|
win->State.pWState.OldStyleEx & ~(WS_EX_DLGMODALFRAME |
|
||||||
s |= WS_POPUP;
|
WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE));
|
||||||
SetWindowLong(win->Window.Handle, GWL_STYLE, s);
|
|
||||||
|
|
||||||
/* For fullscreen mode, find the monitor that is covered the most
|
/* For fullscreen mode, find the monitor that is covered the most
|
||||||
* by the window and get its rect as the resize target.
|
* by the window and get its rect as the resize target.
|
||||||
@ -1063,6 +1071,7 @@ void fgPlatformGlutLeaveFullScreen( SFG_Window *win )
|
|||||||
|
|
||||||
/* restore style of window before making it fullscreen */
|
/* restore style of window before making it fullscreen */
|
||||||
SetWindowLong(win->Window.Handle, GWL_STYLE, win->State.pWState.OldStyle);
|
SetWindowLong(win->Window.Handle, GWL_STYLE, win->State.pWState.OldStyle);
|
||||||
|
SetWindowLong(win->Window.Handle, GWL_EXSTYLE, win->State.pWState.OldStyleEx);
|
||||||
|
|
||||||
/* Then resize */
|
/* Then resize */
|
||||||
SetWindowPos(win->Window.Handle,
|
SetWindowPos(win->Window.Handle,
|
||||||
@ -1075,6 +1084,9 @@ void fgPlatformGlutLeaveFullScreen( SFG_Window *win )
|
|||||||
SWP_NOZORDER
|
SWP_NOZORDER
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (win->State.pWState.OldMaximized)
|
||||||
|
SendMessage(win->Window.Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
|
||||||
|
|
||||||
win->State.IsFullscreen = GL_FALSE;
|
win->State.IsFullscreen = GL_FALSE;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user