X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2FCommon%2Ffreeglut_init.c;h=d8e87e05d8955e30c4ed96889aa89dbe461b1475;hb=fd07952449ad7b1fc6cfed569d23677f2b816e40;hp=31631f128b2268bd3c06badb117cd3074da09344;hpb=3e5e3f51c272a95dc877b781281880061690b935;p=freeglut diff --git a/src/Common/freeglut_init.c b/src/Common/freeglut_init.c index 31631f1..d8e87e0 100644 --- a/src/Common/freeglut_init.c +++ b/src/Common/freeglut_init.c @@ -29,10 +29,6 @@ #include #include "freeglut_internal.h" -#if TARGET_HOST_POSIX_X11 -#include /* LONG_MAX */ -#endif - /* * TODO BEFORE THE STABLE RELEASE: * @@ -103,224 +99,7 @@ SFG_State fgState = { { -1, -1, GL_FALSE }, /* Position */ extern void fgPlatformInitialize( const char* displayName ); extern void fgPlatformDeinitialiseInputDevices ( void ); extern void fgPlatformCloseDisplay ( void ); - -#if TARGET_HOST_POSIX_X11 - -/* Return the atom associated with "name". */ -static Atom fghGetAtom(const char * name) -{ - return XInternAtom(fgDisplay.Display, name, False); -} - -/* - * Check if "property" is set on "window". The property's values are returned - * through "data". If the property is set and is of type "type", return the - * number of elements in "data". Return zero otherwise. In both cases, use - * "Xfree()" to free "data". - */ -static int fghGetWindowProperty(Window window, - Atom property, - Atom type, - unsigned char ** data) -{ - /* - * Caller always has to use "Xfree()" to free "data", since - * "XGetWindowProperty() always allocates one extra byte in prop_return - * [i.e. "data"] (even if the property is zero length) [..]". - */ - - int status; /* Returned by "XGetWindowProperty". */ - - Atom type_returned; - int temp_format; /* Not used. */ - unsigned long number_of_elements; - unsigned long temp_bytes_after; /* Not used. */ - - - status = XGetWindowProperty(fgDisplay.Display, - window, - property, - 0, - LONG_MAX, - False, - type, - &type_returned, - &temp_format, - &number_of_elements, - &temp_bytes_after, - data); - - FREEGLUT_INTERNAL_ERROR_EXIT(status == Success, - "XGetWindowProperty failled", - "fghGetWindowProperty"); - - if (type_returned != type) - { - number_of_elements = 0; - } - - return number_of_elements; -} - -/* Check if the window manager is NET WM compliant. */ -static int fghNetWMSupported(void) -{ - Atom wm_check; - Window ** window_ptr_1; - - int number_of_windows; - int net_wm_supported; - - - net_wm_supported = 0; - - wm_check = fghGetAtom("_NET_SUPPORTING_WM_CHECK"); - window_ptr_1 = malloc(sizeof(Window *)); - - /* - * Check that the window manager has set this property on the root window. - * The property must be the ID of a child window. - */ - number_of_windows = fghGetWindowProperty(fgDisplay.RootWindow, - wm_check, - XA_WINDOW, - (unsigned char **) window_ptr_1); - if (number_of_windows == 1) - { - Window ** window_ptr_2; - - window_ptr_2 = malloc(sizeof(Window *)); - - /* Check that the window has the same property set to the same value. */ - number_of_windows = fghGetWindowProperty(**window_ptr_1, - wm_check, - XA_WINDOW, - (unsigned char **) window_ptr_2); - if ((number_of_windows == 1) && (**window_ptr_1 == **window_ptr_2)) - { - /* NET WM compliant */ - net_wm_supported = 1; - } - - XFree(*window_ptr_2); - free(window_ptr_2); - } - - XFree(*window_ptr_1); - free(window_ptr_1); - - return net_wm_supported; -} - -/* Check if "hint" is present in "property" for "window". */ -int fgHintPresent(Window window, Atom property, Atom hint) -{ - Atom *atoms; - int number_of_atoms; - int supported; - int i; - - supported = 0; - - number_of_atoms = fghGetWindowProperty(window, - property, - XA_ATOM, - (unsigned char **) &atoms); - for (i = 0; i < number_of_atoms; i++) - { - if (atoms[i] == hint) - { - supported = 1; - break; - } - } - - XFree(atoms); - return supported; -} - -#endif /* TARGET_HOST_POSIX_X11 */ - - -#if TARGET_HOST_POSIX_X11 -/* - * A call to this function should initialize all the display stuff... - */ -static void fgPlatformInitialize( const char* displayName ) -{ - fgDisplay.Display = XOpenDisplay( displayName ); - - if( fgDisplay.Display == NULL ) - fgError( "failed to open display '%s'", XDisplayName( displayName ) ); - - if( !glXQueryExtension( fgDisplay.Display, NULL, NULL ) ) - fgError( "OpenGL GLX extension not supported by display '%s'", - XDisplayName( displayName ) ); - - fgDisplay.Screen = DefaultScreen( fgDisplay.Display ); - fgDisplay.RootWindow = RootWindow( - fgDisplay.Display, - fgDisplay.Screen - ); - - fgDisplay.ScreenWidth = DisplayWidth( - fgDisplay.Display, - fgDisplay.Screen - ); - fgDisplay.ScreenHeight = DisplayHeight( - fgDisplay.Display, - fgDisplay.Screen - ); - - fgDisplay.ScreenWidthMM = DisplayWidthMM( - fgDisplay.Display, - fgDisplay.Screen - ); - fgDisplay.ScreenHeightMM = DisplayHeightMM( - fgDisplay.Display, - fgDisplay.Screen - ); - - fgDisplay.Connection = ConnectionNumber( fgDisplay.Display ); - - /* Create the window deletion atom */ - fgDisplay.DeleteWindow = fghGetAtom("WM_DELETE_WINDOW"); - - /* Create the state and full screen atoms */ - fgDisplay.State = None; - fgDisplay.StateFullScreen = None; - - if (fghNetWMSupported()) - { - const Atom supported = fghGetAtom("_NET_SUPPORTED"); - const Atom state = fghGetAtom("_NET_WM_STATE"); - - /* Check if the state hint is supported. */ - if (fgHintPresent(fgDisplay.RootWindow, supported, state)) - { - const Atom full_screen = fghGetAtom("_NET_WM_STATE_FULLSCREEN"); - - fgDisplay.State = state; - - /* Check if the window manager supports full screen. */ - /** Check "_NET_WM_ALLOWED_ACTIONS" on our window instead? **/ - if (fgHintPresent(fgDisplay.RootWindow, supported, full_screen)) - { - fgDisplay.StateFullScreen = full_screen; - } - } - } - - - fgState.Initialised = GL_TRUE; - - atexit(fgDeinitialize); - - /* InputDevice uses GlutTimerFunc(), so fgState.Initialised must be TRUE */ - fgInitialiseInputDevices(); -} - -#endif +extern void fgPlatformDestroyContext ( SFG_PlatformDisplay pDisplay, SFG_WindowContextType MContext ); void fghParseCommandLineArguments ( int* pargc, char** argv, char **pDisplayName, char **pGeometry ) @@ -436,34 +215,6 @@ void fghCloseInputDevices ( void ) } -#if TARGET_HOST_POSIX_X11 -static void fgPlatformDeinitialiseInputDevices ( void ) -{ - fghCloseInputDevices (); - - fgState.JoysticksInitialised = GL_FALSE; - fgState.InputDevsInitialised = GL_FALSE; -} - - -static void fgPlatformCloseDisplay ( void ) -{ - /* - * Make sure all X-client data we have created will be destroyed on - * display closing - */ - XSetCloseDownMode( fgDisplay.Display, DestroyAll ); - - /* - * Close the display connection, destroying all windows we have - * created so far - */ - XCloseDisplay( fgDisplay.Display ); -} - -#endif - - /* * Perform the freeglut deinitialization... */ @@ -484,10 +235,7 @@ void fgDeinitialize( void ) /* If there was a menu created, destroy the rendering context */ if( fgStructure.MenuContext ) { -#if TARGET_HOST_POSIX_X11 - /* Note that the MVisualInfo is not owned by the MenuContext! */ - glXDestroyContext( fgDisplay.Display, fgStructure.MenuContext->MContext ); -#endif + fgPlatformDestroyContext (fgDisplay.pDisplay, fgStructure.MenuContext->MContext ); free( fgStructure.MenuContext ); fgStructure.MenuContext = NULL; } @@ -566,7 +314,7 @@ void fgDeinitialize( void ) } -#if defined TARGET_HOST_MS_WINDOWS +#if TARGET_HOST_MS_WINDOWS #define NoValue 0x0000 #define XValue 0x0001 #define YValue 0x0002 @@ -648,16 +396,6 @@ void FGAPIENTRY glutInit( int* pargc, char** argv ) } } -#if TARGET_HOST_MS_WINDOWS -void (__cdecl *__glutExitFunc)( int return_value ) = NULL; - -void FGAPIENTRY __glutInitWithExit( int *pargc, char **argv, void (__cdecl *exit_function)(int) ) -{ - __glutExitFunc = exit_function; - glutInit(pargc, argv); -} -#endif - /* * Undoes all the "glutInit" stuff */