+/*\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