Update. Make sure all windows are destroyed.

This commit is contained in:
Steve Checkoway
2006-12-07 10:53:50 +00:00
parent a6016a9c03
commit a62c3a88b1
@@ -25,7 +25,7 @@ using namespace RageDisplay_OGL_Helpers;
static GLXContext g_pContext = NULL; static GLXContext g_pContext = NULL;
static GLXContext g_pBackgroundContext = NULL; static GLXContext g_pBackgroundContext = NULL;
static Window g_AltWindow = 0; static Window g_AltWindow = None;
static PWSWAPINTERVALEXTPROC glSwapInterval = NULL; static PWSWAPINTERVALEXTPROC glSwapInterval = NULL;
static LocalizedString FAILED_CONNECTION_XSERVER( "LowLevelWindow_X11", "Failed to establish a connection with the X server" ); static LocalizedString FAILED_CONNECTION_XSERVER( "LowLevelWindow_X11", "Failed to establish a connection with the X server" );
@@ -64,6 +64,10 @@ LowLevelWindow_X11::~LowLevelWindow_X11()
XUngrabKeyboard( X11Helper::Dpy, CurrentTime ); XUngrabKeyboard( X11Helper::Dpy, CurrentTime );
} }
XDestroyWindow( X11Helper::Dpy, X11Helper::Win );
X11Helper::Win = None;
XDestroyWindow( X11Helper::Dpy, g_AltWindow );
g_AltWindow = None;
X11Helper::Stop(); // Xlib cleans up the window for us X11Helper::Stop(); // Xlib cleans up the window for us
} }
@@ -77,6 +81,7 @@ void *LowLevelWindow_X11::GetProcAddress( RString s )
RString LowLevelWindow_X11::TryVideoMode( const VideoModeParams &p, bool &bNewDeviceOut ) RString LowLevelWindow_X11::TryVideoMode( const VideoModeParams &p, bool &bNewDeviceOut )
{ {
using namespace X11Helper;
#if defined(LINUX) && 0 #if defined(LINUX) && 0
/* /*
* nVidia cards: * nVidia cards:
@@ -107,6 +112,7 @@ RString LowLevelWindow_X11::TryVideoMode( const VideoModeParams &p, bool &bNewDe
int visAttribs[32]; int visAttribs[32];
int i = 0; int i = 0;
ASSERT( p.bpp == 16 || p.bpp == 32 ); ASSERT( p.bpp == 16 || p.bpp == 32 );
if( p.bpp == 32 ) if( p.bpp == 32 )
{ {
visAttribs[i++] = GLX_RED_SIZE; visAttribs[i++] = 8; visAttribs[i++] = GLX_RED_SIZE; visAttribs[i++] = 8;
@@ -126,32 +132,31 @@ RString LowLevelWindow_X11::TryVideoMode( const VideoModeParams &p, bool &bNewDe
visAttribs[i++] = None; visAttribs[i++] = None;
XVisualInfo *xvi = glXChooseVisual( X11Helper::Dpy, DefaultScreen(X11Helper::Dpy), visAttribs ); XVisualInfo *xvi = glXChooseVisual( Dpy, DefaultScreen(Dpy), visAttribs );
if( xvi == NULL ) if( xvi == NULL )
return "No visual available for that depth."; return "No visual available for that depth.";
/* Enable StructureNotifyMask, so we receive a MapNotify for the following XMapWindow. */ /* Enable StructureNotifyMask, so we receive a MapNotify for the following XMapWindow. */
X11Helper::OpenMask( StructureNotifyMask ); OpenMask( StructureNotifyMask );
// I get strange behavior if I add override redirect after creating the window. // I get strange behavior if I add override redirect after creating the window.
// So, let's recreate the window when changing that state. // So, let's recreate the window when changing that state.
if( !X11Helper::MakeWindow(xvi->screen, xvi->depth, xvi->visual, p.width, p.height, !p.windowed) ) if( !MakeWindow(Win, xvi->screen, xvi->depth, xvi->visual, p.width, p.height, !p.windowed) )
return "Failed to create the window."; return "Failed to create the window.";
g_AltWindow = X11Helper::CreateWindow(xvi->screen, xvi->depth, xvi->visual, p.width, p.height, !p.windowed); if( !MakeWindow(g_AltWindow, xvi->screen, xvi->depth, xvi->visual, p.width, p.height, !p.windowed) )
ASSERT( g_AltWindow ); FAIL_M( "Failed to create the alt window." ); // Should this be fatal?
char *szWindowTitle = const_cast<char *>( p.sWindowTitle.c_str() ); char *szWindowTitle = const_cast<char *>( p.sWindowTitle.c_str() );
XChangeProperty( X11Helper::Dpy, X11Helper::Win, XA_WM_NAME, XA_STRING, 8, PropModeReplace, XChangeProperty( Dpy, Win, XA_WM_NAME, XA_STRING, 8, PropModeReplace,
reinterpret_cast<unsigned char*>(szWindowTitle), strlen(szWindowTitle) ); reinterpret_cast<unsigned char*>(szWindowTitle), strlen(szWindowTitle) );
g_pContext = glXCreateContext( X11Helper::Dpy, xvi, NULL, True ); g_pContext = glXCreateContext( Dpy, xvi, NULL, True );
g_pBackgroundContext = glXCreateContext( X11Helper::Dpy, xvi, g_pContext, True ); g_pBackgroundContext = glXCreateContext( Dpy, xvi, g_pContext, True );
glXMakeCurrent( X11Helper::Dpy, X11Helper::Win, g_pContext ); glXMakeCurrent( Dpy, Win, g_pContext );
XMapWindow( X11Helper::Dpy, X11Helper::Win ); XMapWindow( Dpy, Win );
// HACK: Wait for the MapNotify event, without spinning and // HACK: Wait for the MapNotify event, without spinning and
// eating CPU unnecessarily, and without smothering other // eating CPU unnecessarily, and without smothering other
@@ -160,7 +165,7 @@ RString LowLevelWindow_X11::TryVideoMode( const VideoModeParams &p, bool &bNewDe
// after MapNotify arrives. // after MapNotify arrives.
while(1) while(1)
{ {
XNextEvent( X11Helper::Dpy, &ev ); XNextEvent( Dpy, &ev );
if( ev.type == MapNotify ) if( ev.type == MapNotify )
break; break;
@@ -169,11 +174,10 @@ RString LowLevelWindow_X11::TryVideoMode( const VideoModeParams &p, bool &bNewDe
while( !otherEvs.empty() ) while( !otherEvs.empty() )
{ {
XPutBackEvent( X11Helper::Dpy, &otherEvs.top() ); XPutBackEvent( Dpy, &otherEvs.top() );
otherEvs.pop(); otherEvs.pop();
} }
CloseMask( StructureNotifyMask );
X11Helper::CloseMask( StructureNotifyMask );
} }
else else
@@ -183,13 +187,13 @@ RString LowLevelWindow_X11::TryVideoMode( const VideoModeParams &p, bool &bNewDe
bNewDeviceOut = false; bNewDeviceOut = false;
} }
XRRScreenConfiguration *pScreenConfig = XRRGetScreenInfo( X11Helper::Dpy, RootWindow( X11Helper::Dpy, DefaultScreen(X11Helper::Dpy) ) ); XRRScreenConfiguration *pScreenConfig = XRRGetScreenInfo( Dpy, RootWindow(Dpy, DefaultScreen(Dpy)) );
if( !p.windowed ) if( !p.windowed )
{ {
// Find a matching mode. // Find a matching mode.
int iSizesXct; int iSizesXct;
XRRScreenSize *pSizesX = XRRSizes( X11Helper::Dpy, DefaultScreen( X11Helper::Dpy ), &iSizesXct ); XRRScreenSize *pSizesX = XRRSizes( Dpy, DefaultScreen(Dpy), &iSizesXct );
ASSERT_M( iSizesXct != 0, "Couldn't get resolution list from X server" ); ASSERT_M( iSizesXct != 0, "Couldn't get resolution list from X server" );
int iSizeMatch = -1; int iSizeMatch = -1;
@@ -205,18 +209,17 @@ RString LowLevelWindow_X11::TryVideoMode( const VideoModeParams &p, bool &bNewDe
// Set this mode. // Set this mode.
// XXX: This doesn't handle if the config has changed since we queried it (see man Xrandr) // XXX: This doesn't handle if the config has changed since we queried it (see man Xrandr)
XRRSetScreenConfig( X11Helper::Dpy, pScreenConfig, RootWindow( X11Helper::Dpy, DefaultScreen(X11Helper::Dpy) ), iSizeMatch, 1, CurrentTime ); XRRSetScreenConfig( Dpy, pScreenConfig, RootWindow(Dpy, DefaultScreen(Dpy)), iSizeMatch, 1, CurrentTime );
// Move the window to the corner that the screen focuses in on. // Move the window to the corner that the screen focuses in on.
XMoveWindow( X11Helper::Dpy, X11Helper::Win, 0, 0 ); XMoveWindow( Dpy, Win, 0, 0 );
XRaiseWindow( X11Helper::Dpy, X11Helper::Win ); XRaiseWindow( Dpy, Win );
if( m_bWasWindowed ) if( m_bWasWindowed )
{ {
// We want to prevent the WM from catching anything that comes from the keyboard. // We want to prevent the WM from catching anything that comes from the keyboard.
XGrabKeyboard( X11Helper::Dpy, X11Helper::Win, True, XGrabKeyboard( Dpy, Win, True, GrabModeAsync, GrabModeAsync, CurrentTime );
GrabModeAsync, GrabModeAsync, CurrentTime );
m_bWasWindowed = false; m_bWasWindowed = false;
} }
} }
@@ -224,10 +227,10 @@ RString LowLevelWindow_X11::TryVideoMode( const VideoModeParams &p, bool &bNewDe
{ {
if( !m_bWasWindowed ) if( !m_bWasWindowed )
{ {
XRRSetScreenConfig( X11Helper::Dpy, pScreenConfig, RootWindow( X11Helper::Dpy, DefaultScreen( X11Helper::Dpy ) ), 0, 1, CurrentTime ); XRRSetScreenConfig( Dpy, pScreenConfig, RootWindow(Dpy, DefaultScreen(Dpy)), 0, 1, CurrentTime );
// In windowed mode, we actually want the WM to function normally. // In windowed mode, we actually want the WM to function normally.
// Release any previous grab. // Release any previous grab.
XUngrabKeyboard( X11Helper::Dpy, CurrentTime ); XUngrabKeyboard( Dpy, CurrentTime );
m_bWasWindowed = true; m_bWasWindowed = true;
} }
} }
@@ -237,11 +240,11 @@ RString LowLevelWindow_X11::TryVideoMode( const VideoModeParams &p, bool &bNewDe
// Do this before resizing the window so that pane-style WMs (Ion, // Do this before resizing the window so that pane-style WMs (Ion,
// ratpoison) don't resize us back inappropriately. // ratpoison) don't resize us back inappropriately.
XSetWMNormalHints( X11Helper::Dpy, X11Helper::Win, &hints ); XSetWMNormalHints( Dpy, Win, &hints );
// Do this even if we just created the window -- works around Ion2 not // Do this even if we just created the window -- works around Ion2 not
// catching WM normal hints changes in mapped windows. // catching WM normal hints changes in mapped windows.
XResizeWindow( X11Helper::Dpy, X11Helper::Win, p.width, p.height ); XResizeWindow( Dpy, Win, p.width, p.height );
if( glSwapInterval ) if( glSwapInterval )
glSwapInterval( p.vsync ); glSwapInterval( p.vsync );