Fix crash alt+tabbing in and out of fullscreen on Voodoo3+D3D+WinXP.
This commit is contained in:
@@ -1007,7 +1007,7 @@ void NoteDataUtil::Wide( NoteData &in )
|
|||||||
|
|
||||||
// make all all quarter notes jumps
|
// make all all quarter notes jumps
|
||||||
int max_row = in.GetLastRow();
|
int max_row = in.GetLastRow();
|
||||||
for( int i=0; i<=max_row; i+=ROWS_PER_BEAT )
|
for( int i=0; i<=max_row; i+=ROWS_PER_BEAT*2 ) // every even beat
|
||||||
{
|
{
|
||||||
if( in.GetNumTapNonEmptyTracks(i) != 1 )
|
if( in.GetNumTapNonEmptyTracks(i) != 1 )
|
||||||
continue; // skip. Don't place during holds
|
continue; // skip. Don't place during holds
|
||||||
|
|||||||
@@ -384,6 +384,8 @@ HWND GetHwnd()
|
|||||||
/* Set the video mode. */
|
/* Set the video mode. */
|
||||||
bool RageDisplay_D3D::SetVideoMode( bool windowed, int width, int height, int bpp, int rate, bool vsync, CString sWindowTitle, CString sIconFile )
|
bool RageDisplay_D3D::SetVideoMode( bool windowed, int width, int height, int bpp, int rate, bool vsync, CString sWindowTitle, CString sIconFile )
|
||||||
{
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
if( FindBackBufferType( windowed, bpp ) == -1 ) // no possible back buffer formats
|
if( FindBackBufferType( windowed, bpp ) == -1 ) // no possible back buffer formats
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -392,6 +394,31 @@ bool RageDisplay_D3D::SetVideoMode( bool windowed, int width, int height, int bp
|
|||||||
mySDL_WM_SetIcon( sIconFile );
|
mySDL_WM_SetIcon( sIconFile );
|
||||||
|
|
||||||
|
|
||||||
|
/* Round to the nearest valid fullscreen resolution */
|
||||||
|
if( !windowed )
|
||||||
|
{
|
||||||
|
if( width <= 320 ) width = 320;
|
||||||
|
else if( width <= 400 ) width = 400;
|
||||||
|
else if( width <= 512 ) width = 512;
|
||||||
|
else if( width <= 640 ) width = 640;
|
||||||
|
else if( width <= 800 ) width = 800;
|
||||||
|
else if( width <= 1024 ) width = 1024;
|
||||||
|
else if( width <= 1280 ) width = 1280;
|
||||||
|
|
||||||
|
switch( width )
|
||||||
|
{
|
||||||
|
case 320: height = 240; break;
|
||||||
|
case 400: height = 300; break;
|
||||||
|
case 512: height = 384; break;
|
||||||
|
case 640: height = 480; break;
|
||||||
|
case 800: height = 600; break;
|
||||||
|
case 1024: height = 768; break;
|
||||||
|
case 1280: height = 1024; break;
|
||||||
|
default: ASSERT(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// HACK: On Windows 98, we can't call SDL_SetVideoMode while D3D is full screen.
|
// HACK: On Windows 98, we can't call SDL_SetVideoMode while D3D is full screen.
|
||||||
// It will result in "SDL_SetVideoMode failed: DirectDraw2::CreateSurface(PRIMARY):
|
// It will result in "SDL_SetVideoMode failed: DirectDraw2::CreateSurface(PRIMARY):
|
||||||
// Not in exclusive access mode". So, we'll Reset the D3D device, then resize the
|
// Not in exclusive access mode". So, we'll Reset the D3D device, then resize the
|
||||||
@@ -435,7 +462,6 @@ bool RageDisplay_D3D::SetVideoMode( bool windowed, int width, int height, int bp
|
|||||||
|
|
||||||
if( bCreateNewDevice ) // device is not yet created. We need to create it
|
if( bCreateNewDevice ) // device is not yet created. We need to create it
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
|
||||||
hr = g_pd3d->CreateDevice(
|
hr = g_pd3d->CreateDevice(
|
||||||
D3DADAPTER_DEFAULT,
|
D3DADAPTER_DEFAULT,
|
||||||
D3DDEVTYPE_HAL,
|
D3DDEVTYPE_HAL,
|
||||||
@@ -456,7 +482,12 @@ bool RageDisplay_D3D::SetVideoMode( bool windowed, int width, int height, int bp
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_pd3dDevice->Reset( &g_d3dpp );
|
hr = g_pd3dDevice->Reset( &g_d3dpp );
|
||||||
|
if( FAILED(hr) )
|
||||||
|
{
|
||||||
|
SDL_QuitSubSystem(SDL_INIT_VIDEO); // exit out of full screen. The ~RageDisplay will not be called!
|
||||||
|
RageException::Throw( "g_pd3dDevice->Reset failed: '%s'", DXGetErrorString8(hr) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( this->IsWindowed() )
|
if( this->IsWindowed() )
|
||||||
|
|||||||
@@ -563,6 +563,12 @@ Uint8 mySDL_EventState(Uint8 type, int state)
|
|||||||
|
|
||||||
void mySDL_WM_SetIcon( CString sIconFile )
|
void mySDL_WM_SetIcon( CString sIconFile )
|
||||||
{
|
{
|
||||||
|
if( sIconFile.empty() )
|
||||||
|
{
|
||||||
|
SDL_WM_SetIcon(NULL, NULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
SDL_Surface *srf = IMG_Load(sIconFile);
|
SDL_Surface *srf = IMG_Load(sIconFile);
|
||||||
SDL_SetColorKey( srf, SDL_SRCCOLORKEY, SDL_MapRGB(srf->format, 0xFF, 0, 0xFF));
|
SDL_SetColorKey( srf, SDL_SRCCOLORKEY, SDL_MapRGB(srf->format, 0xFF, 0, 0xFF));
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user