\r
/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */\r
\r
+extern void fghInitialize( const char* displayName );\r
+extern void fghDeinitialiseInputDevices ( void );\r
+extern void fghCloseDisplay ( void );\r
+\r
#if TARGET_HOST_POSIX_X11\r
\r
/* Return the atom associated with "name". */\r
#endif /* TARGET_HOST_POSIX_X11 */\r
\r
\r
+#if TARGET_HOST_POSIX_X11\r
/*\r
* A call to this function should initialize all the display stuff...\r
*/\r
static void fghInitialize( const char* displayName )\r
{\r
-#if TARGET_HOST_POSIX_X11\r
fgDisplay.Display = XOpenDisplay( displayName );\r
\r
if( fgDisplay.Display == NULL )\r
}\r
}\r
\r
-#elif TARGET_HOST_MS_WINDOWS\r
\r
- WNDCLASS wc;\r
- ATOM atom;\r
+ fgState.Initialised = GL_TRUE;\r
\r
- /* What we need to do is to initialize the fgDisplay global structure here. */\r
- fgDisplay.Instance = GetModuleHandle( NULL );\r
- fgDisplay.DisplayName= displayName ? strdup(displayName) : 0 ;\r
- atom = GetClassInfo( fgDisplay.Instance, _T("FREEGLUT"), &wc );\r
+ atexit(fgDeinitialize);\r
\r
- if( atom == 0 )\r
- {\r
- ZeroMemory( &wc, sizeof(WNDCLASS) );\r
-\r
- /*\r
- * Each of the windows should have its own device context, and we\r
- * want redraw events during Vertical and Horizontal Resizes by\r
- * the user.\r
- *\r
- * XXX Old code had "| CS_DBCLCKS" commented out. Plans for the\r
- * XXX future? Dead-end idea?\r
- */\r
- wc.lpfnWndProc = fgWindowProc;\r
- wc.cbClsExtra = 0;\r
- wc.cbWndExtra = 0;\r
- wc.hInstance = fgDisplay.Instance;\r
- wc.hIcon = LoadIcon( fgDisplay.Instance, _T("GLUT_ICON") );\r
-\r
-#if defined(_WIN32_WCE)\r
- wc.style = CS_HREDRAW | CS_VREDRAW;\r
-#else\r
- wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;\r
- if (!wc.hIcon)\r
- wc.hIcon = LoadIcon( NULL, IDI_WINLOGO );\r
-#endif\r
+ /* InputDevice uses GlutTimerFunc(), so fgState.Initialised must be TRUE */\r
+ fgInitialiseInputDevices();\r
+}\r
\r
- wc.hCursor = LoadCursor( NULL, IDC_ARROW );\r
- wc.hbrBackground = NULL;\r
- wc.lpszMenuName = NULL;\r
- wc.lpszClassName = _T("FREEGLUT");\r
+#endif\r
\r
- /* Register the window class */\r
- atom = RegisterClass( &wc );\r
- FREEGLUT_INTERNAL_ERROR_EXIT ( atom, "Window Class Not Registered", "fghInitialize" );\r
- }\r
+void fghCloseInputDevices ( void )\r
+{\r
+ if ( fgState.JoysticksInitialised )\r
+ fgJoystickClose( );\r
\r
- /* The screen dimensions can be obtained via GetSystemMetrics() calls */\r
- fgDisplay.ScreenWidth = GetSystemMetrics( SM_CXSCREEN );\r
- fgDisplay.ScreenHeight = GetSystemMetrics( SM_CYSCREEN );\r
+ if ( fgState.InputDevsInitialised )\r
+ fgInputDeviceClose( );\r
+}\r
\r
- {\r
- HWND desktop = GetDesktopWindow( );\r
- HDC context = GetDC( desktop );\r
\r
- fgDisplay.ScreenWidthMM = GetDeviceCaps( context, HORZSIZE );\r
- fgDisplay.ScreenHeightMM = GetDeviceCaps( context, VERTSIZE );\r
+#if TARGET_HOST_POSIX_X11\r
+static void fghDeinitialiseInputDevices ( void )\r
+{\r
+ fghCloseInputDevices ();\r
\r
- ReleaseDC( desktop, context );\r
- }\r
- /* If we have a DisplayName try to use it for metrics */\r
- if( fgDisplay.DisplayName )\r
- {\r
- HDC context = CreateDC(fgDisplay.DisplayName,0,0,0);\r
- if( context )\r
- {\r
- fgDisplay.ScreenWidth = GetDeviceCaps( context, HORZRES );\r
- fgDisplay.ScreenHeight = GetDeviceCaps( context, VERTRES );\r
- fgDisplay.ScreenWidthMM = GetDeviceCaps( context, HORZSIZE );\r
- fgDisplay.ScreenHeightMM = GetDeviceCaps( context, VERTSIZE );\r
- DeleteDC(context);\r
- }\r
- else\r
- fgWarning("fghInitialize: "\r
- "CreateDC failed, Screen size info may be incorrect\n"\r
- "This is quite likely caused by a bad '-display' parameter");\r
- \r
- }\r
- /* Set the timer granularity to 1 ms */\r
- timeBeginPeriod ( 1 );\r
+ fgState.JoysticksInitialised = GL_FALSE;\r
+ fgState.InputDevsInitialised = GL_FALSE;\r
+}\r
\r
-#endif\r
\r
- fgState.Initialised = GL_TRUE;\r
+static void fghCloseDisplay ( void )\r
+{\r
+ /*\r
+ * Make sure all X-client data we have created will be destroyed on\r
+ * display closing\r
+ */\r
+ XSetCloseDownMode( fgDisplay.Display, DestroyAll );\r
\r
- /* Avoid registering atexit callback on Win32 as it results in an access\r
- * violation due to calling into a module which has been unloaded.\r
- * Any cleanup isn't needed on Windows anyway, the OS takes care of it.c\r
- * see: http://blogs.msdn.com/b/oldnewthing/archive/2012/01/05/10253268.aspx\r
+ /*\r
+ * Close the display connection, destroying all windows we have\r
+ * created so far\r
*/\r
-#if ( TARGET_HOST_MS_WINDOWS == 0 )\r
- atexit(fgDeinitialize);\r
+ XCloseDisplay( fgDisplay.Display );\r
+}\r
+\r
#endif\r
\r
- /* InputDevice uses GlutTimerFunc(), so fgState.Initialised must be TRUE */\r
- fgInitialiseInputDevices();\r
-}\r
\r
/*\r
* Perform the freeglut deinitialization...\r
free( timer );\r
}\r
\r
-#if !defined(_WIN32_WCE)\r
- if ( fgState.JoysticksInitialised )\r
- fgJoystickClose( );\r
-\r
- if ( fgState.InputDevsInitialised )\r
- fgInputDeviceClose( );\r
-#endif /* !defined(_WIN32_WCE) */\r
- fgState.JoysticksInitialised = GL_FALSE;\r
- fgState.InputDevsInitialised = GL_FALSE;\r
+ fghDeinitialiseInputDevices ();\r
\r
fgState.MouseWheelTicks = 0;\r
\r
fgState.ProgramName = NULL;\r
}\r
\r
-#if TARGET_HOST_POSIX_X11\r
-\r
- /*\r
- * Make sure all X-client data we have created will be destroyed on\r
- * display closing\r
- */\r
- XSetCloseDownMode( fgDisplay.Display, DestroyAll );\r
-\r
- /*\r
- * Close the display connection, destroying all windows we have\r
- * created so far\r
- */\r
- XCloseDisplay( fgDisplay.Display );\r
-\r
-#elif TARGET_HOST_MS_WINDOWS\r
- if( fgDisplay.DisplayName )\r
- {\r
- free( fgDisplay.DisplayName );\r
- fgDisplay.DisplayName = NULL;\r
- }\r
-\r
- /* Reset the timer granularity */\r
- timeEndPeriod ( 1 );\r
-\r
-#endif\r
+ fghCloseDisplay ();\r
\r
fgState.Initialised = GL_FALSE;\r
}\r