Fixing a bug I introduced into the "...ATEXIT" hack
[freeglut] / src / mswin / freeglut_window_mswin.c
index fe93985..d4c5fd7 100644 (file)
@@ -25,8 +25,9 @@
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
  */\r
 \r
+#define FREEGLUT_BUILDING_LIB\r
 #include <GL/freeglut.h>\r
-#include "freeglut_internal_mswin.h"\r
+#include "../Common/freeglut_internal.h"\r
 \r
 \r
 /* The following include file is available from SGI but is not standard:\r
@@ -90,6 +91,18 @@ extern int fghIsLegacyContextRequested( void );
 extern void fghContextCreationError( void );\r
 extern int fghNumberOfAuxBuffersRequested( void );\r
 \r
+#ifdef WM_TOUCH\r
+typedef BOOL (WINAPI *pRegisterTouchWindow)(HWND,ULONG);\r
+static pRegisterTouchWindow fghRegisterTouchWindow = (pRegisterTouchWindow)0xDEADBEEF;\r
+#endif\r
+\r
+/* \r
+ * Helper functions for getting client area from the window rect\r
+ * and the window rect from the client area given the style of the window\r
+ * (or a valid window pointer from which the style can be queried).\r
+ */\r
+extern void fghGetBorderWidth(const DWORD windowStyle, int* xBorderWidth, int* yBorderWidth);\r
+\r
 \r
 /*\r
  * Setup the pixel format for a Win32 window\r
@@ -157,9 +170,9 @@ void fgNewWGLCreateContext( SFG_Window* window )
         return;\r
     }\r
 \r
-    wglMakeCurrent( window->Window.Device, window->Window.Context );\r
+    wglMakeCurrent( window->Window.pContext.Device, window->Window.Context );\r
 \r
-    if ( !fghIsExtensionSupported( window->Window.Device, "WGL_ARB_create_context" ) )\r
+    if ( !fghIsExtensionSupported( window->Window.pContext.Device, "WGL_ARB_create_context" ) )\r
     {\r
         return;\r
     }\r
@@ -173,7 +186,7 @@ void fgNewWGLCreateContext( SFG_Window* window )
         fgError( "wglCreateContextAttribsARB not found" );\r
     }\r
 \r
-    context = wglCreateContextAttribsARB( window->Window.Device, 0, attributes );\r
+    context = wglCreateContextAttribsARB( window->Window.pContext.Device, 0, attributes );\r
     if ( context == NULL )\r
     {\r
         fghContextCreationError();\r
@@ -284,7 +297,7 @@ GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,
     if (checkOnly)\r
       current_hDC = CreateDC(TEXT("DISPLAY"), NULL ,NULL ,NULL);\r
     else\r
-      current_hDC = window->Window.Device;\r
+      current_hDC = window->Window.pContext.Device;\r
 \r
     fghFillPFD( ppfd, current_hDC, layer_type );\r
     pixelformat = ChoosePixelFormat( current_hDC, ppfd );\r
@@ -301,12 +314,12 @@ GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,
         /* create a dummy window */\r
         ZeroMemory(&wndCls, sizeof(wndCls));\r
         wndCls.lpfnWndProc = DefWindowProc;\r
-        wndCls.hInstance = fgDisplay.Instance;\r
+        wndCls.hInstance = fgDisplay.pDisplay.Instance;\r
         wndCls.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;\r
         wndCls.lpszClassName = _T("FREEGLUT_dummy");\r
         RegisterClass( &wndCls );\r
 \r
-        hWnd=CreateWindow(_T("FREEGLUT_dummy"), _T(""), WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW , 0,0,0,0, 0, 0, fgDisplay.Instance, 0 );\r
+        hWnd=CreateWindow(_T("FREEGLUT_dummy"), _T(""), WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW , 0,0,0,0, 0, 0, fgDisplay.pDisplay.Instance, 0 );\r
         hDC=GetDC(hWnd);\r
         SetPixelFormat( hDC, pixelformat, ppfd );\r
 \r
@@ -338,7 +351,7 @@ GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,
         wglDeleteContext(rc);\r
         ReleaseDC(hWnd, hDC);\r
         DestroyWindow(hWnd);\r
-        UnregisterClass(_T("FREEGLUT_dummy"), fgDisplay.Instance);\r
+        UnregisterClass(_T("FREEGLUT_dummy"), fgDisplay.pDisplay.Instance);\r
     }\r
 \r
     success = ( pixelformat != 0 ) && ( checkOnly || SetPixelFormat( current_hDC, pixelformat, ppfd ) );\r
@@ -358,13 +371,13 @@ void fgPlatformSetWindow ( SFG_Window *window )
     {\r
         if( fgStructure.CurrentWindow )\r
             ReleaseDC( fgStructure.CurrentWindow->Window.Handle,\r
-                       fgStructure.CurrentWindow->Window.Device );\r
+                       fgStructure.CurrentWindow->Window.pContext.Device );\r
 \r
         if ( window )\r
         {\r
-            window->Window.Device = GetDC( window->Window.Handle );\r
+            window->Window.pContext.Device = GetDC( window->Window.Handle );\r
             wglMakeCurrent(\r
-                window->Window.Device,\r
+                window->Window.pContext.Device,\r
                 window->Window.Context\r
             );\r
         }\r
