#if TARGET_HOST_POSIX_X11
#include <limits.h> /* LONG_MAX */
+#include <unistd.h> /* usleep */
#endif
#if defined(_WIN32_WCE)
* Chooses a visual basing on the current display mode settings
*/
-GLXFBConfig* fgChooseFBConfig( void )
+GLXFBConfig* fgChooseFBConfig( int *numcfgs )
{
GLboolean wantIndexedMode = GL_FALSE;
int attributes[ 100 ];
fbconfig = NULL;
}
+ if (numcfgs)
+ *numcfgs = fbconfigArraySize;
+
return fbconfig;
}
}
ppfd->cGreenShift = 0;
ppfd->cBlueShift = 0;
ppfd->cAlphaShift = 0;
- ppfd->cAccumBits = 0;
+ ppfd->cAccumBits = ( fgState.DisplayMode & GLUT_ACCUM ) ? 1 : 0;
ppfd->cAccumRedBits = 0;
ppfd->cAccumGreenBits = 0;
ppfd->cAccumBlueBits = 0;
PIXELFORMATDESCRIPTOR pfd;
PIXELFORMATDESCRIPTOR* ppfd = &pfd;
int pixelformat;
+ HDC current_hDC;
+ GLboolean success;
+
+ if (checkOnly)
+ current_hDC = CreateDC(TEXT("DISPLAY"), NULL ,NULL ,NULL);
+ else
+ current_hDC = window->Window.Device;
- fghFillPFD( ppfd, window->Window.Device, layer_type );
- pixelformat = ChoosePixelFormat( window->Window.Device, ppfd );
+ fghFillPFD( ppfd, current_hDC, layer_type );
+ pixelformat = ChoosePixelFormat( current_hDC, ppfd );
/* windows hack for multismapling/sRGB */
if ( ( fgState.DisplayMode & GLUT_MULTISAMPLE ) ||
hWnd=CreateWindow(_T("FREEGLUT_dummy"), _T(""), WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW , 0,0,0,0, 0, 0, fgDisplay.Instance, 0 );
hDC=GetDC(hWnd);
SetPixelFormat( hDC, pixelformat, ppfd );
-
+
rc = wglCreateContext( hDC );
wglMakeCurrent(hDC, rc);
-
+
if ( fghIsExtensionSupported( hDC, "WGL_ARB_multisample" ) )
{
PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARBProc =
float fAttributes[] = { 0, 0 };
UINT numFormats;
fghFillPixelFormatAttributes( attributes, ppfd );
- bValid = wglChoosePixelFormatARBProc(window->Window.Device, attributes, fAttributes, 1, &iPixelFormat, &numFormats);
+ bValid = wglChoosePixelFormatARBProc(hDC, attributes, fAttributes, 1, &iPixelFormat, &numFormats);
if ( bValid && numFormats > 0 )
{
UnregisterClass(_T("FREEGLUT_dummy"), fgDisplay.Instance);
}
- return ( pixelformat != 0 ) && ( checkOnly || SetPixelFormat( window->Window.Device, pixelformat, ppfd ) );
+ success = ( pixelformat != 0 ) && ( checkOnly || SetPixelFormat( current_hDC, pixelformat, ppfd ) );
+
+ if (checkOnly)
+ DeleteDC(current_hDC);
+
+ return success;
#endif /* defined(_WIN32_WCE) */
}
);
}
#elif TARGET_HOST_MS_WINDOWS
- if( fgStructure.CurrentWindow )
- ReleaseDC( fgStructure.CurrentWindow->Window.Handle,
- fgStructure.CurrentWindow->Window.Device );
-
- if ( window )
+ if ( window != fgStructure.CurrentWindow )
{
- window->Window.Device = GetDC( window->Window.Handle );
- wglMakeCurrent(
- window->Window.Device,
- window->Window.Context
- );
+ if( fgStructure.CurrentWindow )
+ ReleaseDC( fgStructure.CurrentWindow->Window.Handle,
+ fgStructure.CurrentWindow->Window.Device );
+
+ if ( window )
+ {
+ window->Window.Device = GetDC( window->Window.Handle );
+ wglMakeCurrent(
+ window->Window.Device,
+ window->Window.Context
+ );
+ }
}
#endif
fgStructure.CurrentWindow = window;
#if TARGET_HOST_MS_WINDOWS
+#if(WINVER >= 0x500)
typedef struct {
int *x;
int *y;
* this function is only used in fgOpenWindow. Currently it only sets
* its output parameters, if the DisplayName is set in fgDisplay
* (and if it is able to recognize the display)
-*/
+ */
static void get_display_origin(int *xp,int *yp)
{
EnumDisplayMonitors(0,0,m_proc,(LPARAM)&st);
}
}
+#else
+#pragma message( "-display parameter only works if compiled with WINVER >= 0x0500")
+
+static void get_display_origin(int *xp,int *yp)
+{
+ if( fgDisplay.DisplayName )
+ {
+ fgWarning( "for working -display support FreeGLUT must be compiled with WINVER >= 0x0500");
+ }
+}
+#endif
#endif
+#if TARGET_HOST_POSIX_X11
+static Bool fghWindowIsVisible( Display *display, XEvent *event, XPointer arg)
+{
+ Window window = arg;
+ return (event->type == MapNotify) && (event->xmap.window == window);
+}
+#endif
+
/*
* Opens a window. Requires a SFG_Window object created and attached
XTextProperty textProperty;
XSizeHints sizeHints;
XWMHints wmHints;
+ XEvent eventReturnBuffer; /* return buffer required for a call */
unsigned long mask;
+ int num_FBConfigs, i;
unsigned int current_DisplayMode = fgState.DisplayMode ;
/* Save the display mode if we are creating a menu window */
if( window->IsMenu && ( ! fgStructure.MenuContext ) )
fgState.DisplayMode = GLUT_DOUBLE | GLUT_RGB ;
- window->Window.FBConfig = fgChooseFBConfig( );
+ window->Window.FBConfig = fgChooseFBConfig( &num_FBConfigs );
if( window->IsMenu && ( ! fgStructure.MenuContext ) )
fgState.DisplayMode = current_DisplayMode ;
if( !( fgState.DisplayMode & GLUT_DOUBLE ) )
{
fgState.DisplayMode |= GLUT_DOUBLE ;
- window->Window.FBConfig = fgChooseFBConfig( );
+ window->Window.FBConfig = fgChooseFBConfig( &num_FBConfigs );
fgState.DisplayMode &= ~GLUT_DOUBLE;
}
if( fgState.DisplayMode & GLUT_MULTISAMPLE )
{
fgState.DisplayMode &= ~GLUT_MULTISAMPLE ;
- window->Window.FBConfig = fgChooseFBConfig( );
+ window->Window.FBConfig = fgChooseFBConfig( &num_FBConfigs );
fgState.DisplayMode |= GLUT_MULTISAMPLE;
}
}
"FBConfig with necessary capabilities not found", "fgOpenWindow" );
/* Get the X visual. */
- visualInfo = glXGetVisualFromFBConfig( fgDisplay.Display,
- *(window->Window.FBConfig) );
+ for (i = 0; i < num_FBConfigs; i++) {
+ visualInfo = glXGetVisualFromFBConfig( fgDisplay.Display,
+ window->Window.FBConfig[i] );
+ if (visualInfo)
+ break;
+ }
+
+ FREEGLUT_INTERNAL_ERROR_EXIT( visualInfo != NULL,
+ "visualInfo could not be retrieved from FBConfig", "fgOpenWindow" );
/*
* XXX HINT: the masks should be updated when adding/removing callbacks.
XFree(visualInfo);
+ if( !isSubWindow)
+ XPeekIfEvent( fgDisplay.Display, &eventReturnBuffer, &fghWindowIsVisible, window->Window.Handle );
+
#elif TARGET_HOST_MS_WINDOWS
WNDCLASS wc;
*/
void fgCloseWindow( SFG_Window* window )
{
+ /* if we're in gamemode, call glutLeaveGameMode first to make sure the
+ * gamemode is properly closed before closing the window
+ */
+ if (fgStructure.GameModeWindow != NULL)
+ glutLeaveGameMode();
+
#if TARGET_HOST_POSIX_X11
if( window->Window.Context )
glXDestroyContext( fgDisplay.Display, window->Window.Context );
XFree( window->Window.FBConfig );
- XDestroyWindow( fgDisplay.Display, window->Window.Handle );
+
+ if( window->Window.Handle ) {
+ XDestroyWindow( fgDisplay.Display, window->Window.Handle );
+ }
/* XFlush( fgDisplay.Display ); */ /* XXX Shouldn't need this */
#elif TARGET_HOST_MS_WINDOWS