Moving the platform-specific window state fields into their own substructure
[freeglut] / src / Common / freeglut_internal.h
index cacb55b..ebd9340 100644 (file)
 \r
 /* -- PLATFORM-SPECIFIC INCLUDES ------------------------------------------- */\r
 \r
-/* All Win32 headers depend on the huge windows.h recursive include.\r
- * Note: Lower-case header names are used, for best cross-platform\r
- * compatibility.\r
- */\r
-#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)\r
-#    include <windows.h>\r
-#    include <windowsx.h>\r
-#    include <mmsystem.h>\r
-/* CYGWIN does not have tchar.h, but has TEXT(x), defined in winnt.h. */\r
-#    ifndef __CYGWIN__\r
-#      include <tchar.h>\r
-#    else\r
-#      define _TEXT(x) TEXT(x)\r
-#      define _T(x)    TEXT(x)\r
-#    endif\r
-\r
-#elif TARGET_HOST_POSIX_X11\r
+#if TARGET_HOST_POSIX_X11\r
 #    include <GL/glx.h>\r
 #    include <X11/Xlib.h>\r
 #    include <X11/Xatom.h>\r
 #    endif\r
 #endif\r
 \r
-#if TARGET_HOST_MS_WINDOWS\r
-#    define  HAVE_VFPRINTF 1\r
-#endif\r
-\r
-/* MinGW may lack a prototype for ChangeDisplaySettingsEx() (depending on the version?) */\r
-#if TARGET_HOST_MS_WINDOWS && !defined(ChangeDisplaySettingsEx)\r
-LONG WINAPI ChangeDisplaySettingsExA(LPCSTR,LPDEVMODEA,HWND,DWORD,LPVOID);\r
-LONG WINAPI ChangeDisplaySettingsExW(LPCWSTR,LPDEVMODEW,HWND,DWORD,LPVOID);\r
-#    ifdef UNICODE\r
-#        define ChangeDisplaySettingsEx ChangeDisplaySettingsExW\r
-#    else\r
-#        define ChangeDisplaySettingsEx ChangeDisplaySettingsExA\r
-#    endif\r
-#endif\r
-\r
 #if defined(_MSC_VER) || defined(__WATCOMC__)\r
 /* strdup() is non-standard, for all but POSIX-2001 */\r
 #define strdup   _strdup\r
@@ -210,6 +179,65 @@ LONG WINAPI ChangeDisplaySettingsExW(LPCWSTR,LPDEVMODEW,HWND,DWORD,LPVOID);
 \r
 #define INVALID_MODIFIERS 0xffffffff\r
 \r
+\r
+\r
+/* Platform-specific includes */\r
+#if TARGET_HOST_POSIX_X11\r
+\r
+typedef struct tagSFG_PlatformDisplay SFG_PlatformDisplay;\r
+struct tagSFG_PlatformDisplay\r
+{\r
+    Display*        Display;            /* The display we are being run in.  */\r
+    int             Screen;             /* The screen we are about to use.   */\r
+    Window          RootWindow;         /* The screen's root window.         */\r
+    int             Connection;         /* The display's connection number   */\r
+    Atom            DeleteWindow;       /* The window deletion atom          */\r
+    Atom            State;              /* The state atom                    */\r
+    Atom            StateFullScreen;    /* The full screen atom              */\r
+\r
+#ifdef HAVE_X11_EXTENSIONS_XRANDR_H\r
+    int prev_xsz, prev_ysz;\r
+    int prev_refresh;\r
+    int prev_size_valid;\r
+#endif /* HAVE_X11_EXTENSIONS_XRANDR_H */\r
+\r
+#ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H\r
+    /*\r
+     * XF86VidMode may be compilable even if it fails at runtime.  Therefore,\r
+     * the validity of the VidMode has to be tracked\r
+     */\r
+    int             DisplayModeValid;   /* Flag that indicates runtime status*/\r
+    XF86VidModeModeLine DisplayMode;    /* Current screen's display settings */\r
+    int             DisplayModeClock;   /* The display mode's refresh rate   */\r
+    int             DisplayViewPortX;   /* saved X location of the viewport  */\r
+    int             DisplayViewPortY;   /* saved Y location of the viewport  */\r
+#endif /* HAVE_X11_EXTENSIONS_XF86VMODE_H */\r
+\r
+    int             DisplayPointerX;    /* saved X location of the pointer   */\r
+    int             DisplayPointerY;    /* saved Y location of the pointer   */\r
+};\r
+\r
+\r
+/*\r
+ * Make "freeglut" window handle and context types so that we don't need so\r
+ * much conditionally-compiled code later in the library.\r
+ */\r
+typedef Window     SFG_WindowHandleType ;\r
+typedef GLXContext SFG_WindowContextType ;\r
+typedef struct tagSFG_PlatformContext SFG_PlatformContext;\r
+struct tagSFG_PlatformContext\r
+{\r
+    GLXFBConfig*    FBConfig;        /* The window's FBConfig               */\r
+};\r
+\r
+\r
+\r
+#endif\r
+#if TARGET_HOST_MS_WINDOWS\r
+#include "../mswin/freeglut_internal_mswin.h"\r
+#endif\r
+\r
+\r
 /* -- GLOBAL TYPE DEFINITIONS ---------------------------------------------- */\r
 \r
 /* Freeglut callbacks type definitions */\r