@@ -559,7 +572,7 @@ static BOOL CALLBACK m_proc(HMONITOR mon,
 \r
 /* \r
  * this function returns the origin of the screen identified by\r
- * fgDisplay.DisplayName, and 0 otherwise.\r
+ * fgDisplay.pDisplay.DisplayName, and 0 otherwise.\r
  * This is used in fgOpenWindow to open the gamemode window on the screen\r
  * identified by the -display command line argument. The function should\r
  * not be called otherwise.\r
@@ -570,12 +583,12 @@ static void get_display_origin(int *xp,int *yp)
     *xp = 0;\r
     *yp = 0;\r
 \r
-    if( fgDisplay.DisplayName )\r
+    if( fgDisplay.pDisplay.DisplayName )\r
     {\r
         m_proc_t st;\r
         st.x=xp;\r
         st.y=yp;\r
-        st.name=fgDisplay.DisplayName;\r
+        st.name=fgDisplay.pDisplay.DisplayName;\r
         EnumDisplayMonitors(0,0,m_proc,(LPARAM)&st);\r
     }\r
 }\r
@@ -587,7 +600,7 @@ static void get_display_origin(int *xp,int *yp)
     *xp = 0;\r
     *yp = 0;\r
 \r
-    if( fgDisplay.DisplayName )\r
+    if( fgDisplay.pDisplay.DisplayName )\r
     {\r
         fgWarning( "for working -display support FreeGLUT must be compiled with WINVER >= 0x0500");\r
     }\r
@@ -612,7 +625,7 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
     ATOM atom;\r
 \r
     /* Grab the window class we have registered on glutInit(): */\r
-    atom = GetClassInfo( fgDisplay.Instance, _T("FREEGLUT"), &wc );\r
+    atom = GetClassInfo( fgDisplay.pDisplay.Instance, _T("FREEGLUT"), &wc );\r
     FREEGLUT_INTERNAL_ERROR_EXIT ( atom, "Window Class Info Not Found",\r
                                    "fgOpenWindow" );\r
 \r
@@ -736,7 +749,7 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
             0,0, 240,320,\r
             NULL,\r
             NULL,\r
-            fgDisplay.Instance,\r
+            fgDisplay.pDisplay.Instance,\r
             (LPVOID) window\r
         );\r
 \r
@@ -758,7 +771,7 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
         x, y, w, h,\r
         (HWND) window->Parent == NULL ? NULL : window->Parent->Window.Handle,\r
         (HMENU) NULL,\r
-        fgDisplay.Instance,\r
+        fgDisplay.pDisplay.Instance,\r
         (LPVOID) window\r
     );\r
 #endif /* defined(_WIN32_WCE) */\r
@@ -966,10 +979,10 @@ void fgPlatformGlutFullScreen( SFG_Window *win )
 \r
         \r
         /* store current window rect */\r
-        GetWindowRect( win->Window.Handle, &win->State.OldRect );\r
+        GetWindowRect( win->Window.Handle, &win->State.pWState.OldRect );\r
 \r
         /* store current window style */\r
-        win->State.OldStyle = s = GetWindowLong(win->Window.Handle, GWL_STYLE);\r
+        win->State.pWState.OldStyle = s = GetWindowLong(win->Window.Handle, GWL_STYLE);\r
 \r
         /* remove decorations from style and add popup style*/\r
         s &= ~WS_OVERLAPPEDWINDOW;\r
@@ -980,7 +993,7 @@ void fgPlatformGlutFullScreen( SFG_Window *win )
         /* 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
+        hMonitor= MonitorFromRect(&win->State.pWState.OldRect, MONITOR_DEFAULTTONEAREST);\r
         mi.cbSize = sizeof(mi);\r
         GetMonitorInfo(hMonitor, &mi);\r
         rect = mi.rcMonitor;\r
@@ -1036,16 +1049,16 @@ void fgPlatformGlutLeaveFullScreen( SFG_Window *win )
     }\r
 \r
     /* restore style of window before making it fullscreen */\r
-    SetWindowLong(win->Window.Handle, GWL_STYLE, win->State.OldStyle);\r
+    SetWindowLong(win->Window.Handle, GWL_STYLE, win->State.pWState.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
+        win->State.pWState.OldRect.left,\r
+        win->State.pWState.OldRect.top,\r
+        win->State.pWState.OldRect.right  - win->State.pWState.OldRect.left,\r
+        win->State.pWState.OldRect.bottom - win->State.pWState.OldRect.top,\r
         SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING |\r
         SWP_NOZORDER\r
         );\r
@@ -1066,3 +1079,11 @@ void fgPlatformGlutFullScreenToggle( SFG_Window *win )
 }\r
 \r
 \r
+/* -- PLATFORM-SPECIFIC INTERFACE FUNCTION -------------------------------------------------- */\r
+\r
+int FGAPIENTRY __glutCreateWindowWithExit( const char *title, void (__cdecl *exit_function)(int) )\r
+{\r
+  __glutExitFunc = exit_function;\r
+  return glutCreateWindow( title );\r
+}\r
+\r