Removing the "atexit ( fgDeinitialize )" call from the Windows code per e-mail trail...
[freeglut] / src / freeglut_internal.h
index 79cb404..540f75f 100644 (file)
 /* XXX: Don't all MS-Windows compilers (except Cygwin) have _WIN32 defined?
  * XXX: If so, remove the first set of defined()'s below.
  */
-#if !defined(TARGET_HOST_POSIX_X11) && !defined(TARGET_HOST_MS_WINDOWS) && !defined(TARGET_HOST_MAC_OSX)
+#if !defined(TARGET_HOST_POSIX_X11) && !defined(TARGET_HOST_MS_WINDOWS) && !defined(TARGET_HOST_MAC_OSX) && !defined(TARGET_HOST_SOLARIS)
 #if defined(_MSC_VER) || defined(__WATCOMC__) || defined(__MINGW32__) \
     || defined(_WIN32) || defined(_WIN32_WCE) \
     || ( defined(__CYGWIN__) && defined(X_DISPLAY_MISSING) )
 #   define  TARGET_HOST_MS_WINDOWS 1
 
-#elif defined(__posix__) || defined(__unix__) || defined(__linux__)
+#elif defined(__posix__) || defined(__unix__) || defined(__linux__) || defined(__sun)
 #   define  TARGET_HOST_POSIX_X11  1
 
 #elif defined(__APPLE__)
 
 /* -- PLATFORM-SPECIFIC INCLUDES ------------------------------------------- */
 
-/* All Win32 headers depend on the huge Windows.h recursive include.
- * Note: Let's use proper case for MS-Win headers. Even though it's
- * not required due to case insensitivity, it's a good habit to keep
- * because the cross-platform includes are case sensitive.
+/* All Win32 headers depend on the huge windows.h recursive include.
+ * Note: Lower-case header names are used, for best cross-platform
+ * compatibility.
  */
 #if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)
-#    include <Windows.h>
-#    include <WindowsX.h>
-#    include <MMSystem.h>
+#    include <windows.h>
+#    include <windowsx.h>
+#    include <mmsystem.h>
 /* CYGWIN does not have tchar.h, but has TEXT(x), defined in winnt.h. */
 #    ifndef __CYGWIN__
 #      include <tchar.h>
 #    include <X11/Xatom.h>
 #    include <X11/keysym.h>
 #    include <X11/extensions/XInput.h>
-#    ifdef HAVE_XXF86VM
+#    ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H
 #        include <X11/extensions/xf86vmode.h>
 #    endif
+#    ifdef HAVE_X11_EXTENSIONS_XRANDR_H
+#        include <X11/extensions/Xrandr.h>
+#    endif
 /* If GLX is too old, we will fail during runtime when multisampling
    is requested, but at least freeglut compiles. */
 #    ifndef GLX_SAMPLE_BUFFERS
 #include <string.h>
 #include <math.h>
 #include <stdlib.h>
+#include <stdarg.h>
 
 /* These are included based on autoconf directives. */
 #ifdef HAVE_SYS_TYPES_H
 #    endif
 #endif
 
+#if TARGET_HOST_MS_WINDOWS
+#    define  HAVE_VFPRINTF 1
+#endif
+
 /* MinGW may lack a prototype for ChangeDisplaySettingsEx() (depending on the version?) */
 #if TARGET_HOST_MS_WINDOWS && !defined(ChangeDisplaySettingsEx)
 LONG WINAPI ChangeDisplaySettingsExA(LPCSTR,LPDEVMODEA,HWND,DWORD,LPVOID);
@@ -231,6 +238,11 @@ typedef void (* FGCBTabletMotion  )( int, int );
 typedef void (* FGCBTabletButton  )( int, int, int, int );
 typedef void (* FGCBDestroy       )( void );
 
+typedef void (* FGCBMultiEntry   )( int, int );
+typedef void (* FGCBMultiButton  )( int, int, int, int, int );
+typedef void (* FGCBMultiMotion  )( int, int, int );
+typedef void (* FGCBMultiPassive )( int, int, int );
+
 /* The global callbacks type definitions */
 typedef void (* FGCBIdle          )( void );
 typedef void (* FGCBTimer         )( int );
@@ -240,6 +252,10 @@ typedef void (* FGCBMenuStatus    )( int, int, int );
 /* The callback used when creating/using menus */
 typedef void (* FGCBMenu          )( int );
 
+/* The FreeGLUT error/warning handler type definition */
+typedef void (* FGError           ) ( const char *fmt, va_list ap);
+typedef void (* FGWarning         ) ( const char *fmt, va_list ap);
+
 
 /* A list structure */
 typedef struct tagSFG_List SFG_List;
@@ -323,6 +339,8 @@ struct tagSFG_State
     int              NumActiveJoysticks;    /* Number of active joysticks -- if zero, don't poll joysticks */
     GLboolean        InputDevsInitialised;  /* Only initialize if application calls for them */
 
+       int              MouseWheelTicks;      /* Number of ticks the mouse wheel has turned */
+
     int              AuxiliaryBufferNumber;  /* Number of auxiliary buffers */
     int              SampleNumber;         /*  Number of samples per pixel  */
 
@@ -330,6 +348,8 @@ struct tagSFG_State
     int              MinorVersion;         /* Minor OpenGL context version  */
     int              ContextFlags;         /* OpenGL context flags          */
     int              ContextProfile;       /* OpenGL context profile        */
+    FGError          ErrorFunc;            /* User defined error handler    */
+    FGWarning        WarningFunc;          /* User defined warning handler  */
 };
 
 /* The structure used by display initialization in freeglut_init.c */