@@ -356,42 +384,7 @@ struct tagSFG_State
 typedef struct tagSFG_Display SFG_Display;\r
 struct tagSFG_Display\r
 {\r
-#if TARGET_HOST_POSIX_X11\r
-    Display*        Display;            /* The display we are being run in.  */\r
-    int             Screen;             /* The screen we are about to use.   */\r
-    Window          RootWindow;         /* The screen's root window.         */\r
-    int             Connection;         /* The display's connection number   */\r
-    Atom            DeleteWindow;       /* The window deletion atom          */\r
-    Atom            State;              /* The state atom                    */\r
-    Atom            StateFullScreen;    /* The full screen atom              */\r
-\r
-#ifdef HAVE_X11_EXTENSIONS_XRANDR_H\r
-    int prev_xsz, prev_ysz;\r
-    int prev_refresh;\r
-    int prev_size_valid;\r
-#endif /* HAVE_X11_EXTENSIONS_XRANDR_H */\r
-\r
-#ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H\r
-    /*\r
-     * XF86VidMode may be compilable even if it fails at runtime.  Therefore,\r
-     * the validity of the VidMode has to be tracked\r
-     */\r
-    int             DisplayModeValid;   /* Flag that indicates runtime status*/\r
-    XF86VidModeModeLine DisplayMode;    /* Current screen's display settings */\r
-    int             DisplayModeClock;   /* The display mode's refresh rate   */\r
-    int             DisplayViewPortX;   /* saved X location of the viewport  */\r
-    int             DisplayViewPortY;   /* saved Y location of the viewport  */\r
-#endif /* HAVE_X11_EXTENSIONS_XF86VMODE_H */\r
-\r
-    int             DisplayPointerX;    /* saved X location of the pointer   */\r
-    int             DisplayPointerY;    /* saved Y location of the pointer   */\r
-\r
-#elif TARGET_HOST_MS_WINDOWS\r
-    HINSTANCE       Instance;           /* The application's instance        */\r
-    DEVMODE         DisplayMode;        /* Desktop's display settings        */\r
-    char           *DisplayName;        /* Display name for multi display support*/ \r
-\r
-#endif\r
+       SFG_PlatformDisplay pDisplay;\r
 \r
     int             ScreenWidth;        /* The screen's width in pixels      */\r
     int             ScreenHeight;       /* The screen's height in pixels     */\r
@@ -411,22 +404,6 @@ struct tagSFG_Timer
 };\r
 \r
 /*\r
- * Make "freeglut" window handle and context types so that we don't need so\r
- * much conditionally-compiled code later in the library.\r
- */\r
-#if TARGET_HOST_POSIX_X11\r
-\r
-typedef Window     SFG_WindowHandleType ;\r
-typedef GLXContext SFG_WindowContextType ;\r
-\r
-#elif TARGET_HOST_MS_WINDOWS\r
-\r
-typedef HWND    SFG_WindowHandleType ;\r
-typedef HGLRC   SFG_WindowContextType ;\r
-\r
-#endif\r
-\r
-/*\r
  * A window and its OpenGL context. The contents of this structure\r
  * are highly dependant on the target operating system we aim at...\r
  */\r
