Fixes two crashers for games, with GHOST under SDL:

- Fixes SDL fullscreen mode for game engine (blenderplayer). Mode switching (resolution changes) not supported yet though.
- Fixes embedded game engine exit.
See patch tracker [#29748].
This commit is contained in:
Alex Fraser
2012-01-02 12:35:06 +00:00
parent c2bb285750
commit 15dc3d4609
4 changed files with 26 additions and 9 deletions

View File

@@ -36,7 +36,7 @@ GHOST_DisplayManagerSDL::GHOST_DisplayManagerSDL(GHOST_SystemSDL *system)
} }
GHOST_TSuccess GHOST_TSuccess
GHOST_DisplayManagerSDL::getNumDisplays(GHOST_TUns8& numDisplays) GHOST_DisplayManagerSDL::getNumDisplays(GHOST_TUns8& numDisplays) const
{ {
numDisplays= SDL_GetNumVideoDisplays(); numDisplays= SDL_GetNumVideoDisplays();
return GHOST_kSuccess; return GHOST_kSuccess;
@@ -44,7 +44,7 @@ GHOST_DisplayManagerSDL::getNumDisplays(GHOST_TUns8& numDisplays)
GHOST_TSuccess GHOST_DisplayManagerSDL::getNumDisplaySettings(GHOST_TUns8 display, GHOST_TSuccess GHOST_DisplayManagerSDL::getNumDisplaySettings(GHOST_TUns8 display,
GHOST_TInt32& numSettings) GHOST_TInt32& numSettings) const
{ {
GHOST_ASSERT(display < 1, "Only single display systems are currently supported.\n"); GHOST_ASSERT(display < 1, "Only single display systems are currently supported.\n");
numSettings= GHOST_TInt32(1); numSettings= GHOST_TInt32(1);
@@ -54,7 +54,7 @@ GHOST_TSuccess GHOST_DisplayManagerSDL::getNumDisplaySettings(GHOST_TUns8 displa
GHOST_TSuccess GHOST_TSuccess
GHOST_DisplayManagerSDL::getDisplaySetting(GHOST_TUns8 display, GHOST_DisplayManagerSDL::getDisplaySetting(GHOST_TUns8 display,
GHOST_TInt32 index, GHOST_TInt32 index,
GHOST_DisplaySetting& setting) GHOST_DisplaySetting& setting) const
{ {
GHOST_ASSERT(display < 1, "Only single display systems are currently supported.\n"); GHOST_ASSERT(display < 1, "Only single display systems are currently supported.\n");
@@ -74,7 +74,7 @@ GHOST_DisplayManagerSDL::getDisplaySetting(GHOST_TUns8 display,
GHOST_TSuccess GHOST_TSuccess
GHOST_DisplayManagerSDL::getCurrentDisplaySetting(GHOST_TUns8 display, GHOST_DisplayManagerSDL::getCurrentDisplaySetting(GHOST_TUns8 display,
GHOST_DisplaySetting& setting) GHOST_DisplaySetting& setting) const
{ {
return getDisplaySetting(display,GHOST_TInt32(0),setting); return getDisplaySetting(display,GHOST_TInt32(0),setting);
} }

View File

@@ -46,20 +46,20 @@ public:
GHOST_DisplayManagerSDL(GHOST_SystemSDL *system); GHOST_DisplayManagerSDL(GHOST_SystemSDL *system);
GHOST_TSuccess GHOST_TSuccess
getNumDisplays(GHOST_TUns8& numDisplays); getNumDisplays(GHOST_TUns8& numDisplays) const;
GHOST_TSuccess GHOST_TSuccess
getNumDisplaySettings(GHOST_TUns8 display, getNumDisplaySettings(GHOST_TUns8 display,
GHOST_TInt32& numSettings); GHOST_TInt32& numSettings) const;
GHOST_TSuccess GHOST_TSuccess
getDisplaySetting(GHOST_TUns8 display, getDisplaySetting(GHOST_TUns8 display,
GHOST_TInt32 index, GHOST_TInt32 index,
GHOST_DisplaySetting& setting); GHOST_DisplaySetting& setting) const;
GHOST_TSuccess GHOST_TSuccess
getCurrentDisplaySetting(GHOST_TUns8 display, getCurrentDisplaySetting(GHOST_TUns8 display,
GHOST_DisplaySetting& setting); GHOST_DisplaySetting& setting) const;
GHOST_TSuccess GHOST_TSuccess
setCurrentDisplaySetting(GHOST_TUns8 display, setCurrentDisplaySetting(GHOST_TUns8 display,

View File

@@ -132,6 +132,10 @@ if(WITH_SDL)
) )
add_definitions(-DWITH_SDL) add_definitions(-DWITH_SDL)
if(WITH_GHOST_SDL)
add_definitions(-DWITH_GHOST_SDL)
endif()
endif() endif()
blender_add_lib(ge_logic "${SRC}" "${INC}" "${INC_SYS}") blender_add_lib(ge_logic "${SRC}" "${INC}" "${INC_SYS}")

View File

@@ -88,8 +88,14 @@ SCA_Joystick *SCA_Joystick::GetInstance( short int joyindex )
if (m_refCount == 0) if (m_refCount == 0)
{ {
int i; int i;
// do this once only // The video subsystem is required for joystick input to work. However,
// when GHOST is running under SDL, video is initialised elsewhere.
// Do this once only.
# ifdef WITH_GHOST_SDL
if(SDL_InitSubSystem(SDL_INIT_JOYSTICK) == -1 ){
# else
if(SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_VIDEO) == -1 ){ if(SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_VIDEO) == -1 ){
# endif
echo("Error-Initializing-SDL: " << SDL_GetError()); echo("Error-Initializing-SDL: " << SDL_GetError());
return NULL; return NULL;
} }
@@ -124,7 +130,14 @@ void SCA_Joystick::ReleaseInstance()
m_instance[i]= NULL; m_instance[i]= NULL;
} }
// The video subsystem is required for joystick input to work. However,
// when GHOST is running under SDL, video is freed elsewhere.
// Do this once only.
# ifdef WITH_GHOST_SDL
SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
# else
SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_VIDEO); SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_VIDEO);
# endif
#endif /* WITH_SDL */ #endif /* WITH_SDL */
} }
} }