GLboolean sizeUse, int w, int h,\r
GLboolean gameMode, GLboolean isSubWindow );\r
extern void fgPlatformCloseWindow( SFG_Window* window );\r
+extern void fgPlatformGlutShowWindow( void );\r
+extern void fgPlatformGlutHideWindow( void );\r
+extern void fgPlatformGlutIconifyWindow( void );\r
+extern void fgPlatformGlutSetWindowTitle( const char* title );\r
+extern void fgPlatformGlutSetIconTitle( const char* title );\r
+extern void fgPlatformGlutPositionWindow( int x, int y );\r
+extern void fgPlatformGlutPushWindow( void );\r
+extern void fgPlatformGlutPopWindow( void );\r
+extern void fgPlatformGlutFullScreen( SFG_Window *win );\r
+extern void fgPlatformGlutLeaveFullScreen( SFG_Window *win );\r
+extern void fgPlatformGlutFullScreenToggle( SFG_Window *win );\r
+\r
\r
/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */\r
\r
/* XFlush( fgDisplay.Display ); */ /* XXX Shouldn't need this */\r
}\r
\r
+\r
+static Bool fghWindowIsVisible( Display *display, XEvent *event, XPointer arg)\r
+{\r
+ Window window = (Window)arg;\r
+ return (event->type == MapNotify) && (event->xmap.window == window);\r
+}\r
+\r
+\r
+\r
+\r
+/*\r
+ * This function makes the current window visible\r
+ */\r
+void fgPlatformGlutShowWindow( void )\r
+{\r
+ XMapWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle );\r
+ XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */\r
+}\r
+\r
+/*\r
+ * This function hides the current window\r
+ */\r
+void fgPlatformGlutHideWindow( void )\r
+{\r
+ if( fgStructure.CurrentWindow->Parent == NULL )\r
+ XWithdrawWindow( fgDisplay.Display,\r
+ fgStructure.CurrentWindow->Window.Handle,\r
+ fgDisplay.Screen );\r
+ else\r
+ XUnmapWindow( fgDisplay.Display,\r
+ fgStructure.CurrentWindow->Window.Handle );\r
+ XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */\r
+}\r
+\r
+/*\r
+ * Iconify the current window (top-level windows only)\r
+ */\r
+void fgPlatformGlutIconifyWindow( void )\r
+{\r
+ XIconifyWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle,\r
+ fgDisplay.Screen );\r
+ XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */\r
+}\r
+\r
+/*\r
+ * Set the current window's title\r
+ */\r
+void fgPlatformGlutSetWindowTitle( const char* title )\r
+{\r
+ XTextProperty text;\r
+\r
+ text.value = (unsigned char *) title;\r
+ text.encoding = XA_STRING;\r
+ text.format = 8;\r
+ text.nitems = strlen( title );\r
+\r
+ XSetWMName(\r
+ fgDisplay.Display,\r
+ fgStructure.CurrentWindow->Window.Handle,\r
+ &text\r
+ );\r
+\r
+ XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */\r
+}\r
+\r
+/*\r
+ * Set the current window's iconified title\r
+ */\r
+void fgPlatformGlutSetIconTitle( const char* title )\r
+{\r
+ XTextProperty text;\r
+\r
+ text.value = (unsigned char *) title;\r
+ text.encoding = XA_STRING;\r
+ text.format = 8;\r
+ text.nitems = strlen( title );\r
+\r
+ XSetWMIconName(\r
+ fgDisplay.Display,\r
+ fgStructure.CurrentWindow->Window.Handle,\r
+ &text\r
+ );\r
+\r
+ XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */\r
+}\r
+\r
+/*\r
+ * Change the current window's position\r
+ */\r
+void fgPlatformGlutPositionWindow( int x, int y )\r
+{\r
+ XMoveWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle,\r
+ x, y );\r
+ XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */\r
+}\r
+\r
+/*\r
+ * Lowers the current window (by Z order change)\r
+ */\r
+void fgPlatformGlutPushWindow( void )\r
+{\r
+ XLowerWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle );\r
+}\r
+\r
+/*\r
+ * Raises the current window (by Z order change)\r
+ */\r
+void fgPlatformGlutPopWindow( void )\r
+{\r
+ XRaiseWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle );\r
+}\r
+\r
+/*\r
+ * Resize the current window so that it fits the whole screen\r
+ */\r
+void fgPlatformGlutFullScreen( SFG_Window *win )\r
+{\r
+ if(!glutGet(GLUT_FULL_SCREEN)) {\r
+ if(fghToggleFullscreen() != -1) {\r
+ win->State.IsFullscreen = GL_TRUE;\r
+ }\r
+ }\r
+}\r
+\r
+/*\r
+ * If we are fullscreen, resize the current window back to its original size\r
+ */\r
+void fgPlatformGlutLeaveFullScreen( SFG_Window *win )\r
+{\r
+ if(glutGet(GLUT_FULL_SCREEN)) {\r
+ if(fghToggleFullscreen() != -1) {\r
+ win->State.IsFullscreen = GL_FALSE;\r
+ }\r
+ }\r
+}\r
+\r
+/*\r
+ * Toggle the window's full screen state.\r
+ */\r
+void fgPlatformGlutFullScreenToggle( SFG_Window *win )\r
+{\r
+ if(fghToggleFullscreen() != -1) {\r
+ win->State.IsFullscreen = !win->State.IsFullscreen;\r
+ }\r
+}\r
+\r
+\r
+\r
#endif /* TARGET_HOST_POSIX_X11 */\r
\r
\r
}\r
\r
\r
-#if TARGET_HOST_POSIX_X11\r
-static Bool fghWindowIsVisible( Display *display, XEvent *event, XPointer arg)\r
-{\r
- Window window = (Window)arg;\r
- return (event->type == MapNotify) && (event->xmap.window == window);\r
-}\r
-#endif\r
\r
\r
/*\r
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutShowWindow" );\r
FREEGLUT_EXIT_IF_NO_WINDOW ( "glutShowWindow" );\r
\r
-#if TARGET_HOST_POSIX_X11\r
-\r
- XMapWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle );\r
- XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */\r
-\r
-#elif TARGET_HOST_MS_WINDOWS\r
-\r
- ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_SHOW );\r
-\r
-#endif\r
+ fgPlatformGlutShowWindow ();\r
\r
fgStructure.CurrentWindow->State.Redisplay = GL_TRUE;\r
}\r
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutHideWindow" );\r
FREEGLUT_EXIT_IF_NO_WINDOW ( "glutHideWindow" );\r
\r
-#if TARGET_HOST_POSIX_X11\r
-\r
- if( fgStructure.CurrentWindow->Parent == NULL )\r
- XWithdrawWindow( fgDisplay.Display,\r
- fgStructure.CurrentWindow->Window.Handle,\r
- fgDisplay.Screen );\r
- else\r
- XUnmapWindow( fgDisplay.Display,\r
- fgStructure.CurrentWindow->Window.Handle );\r
- XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */\r
-\r
-#elif TARGET_HOST_MS_WINDOWS\r
-\r
- ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_HIDE );\r
-\r
-#endif\r
+ fgPlatformGlutHideWindow ();\r
\r
fgStructure.CurrentWindow->State.Redisplay = GL_FALSE;\r
}\r
FREEGLUT_EXIT_IF_NO_WINDOW ( "glutIconifyWindow" );\r
\r
fgStructure.CurrentWindow->State.Visible = GL_FALSE;\r
-#if TARGET_HOST_POSIX_X11\r
-\r
- XIconifyWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle,\r
- fgDisplay.Screen );\r
- XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */\r
-\r
-#elif TARGET_HOST_MS_WINDOWS\r
\r
- ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_MINIMIZE );\r
-\r
-#endif\r
+ fgPlatformGlutIconifyWindow ();\r
\r
fgStructure.CurrentWindow->State.Redisplay = GL_FALSE;\r
}\r
FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetWindowTitle" );\r
if( ! fgStructure.CurrentWindow->Parent )\r
{\r
-#if TARGET_HOST_POSIX_X11\r
-\r
- XTextProperty text;\r
-\r
- text.value = (unsigned char *) title;\r
- text.encoding = XA_STRING;\r
- text.format = 8;\r
- text.nitems = strlen( title );\r
-\r
- XSetWMName(\r
- fgDisplay.Display,\r
- fgStructure.CurrentWindow->Window.Handle,\r
- &text\r
- );\r
-\r
- XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */\r
-\r
-#elif TARGET_HOST_MS_WINDOWS\r
-# ifdef _WIN32_WCE\r
- {\r
- wchar_t* wstr = fghWstrFromStr(title);\r
- SetWindowText( fgStructure.CurrentWindow->Window.Handle, wstr );\r
- free(wstr);\r
- }\r
-# else\r
- SetWindowText( fgStructure.CurrentWindow->Window.Handle, title );\r
-# endif\r
-\r
-#endif\r
+ fgPlatformGlutSetWindowTitle ( title );\r
}\r
}\r
\r
\r
if( ! fgStructure.CurrentWindow->Parent )\r
{\r
-#if TARGET_HOST_POSIX_X11\r
-\r
- XTextProperty text;\r
-\r
- text.value = (unsigned char *) title;\r
- text.encoding = XA_STRING;\r
- text.format = 8;\r
- text.nitems = strlen( title );\r
-\r
- XSetWMIconName(\r
- fgDisplay.Display,\r
- fgStructure.CurrentWindow->Window.Handle,\r
- &text\r
- );\r
-\r
- XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */\r
-\r
-#elif TARGET_HOST_MS_WINDOWS\r
-# ifdef _WIN32_WCE\r
- {\r
- wchar_t* wstr = fghWstrFromStr(title);\r
- SetWindowText( fgStructure.CurrentWindow->Window.Handle, wstr );\r
- free(wstr);\r
- }\r
-# else\r
- SetWindowText( fgStructure.CurrentWindow->Window.Handle, title );\r
-# endif\r
-\r
-#endif\r
+ fgPlatformGlutSetIconTitle ( title );\r
}\r
}\r
\r
glutLeaveFullScreen();\r
}\r
\r
-#if TARGET_HOST_POSIX_X11\r
-\r
- XMoveWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle,\r
- x, y );\r
- XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */\r
-\r
-#elif TARGET_HOST_MS_WINDOWS\r
-\r
- {\r
- RECT winRect;\r
-\r
- /* "GetWindowRect" returns the pixel coordinates of the outside of the window */\r
- GetWindowRect( fgStructure.CurrentWindow->Window.Handle, &winRect );\r
- MoveWindow(\r
- fgStructure.CurrentWindow->Window.Handle,\r
- x,\r
- y,\r
- winRect.right - winRect.left,\r
- winRect.bottom - winRect.top,\r
- TRUE\r
- );\r
- }\r
-\r
-#endif\r
+ fgPlatformGlutPositionWindow ( x, y );\r
}\r
\r
/*\r
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPushWindow" );\r
FREEGLUT_EXIT_IF_NO_WINDOW ( "glutPushWindow" );\r
\r
-#if TARGET_HOST_POSIX_X11\r
-\r
- XLowerWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle );\r
-\r
-#elif TARGET_HOST_MS_WINDOWS\r
-\r
- SetWindowPos(\r
- fgStructure.CurrentWindow->Window.Handle,\r
- HWND_BOTTOM,\r
- 0, 0, 0, 0,\r
- SWP_NOSIZE | SWP_NOMOVE\r
- );\r
-\r
-#endif\r
+ fgPlatformGlutPushWindow ();\r
}\r
\r
/*\r
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPopWindow" );\r
FREEGLUT_EXIT_IF_NO_WINDOW ( "glutPopWindow" );\r
\r
-#if TARGET_HOST_POSIX_X11\r
-\r
- XRaiseWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle );\r
-\r
-#elif TARGET_HOST_MS_WINDOWS\r
-\r
- SetWindowPos(\r
- fgStructure.CurrentWindow->Window.Handle,\r
- HWND_TOP,\r
- 0, 0, 0, 0,\r
- SWP_NOSIZE | SWP_NOMOVE\r
- );\r
-\r
-#endif\r
+ fgPlatformGlutPopWindow ();\r
}\r
\r
/*\r
return;\r
}\r
\r
-#if TARGET_HOST_POSIX_X11\r
- if(!glutGet(GLUT_FULL_SCREEN)) {\r
- if(fghToggleFullscreen() != -1) {\r
- win->State.IsFullscreen = GL_TRUE;\r
- }\r
- }\r
-\r
-#elif TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) /* FIXME: what about WinCE */\r
-\r
- if (glutGet(GLUT_FULL_SCREEN))\r
- {\r
- /* Leave full screen state before entering fullscreen again (resizing?) */\r
- glutLeaveFullScreen();\r
- }\r
-\r
- {\r
-#if(WINVER >= 0x0500) /* Windows 2000 or later */\r
- DWORD s;\r
- RECT rect;\r
- HMONITOR hMonitor;\r
- MONITORINFO mi;\r
-\r
- /* For fullscreen mode, first remove all window decoration\r
- * and set style to popup so it will overlap the taskbar\r
- * then force to maximize on the screen on which it has the most\r
- * overlap.\r
- */\r
-\r
- \r
- /* store current window rect */\r
- GetWindowRect( win->Window.Handle, &win->State.OldRect );\r
-\r
- /* store current window style */\r
- win->State.OldStyle = s = GetWindowLong(win->Window.Handle, GWL_STYLE);\r
-\r
- /* remove decorations from style and add popup style*/\r
- s &= ~WS_OVERLAPPEDWINDOW;\r
- s |= WS_POPUP;\r
- SetWindowLong(win->Window.Handle, GWL_STYLE, s);\r
- SetWindowPos(win->Window.Handle, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);\r
-\r
- /* For fullscreen mode, find the monitor that is covered the most\r
- * by the window and get its rect as the resize target.\r
- */\r
- hMonitor= MonitorFromRect(&win->State.OldRect, MONITOR_DEFAULTTONEAREST);\r
- mi.cbSize = sizeof(mi);\r
- GetMonitorInfo(hMonitor, &mi);\r
- rect = mi.rcMonitor;\r
-#else /* if (WINVER >= 0x0500) */\r
- RECT rect;\r
-\r
- /* For fullscreen mode, force the top-left corner to 0,0\r
- * and adjust the window rectangle so that the client area\r
- * covers the whole screen.\r
- */\r
-\r
- rect.left = 0;\r
- rect.top = 0;\r
- rect.right = fgDisplay.ScreenWidth;\r
- rect.bottom = fgDisplay.ScreenHeight;\r
-\r
- AdjustWindowRect ( &rect, WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS |\r
- WS_CLIPCHILDREN, FALSE );\r
-#endif /* (WINVER >= 0x0500) */\r
-\r
- /*\r
- * then resize window\r
- * SWP_NOACTIVATE Do not activate the window\r
- * SWP_NOOWNERZORDER Do not change position in z-order\r
- * SWP_NOSENDCHANGING Suppress WM_WINDOWPOSCHANGING message\r
- * SWP_NOZORDER Retains the current Z order (ignore 2nd param)\r
- */\r
- SetWindowPos( fgStructure.CurrentWindow->Window.Handle,\r
- HWND_TOP,\r
- rect.left,\r
- rect.top,\r
- rect.right - rect.left,\r
- rect.bottom - rect.top,\r
- SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING |\r
- SWP_NOZORDER\r
- );\r
-\r
- win->State.IsFullscreen = GL_TRUE;\r
- }\r
-#endif\r
+ fgPlatformGlutFullScreen ( win );\r
}\r
\r
/*\r
\r
win = fgStructure.CurrentWindow;\r
\r
-#if TARGET_HOST_POSIX_X11\r
- if(glutGet(GLUT_FULL_SCREEN)) {\r
- if(fghToggleFullscreen() != -1) {\r
- win->State.IsFullscreen = GL_FALSE;\r
- }\r
- }\r
-\r
-#elif TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) /* FIXME: what about WinCE */\r
- if (!glutGet(GLUT_FULL_SCREEN))\r
- {\r
- /* nothing to do */\r
- return;\r
- }\r
-\r
- /* restore style of window before making it fullscreen */\r
- SetWindowLong(win->Window.Handle, GWL_STYLE, win->State.OldStyle);\r
- SetWindowPos(win->Window.Handle, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);\r
-\r
- /* Then resize */\r
- SetWindowPos(win->Window.Handle,\r
- HWND_TOP,\r
- win->State.OldRect.left,\r
- win->State.OldRect.top,\r
- win->State.OldRect.right - win->State.OldRect.left,\r
- win->State.OldRect.bottom - win->State.OldRect.top,\r
- SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING |\r
- SWP_NOZORDER\r
- );\r
-\r
- win->State.IsFullscreen = GL_FALSE;\r
-#endif\r
+ fgPlatformGlutLeaveFullScreen ( win );\r
}\r
\r
/*\r
\r
win = fgStructure.CurrentWindow;\r
\r
-#if TARGET_HOST_POSIX_X11\r
- if(fghToggleFullscreen() != -1) {\r
- win->State.IsFullscreen = !win->State.IsFullscreen;\r
- }\r
-#elif TARGET_HOST_MS_WINDOWS\r
- if (!win->State.IsFullscreen)\r
- glutFullScreen();\r
- else\r
- glutLeaveFullScreen();\r
-#endif\r
+ fgPlatformGlutFullScreenToggle ( win );\r
}\r
\r
/*\r
\r
\r
\r
+/*\r
+ * This function makes the current window visible\r
+ */\r
+void fgPlatformGlutShowWindow( void )\r
+{\r
+ ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_SHOW );\r
+}\r
+\r
+/*\r
+ * This function hides the current window\r
+ */\r
+void fgPlatformGlutHideWindow( void )\r
+{\r
+ ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_HIDE );\r
+}\r
+\r
+/*\r
+ * Iconify the current window (top-level windows only)\r
+ */\r
+void fgPlatformGlutIconifyWindow( void )\r
+{\r
+ ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_MINIMIZE );\r
+}\r
+\r
+/*\r
+ * Set the current window's title\r
+ */\r
+void fgPlatformGlutSetWindowTitle( const char* title )\r
+{\r
+#ifdef _WIN32_WCE\r
+ {\r
+ wchar_t* wstr = fghWstrFromStr(title);\r
+ SetWindowText( fgStructure.CurrentWindow->Window.Handle, wstr );\r
+ free(wstr);\r
+ }\r
+#else\r
+ SetWindowText( fgStructure.CurrentWindow->Window.Handle, title );\r
+#endif\r
+}\r
+\r
+/*\r
+ * Set the current window's iconified title\r
+ */\r
+void fgPlatformGlutSetIconTitle( const char* title )\r
+{\r
+#ifdef _WIN32_WCE\r
+ {\r
+ wchar_t* wstr = fghWstrFromStr(title);\r
+ SetWindowText( fgStructure.CurrentWindow->Window.Handle, wstr );\r
+ free(wstr);\r
+ }\r
+#else\r
+ SetWindowText( fgStructure.CurrentWindow->Window.Handle, title );\r
+#endif\r
+}\r
+\r
+/*\r
+ * Change the current window's position\r
+ */\r
+void fgPlatformGlutPositionWindow( int x, int y )\r
+{\r
+ RECT winRect;\r
+\r
+ /* "GetWindowRect" returns the pixel coordinates of the outside of the window */\r
+ GetWindowRect( fgStructure.CurrentWindow->Window.Handle, &winRect );\r
+ MoveWindow(\r
+ fgStructure.CurrentWindow->Window.Handle,\r
+ x,\r
+ y,\r
+ winRect.right - winRect.left,\r
+ winRect.bottom - winRect.top,\r
+ TRUE\r
+ );\r
+}\r
+\r
+/*\r
+ * Lowers the current window (by Z order change)\r
+ */\r
+void fgPlatformGlutPushWindow( void )\r
+{\r
+ SetWindowPos(\r
+ fgStructure.CurrentWindow->Window.Handle,\r
+ HWND_BOTTOM,\r
+ 0, 0, 0, 0,\r
+ SWP_NOSIZE | SWP_NOMOVE\r
+ );\r
+}\r
+\r
+/*\r
+ * Raises the current window (by Z order change)\r
+ */\r
+void fgPlatformGlutPopWindow( void )\r
+{\r
+ SetWindowPos(\r
+ fgStructure.CurrentWindow->Window.Handle,\r
+ HWND_TOP,\r
+ 0, 0, 0, 0,\r
+ SWP_NOSIZE | SWP_NOMOVE\r
+ );\r
+}\r
+\r
+/*\r
+ * Resize the current window so that it fits the whole screen\r
+ */\r
+void fgPlatformGlutFullScreen( SFG_Window *win )\r
+{\r
+#if !defined(_WIN32_WCE) /* FIXME: what about WinCE */\r
+\r
+ if (glutGet(GLUT_FULL_SCREEN))\r
+ {\r
+ /* Leave full screen state before entering fullscreen again (resizing?) */\r
+ glutLeaveFullScreen();\r
+ }\r
+\r
+ {\r
+#if(WINVER >= 0x0500) /* Windows 2000 or later */\r
+ DWORD s;\r
+ RECT rect;\r
+ HMONITOR hMonitor;\r
+ MONITORINFO mi;\r
+\r
+ /* For fullscreen mode, first remove all window decoration\r
+ * and set style to popup so it will overlap the taskbar\r
+ * then force to maximize on the screen on which it has the most\r
+ * overlap.\r
+ */\r
+\r
+ \r
+ /* store current window rect */\r
+ GetWindowRect( win->Window.Handle, &win->State.OldRect );\r
+\r
+ /* store current window style */\r
+ win->State.OldStyle = s = GetWindowLong(win->Window.Handle, GWL_STYLE);\r
+\r
+ /* remove decorations from style and add popup style*/\r
+ s &= ~WS_OVERLAPPEDWINDOW;\r
+ s |= WS_POPUP;\r
+ SetWindowLong(win->Window.Handle, GWL_STYLE, s);\r
+ SetWindowPos(win->Window.Handle, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);\r
+\r
+ /* For fullscreen mode, find the monitor that is covered the most\r
+ * by the window and get its rect as the resize target.\r
+ */\r
+ hMonitor= MonitorFromRect(&win->State.OldRect, MONITOR_DEFAULTTONEAREST);\r
+ mi.cbSize = sizeof(mi);\r
+ GetMonitorInfo(hMonitor, &mi);\r
+ rect = mi.rcMonitor;\r
+#else /* if (WINVER >= 0x0500) */\r
+ RECT rect;\r
+\r
+ /* For fullscreen mode, force the top-left corner to 0,0\r
+ * and adjust the window rectangle so that the client area\r
+ * covers the whole screen.\r
+ */\r
+\r
+ rect.left = 0;\r
+ rect.top = 0;\r
+ rect.right = fgDisplay.ScreenWidth;\r
+ rect.bottom = fgDisplay.ScreenHeight;\r
+\r
+ AdjustWindowRect ( &rect, WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS |\r
+ WS_CLIPCHILDREN, FALSE );\r
+#endif /* (WINVER >= 0x0500) */\r
+\r
+ /*\r
+ * then resize window\r
+ * SWP_NOACTIVATE Do not activate the window\r
+ * SWP_NOOWNERZORDER Do not change position in z-order\r
+ * SWP_NOSENDCHANGING Suppress WM_WINDOWPOSCHANGING message\r
+ * SWP_NOZORDER Retains the current Z order (ignore 2nd param)\r
+ */\r
+ SetWindowPos( fgStructure.CurrentWindow->Window.Handle,\r
+ HWND_TOP,\r
+ rect.left,\r
+ rect.top,\r
+ rect.right - rect.left,\r
+ rect.bottom - rect.top,\r
+ SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING |\r
+ SWP_NOZORDER\r
+ );\r
+\r
+ win->State.IsFullscreen = GL_TRUE;\r
+ }\r
+#endif\r
+}\r
+\r
+/*\r
+ * If we are fullscreen, resize the current window back to its original size\r
+ */\r
+void fgPlatformGlutLeaveFullScreen( SFG_Window *win )\r
+{\r
+#if !defined(_WIN32_WCE) /* FIXME: what about WinCE */\r
+ if (!glutGet(GLUT_FULL_SCREEN))\r
+ {\r
+ /* nothing to do */\r
+ return;\r
+ }\r
+\r
+ /* restore style of window before making it fullscreen */\r
+ SetWindowLong(win->Window.Handle, GWL_STYLE, win->State.OldStyle);\r
+ SetWindowPos(win->Window.Handle, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);\r
+\r
+ /* Then resize */\r
+ SetWindowPos(win->Window.Handle,\r
+ HWND_TOP,\r
+ win->State.OldRect.left,\r
+ win->State.OldRect.top,\r
+ win->State.OldRect.right - win->State.OldRect.left,\r
+ win->State.OldRect.bottom - win->State.OldRect.top,\r
+ SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING |\r
+ SWP_NOZORDER\r
+ );\r
+\r
+ win->State.IsFullscreen = GL_FALSE;\r
+#endif\r
+}\r
+\r
+/*\r
+ * Toggle the window's full screen state.\r
+ */\r
+void fgPlatformGlutFullScreenToggle( SFG_Window *win )\r
+{\r
+ if (!win->State.IsFullscreen)\r
+ glutFullScreen();\r
+ else\r
+ glutLeaveFullScreen();\r
+}\r
+\r
+\r