@@ -436,29 +413,30 @@ struct tagSFG_Context
     SFG_WindowHandleType  Handle;    /* The window's handle                 */\r
     SFG_WindowContextType Context;   /* The window's OpenGL/WGL context     */\r
 \r
-#if TARGET_HOST_POSIX_X11\r
-    GLXFBConfig*    FBConfig;        /* The window's FBConfig               */\r
-#elif TARGET_HOST_MS_WINDOWS\r
-    HDC             Device;          /* The window's device context         */\r
-#endif\r
+       SFG_PlatformContext pContext;    /* The window's FBConfig (X11) or device context (Windows) */\r
 \r
     int             DoubleBuffered;  /* Treat the window as double-buffered */\r
 };\r
 \r
 /* Window's state description. This structure should be kept portable. */\r
+#if TARGET_HOST_POSIX_X11\r
+typedef struct tagSFG_PlatformWindowState SFG_PlatformWindowState;\r
+struct tagSFG_PlatformWindowState\r
+{\r
+    int             OldWidth;           /* Window width from before a resize */\r
+    int             OldHeight;          /*   "    height  "    "    "   "    */\r
+};\r
+#endif\r
+\r
+\r
 typedef struct tagSFG_WindowState SFG_WindowState;\r
 struct tagSFG_WindowState\r
 {\r
     /* Note that on Windows, sizes always refer to the client area, thus without the window decorations */\r
     int             Width;              /* Window's width in pixels          */\r
     int             Height;             /* The same about the height         */\r
-#if TARGET_HOST_POSIX_X11\r
-    int             OldWidth;           /* Window width from before a resize */\r
-    int             OldHeight;          /*   "    height  "    "    "   "    */\r
-#elif TARGET_HOST_MS_WINDOWS\r
-    RECT            OldRect;            /* window rect - stored before the window is made fullscreen */\r
-    DWORD           OldStyle;           /* window style - stored before the window is made fullscreen */\r
-#endif\r
+\r
+       SFG_PlatformWindowState pWState;    /* Window width/height (X11) or rectangle/style (Windows) from before a resize */\r
 \r
     GLboolean       Redisplay;          /* Do we have to redisplay?          */\r
     GLboolean       Visible;            /* Is the window visible now         */\r
@@ -775,6 +753,86 @@ struct tagSFG_StrokeFont
     const SFG_StrokeChar** Characters;          /* The characters mapping    */\r
 };\r
 \r