@@ -345,7 +365,13 @@ struct tagSFG_Display
     Atom            State;              /* The state atom                    */
     Atom            StateFullScreen;    /* The full screen atom              */
 
-#ifdef X_XF86VidModeGetModeLine
+#ifdef HAVE_X11_EXTENSIONS_XRANDR_H
+    int prev_xsz, prev_ysz;
+    int prev_refresh;
+    int prev_size_valid;
+#endif /* HAVE_X11_EXTENSIONS_XRANDR_H */
+
+#ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H
     /*
      * XF86VidMode may be compilable even if it fails at runtime.  Therefore,
      * the validity of the VidMode has to be tracked
@@ -355,14 +381,15 @@ struct tagSFG_Display
     int             DisplayModeClock;   /* The display mode's refresh rate   */
     int             DisplayViewPortX;   /* saved X location of the viewport  */
     int             DisplayViewPortY;   /* saved Y location of the viewport  */
+#endif /* HAVE_X11_EXTENSIONS_XF86VMODE_H */
+
     int             DisplayPointerX;    /* saved X location of the pointer   */
     int             DisplayPointerY;    /* saved Y location of the pointer   */
 
-#endif /* X_XF86VidModeGetModeLine */
-
 #elif TARGET_HOST_MS_WINDOWS
-    HINSTANCE        Instance;          /* The application's instance        */
+    HINSTANCE       Instance;           /* The application's instance        */
     DEVMODE         DisplayMode;        /* Desktop's display settings        */
+    char           *DisplayName;        /* Display name for multi display support*/ 
 
 #endif
 
@@ -422,10 +449,16 @@ struct tagSFG_Context
 typedef struct tagSFG_WindowState SFG_WindowState;
 struct tagSFG_WindowState
 {
+    /* Note that on Windows, sizes always refer to the client area, thus without the window decorations */
     int             Width;              /* Window's width in pixels          */
     int             Height;             /* The same about the height         */
+#if TARGET_HOST_POSIX_X11
     int             OldWidth;           /* Window width from before a resize */
     int             OldHeight;          /*   "    height  "    "    "   "    */
+#elif TARGET_HOST_MS_WINDOWS
+    RECT            OldRect;            /* window rect - stored before the window is made fullscreen */
+    DWORD           OldStyle;           /* window style - stored before the window is made fullscreen */
+#endif
 
     GLboolean       Redisplay;          /* Do we have to redisplay?          */
     GLboolean       Visible;            /* Is the window visible now         */
@@ -568,6 +601,12 @@ enum
     CB_Joystick,
     CB_Destroy,
 
+    /* MPX-related */
+    CB_MultiEntry,
+    CB_MultiButton,
+    CB_MultiMotion,
+    CB_MultiPassive,
+
     /* Presently ignored */
     CB_Select,
     CB_OverlayDisplay,
@@ -790,11 +829,12 @@ extern SFG_State fgState;
  * A call to those macros assures us that there is a current
  * window set, respectively:
  */
-#define  FREEGLUT_EXIT_IF_NO_WINDOW( string )                   \
-  if ( ! fgStructure.CurrentWindow )                            \
-  {                                                             \
-    fgError ( " ERROR:  Function <%s> called"                   \
-              " with no current window defined.", (string) ) ;  \
+#define  FREEGLUT_EXIT_IF_NO_WINDOW( string )                               \
+  if ( ! fgStructure.CurrentWindow &&                                       \
+       ( fgState.ActionOnWindowClose != GLUT_ACTION_CONTINUE_EXECUTION ) )  \
+  {                                                                         \
+    fgError ( " ERROR:  Function <%s> called"                               \
+              " with no current window defined.", (string) ) ;              \
   }
 
 /*
@@ -814,7 +854,7 @@ void fgDestroyStructure( void );
 
 /* A helper function to check if a display mode is possible to use */
 #if TARGET_HOST_POSIX_X11
-GLXFBConfig* fgChooseFBConfig( void );
+GLXFBConfig* fgChooseFBConfig( int* numcfgs );
 #endif
 
 /* The window procedure for Win32 events handling */
@@ -892,6 +932,19 @@ void fgEnumWindows( FGCBenumerator enumCallback, SFG_Enumerator* enumerator );
 void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback,
                        SFG_Enumerator* enumerator );
 
+#if TARGET_HOST_MS_WINDOWS
+/* 
+ * Helper functions for getting client area from the window rect
+ * and the window rect from the client area given the style of the window
+ * (or a valid window pointer from which the style can be queried).
+ */
+void fghComputeWindowRectFromClientArea_UseStyle   ( const DWORD windowStyle , RECT *clientRect, BOOL posIsOutside );
+void fghComputeWindowRectFromClientArea_QueryWindow( const SFG_Window *window, RECT *clientRect, BOOL posIsOutside );
+void fghComputeClientAreaFromWindowRect            ( const SFG_Window *window, RECT *windowRect, BOOL wantPosOutside );
+RECT fghGetClientArea                              ( const SFG_Window *window,                   BOOL wantPosOutside );
+void fghGetBorderWidth(const DWORD windowStyle, int* xBorderWidth, int* yBorderWidth);
+#endif
+
 /*
  * fgWindowByHandle returns a (SFG_Window *) value pointing to the
  * first window in the queue matching the specified window handle.
@@ -950,6 +1003,13 @@ void fgWarning( const char *fmt, ... );
  */
 #if TARGET_HOST_POSIX_X11
 int fgHintPresent(Window window, Atom property, Atom hint);
+
+/* Handler for X extension Events */
+#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H
+  void fgHandleExtensionEvents( XEvent * ev );
+  void fgRegisterDevices( Display* dpy, Window* win );
+#endif
+
 #endif
 
 SFG_Proc fghGetProcAddress( const char *procName );