Update. Make sure all windows are destroyed.
This commit is contained in:
@@ -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 );
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user