+\r
+/* -- JOYSTICK-SPECIFIC STRUCTURES AND TYPES ------------------------------- */\r
+/* XXX It might be better to poll the operating system for the numbers of buttons and\r
+ * XXX axes and then dynamically allocate the arrays.\r
+ */\r
+#define _JS_MAX_BUTTONS 32\r
+\r
+#if TARGET_HOST_MACINTOSH\r
+#    define _JS_MAX_AXES  9\r
+typedef struct tagSFG_PlatformJoystick SFG_PlatformJoystick;\r
+struct tagSFG_PlatformJoystick\r
+{\r
+#define  ISP_NUM_AXIS    9\r
+#define  ISP_NUM_NEEDS  41\r
+    ISpElementReference isp_elem  [ ISP_NUM_NEEDS ];\r
+    ISpNeed             isp_needs [ ISP_NUM_NEEDS ];\r
+};\r
+#endif\r
+\r
+#if TARGET_HOST_MAC_OSX\r
+#    define _JS_MAX_AXES 16\r
+typedef struct tagSFG_PlatformJoystick SFG_PlatformJoystick;\r
+struct tagSFG_PlatformJoystick\r
+{\r
+    IOHIDDeviceInterface ** hidDev;\r
+    IOHIDElementCookie buttonCookies[41];\r
+    IOHIDElementCookie axisCookies[_JS_MAX_AXES];\r
+/* The next two variables are not used anywhere */\r
+/*    long minReport[_JS_MAX_AXES],\r
+ *         maxReport[_JS_MAX_AXES];\r
+ */\r
+};\r
+#endif\r
+\r
+#if TARGET_HOST_POSIX_X11\r
+#    define _JS_MAX_AXES 16\r
+typedef struct tagSFG_PlatformJoystick SFG_PlatformJoystick;\r
+struct tagSFG_PlatformJoystick\r
+{\r
+#   if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)\r
+       struct os_specific_s *os;\r
+#   endif\r
+\r
+#   ifdef JS_NEW\r
+       struct js_event     js;\r
+       int          tmp_buttons;\r
+       float        tmp_axes [ _JS_MAX_AXES ];\r
+#   else\r
+       struct JS_DATA_TYPE js;\r
+#   endif\r
+\r
+    char         fname [ 128 ];\r
+    int          fd;\r
+};\r
+#endif\r
+\r
+/*\r
+ * Definition of "SFG_Joystick" structure -- based on JS's "jsJoystick" object class.\r
+ * See "js.h" lines 80-178.\r
+ */\r
+typedef struct tagSFG_Joystick SFG_Joystick;\r
+struct tagSFG_Joystick\r
+{\r
+       SFG_PlatformJoystick pJoystick;\r
+\r
+    int          id;\r
+    GLboolean    error;\r
+    char         name [ 128 ];\r
+    int          num_axes;\r
+    int          num_buttons;\r
+\r
+    float dead_band[ _JS_MAX_AXES ];\r
+    float saturate [ _JS_MAX_AXES ];\r
+    float center   [ _JS_MAX_AXES ];\r
+    float max      [ _JS_MAX_AXES ];\r
+    float min      [ _JS_MAX_AXES ];\r
+};\r
+\r
+\r
+\r
 /* -- GLOBAL VARIABLES EXPORTS --------------------------------------------- */\r
 \r
 /* Freeglut display related stuff (initialized once per session) */\r
@@ -852,20 +910,6 @@ void fgDeinitialize( void );
 void fgCreateStructure( void );\r
 void fgDestroyStructure( void );\r
 \r
-/* A helper function to check if a display mode is possible to use */\r
-#if TARGET_HOST_POSIX_X11\r
-GLXFBConfig* fgChooseFBConfig( int* numcfgs );\r
-#endif\r
-\r
-/* The window procedure for Win32 events handling */\r
-#if TARGET_HOST_MS_WINDOWS\r
-LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg,\r
-                               WPARAM wParam, LPARAM lParam );\r
-void fgNewWGLCreateContext( SFG_Window* window );\r
-GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,\r
-                              unsigned char layer_type );\r
-#endif\r
-\r
 /*\r
  * Window creation, opening, closing and destruction.\r
  * Also CallBack clearing/initialization.\r
@@ -932,19 +976,6 @@ void fgEnumWindows( FGCBenumerator enumCallback, SFG_Enumerator* enumerator );
 void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback,\r
                        SFG_Enumerator* enumerator );\r
 \r
-#if TARGET_HOST_MS_WINDOWS\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
-void fghComputeWindowRectFromClientArea_UseStyle   ( const DWORD windowStyle , RECT *clientRect, BOOL posIsOutside );\r
-void fghComputeWindowRectFromClientArea_QueryWindow( const SFG_Window *window, RECT *clientRect, BOOL posIsOutside );\r
-void fghComputeClientAreaFromWindowRect            ( const SFG_Window *window, RECT *windowRect, BOOL wantPosOutside );\r
-RECT fghGetClientArea                              ( const SFG_Window *window,                   BOOL wantPosOutside );\r
-void fghGetBorderWidth(const DWORD windowStyle, int* xBorderWidth, int* yBorderWidth);\r
-#endif\r
-\r
 /*\r
  * fgWindowByHandle returns a (SFG_Window *) value pointing to the\r
  * first window in the queue matching the specified window handle.\r
@@ -1014,10 +1045,6 @@ int fgHintPresent(Window window, Atom property, Atom hint);
 \r
 SFG_Proc fghGetProcAddress( const char *procName );\r
 \r
-#if TARGET_HOST_MS_WINDOWS\r
-extern void (__cdecl *__glutExitFunc)( int return_value );\r
-#endif\r
-\r
 #endif /* FREEGLUT_INTERNAL_H */\r
 \r
 /*** END OF FILE ***/\r