move global keys into a separate function
re-fix not sending key events to screens for global key releases and repeats simplify
This commit is contained in:
+106
-115
@@ -389,6 +389,99 @@ int main(int argc, char* argv[])
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Returns true if the key has been handled and should be discarded, false if
|
||||||
|
* the key should be sent on to screens. */
|
||||||
|
bool HandleGlobalInputs( DeviceInput DeviceI, InputEventType type, GameInput GameI, MenuInput MenuI, StyleInput StyleI )
|
||||||
|
{
|
||||||
|
switch( MenuI.button )
|
||||||
|
{
|
||||||
|
case MENU_BUTTON_OPERATOR:
|
||||||
|
if( type == IET_FIRST_PRESS ) return true;
|
||||||
|
|
||||||
|
/* Global operator key, to get quick access to the options menu. Don't
|
||||||
|
* do this if we're on a "system menu", which includes the editor
|
||||||
|
* (to prevent quitting without storing changes). */
|
||||||
|
if( !GAMESTATE->m_bIsOnSystemMenu )
|
||||||
|
{
|
||||||
|
SCREENMAN->SystemMessage( "OPERATOR" );
|
||||||
|
SCREENMAN->SetNewScreen( "ScreenOptionsMenu" );
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case MENU_BUTTON_COIN:
|
||||||
|
/* Handle a coin insertion. */
|
||||||
|
if( type == IET_FIRST_PRESS ) return true;
|
||||||
|
|
||||||
|
switch( PREFSMAN->m_CoinMode )
|
||||||
|
{
|
||||||
|
case PrefsManager::COIN_FREE: // fall through
|
||||||
|
case PrefsManager::COIN_HOME: // fall through
|
||||||
|
case PrefsManager::COIN_PAY:
|
||||||
|
GAMESTATE->m_iCoins++;
|
||||||
|
SCREENMAN->RefreshCreditsMessages();
|
||||||
|
SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","insert coin") );
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(DeviceI == DeviceInput(DEVICE_KEYBOARD, SDLK_F4))
|
||||||
|
{
|
||||||
|
if(type != IET_FIRST_PRESS) return true;
|
||||||
|
if( INPUTMAN->IsBeingPressed( DeviceInput(DEVICE_KEYBOARD, SDLK_RALT)) ||
|
||||||
|
INPUTMAN->IsBeingPressed( DeviceInput(DEVICE_KEYBOARD, SDLK_LALT)) )
|
||||||
|
{
|
||||||
|
// pressed Alt+F4
|
||||||
|
SDL_Event *event;
|
||||||
|
event = (SDL_Event *) malloc(sizeof(SDL_Event));
|
||||||
|
event->type = SDL_QUIT;
|
||||||
|
SDL_PushEvent(event);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// pressed just F4
|
||||||
|
PREFSMAN->m_bWindowed = !PREFSMAN->m_bWindowed;
|
||||||
|
ApplyGraphicOptions();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(DeviceI == DeviceInput(DEVICE_KEYBOARD, SDLK_F5)) // F5 conflicts with editor and AutoSync
|
||||||
|
{
|
||||||
|
if(type != IET_FIRST_PRESS) return true;
|
||||||
|
|
||||||
|
// pressed F6. Save Screenshot.
|
||||||
|
CString sPath;
|
||||||
|
for( int i=0; i<1000; i++ )
|
||||||
|
{
|
||||||
|
sPath = ssprintf("screen%04d.bmp",i);
|
||||||
|
if( !DoesFileExist(sPath) )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
DISPLAY->SaveScreenshot( sPath );
|
||||||
|
SCREENMAN->SystemMessage( "Saved screenshot: " + sPath );
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(DeviceI == DeviceInput(DEVICE_KEYBOARD, SDLK_RETURN))
|
||||||
|
{
|
||||||
|
if( INPUTMAN->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, SDLK_RALT)) ||
|
||||||
|
INPUTMAN->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, SDLK_LALT)) )
|
||||||
|
{
|
||||||
|
if(type != IET_FIRST_PRESS) return true;
|
||||||
|
/* alt-enter */
|
||||||
|
PREFSMAN->m_bWindowed = !PREFSMAN->m_bWindowed;
|
||||||
|
ApplyGraphicOptions();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static void HandleInputEvents(float fDeltaTime)
|
static void HandleInputEvents(float fDeltaTime)
|
||||||
{
|
{
|
||||||
static InputEventArray ieArray;
|
static InputEventArray ieArray;
|
||||||
@@ -398,121 +491,6 @@ static void HandleInputEvents(float fDeltaTime)
|
|||||||
{
|
{
|
||||||
DeviceInput DeviceI = (DeviceInput)ieArray[i];
|
DeviceInput DeviceI = (DeviceInput)ieArray[i];
|
||||||
InputEventType type = ieArray[i].type;
|
InputEventType type = ieArray[i].type;
|
||||||
|
|
||||||
// HACK: Numlock is read is being pressed if the NumLock light is on.
|
|
||||||
// Filter out all NumLock repeat messages
|
|
||||||
if( DeviceI.device == DEVICE_KEYBOARD && DeviceI.button == SDLK_NUMLOCK && type != IET_FIRST_PRESS )
|
|
||||||
continue; // skip
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Begin Global Key Support.. Any of these keys are configurable thru the normal
|
|
||||||
key/joy configuration screens */
|
|
||||||
|
|
||||||
if( type == IET_FIRST_PRESS ) // This only takes effect if the key is pressed once.
|
|
||||||
{
|
|
||||||
MenuInput MenuII; /* These are temporary holders to turn the device */
|
|
||||||
GameInput GameII; /* input into a menu button for certain keys */
|
|
||||||
INPUTMAPPER->DeviceToGame(DeviceI,GameII);
|
|
||||||
INPUTMAPPER->GameToMenu(GameII,MenuII);
|
|
||||||
|
|
||||||
switch( MenuII.button )
|
|
||||||
{
|
|
||||||
case MENU_BUTTON_OPERATOR:
|
|
||||||
/* Global operator key.. like arcade, allows quick immediate access
|
|
||||||
to the adminstrative options panel. A global boolean has been
|
|
||||||
added to not allow this to function on system option screens,
|
|
||||||
or in the step editor. This will save the hassle of an "accidental
|
|
||||||
keystroke, and your edit is gone". -- Miryokuteki
|
|
||||||
*/
|
|
||||||
if( !GAMESTATE->m_bIsOnSystemMenu )
|
|
||||||
{
|
|
||||||
SCREENMAN->SystemMessage( "OPERATOR" );
|
|
||||||
SCREENMAN->SetNewScreen( "ScreenOptionsMenu" );
|
|
||||||
//continue;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Global credit.. accepts anywhere, like the arcade -- Mirykouteki */
|
|
||||||
case MENU_BUTTON_COIN:
|
|
||||||
switch( PREFSMAN->m_CoinMode )
|
|
||||||
{
|
|
||||||
case PrefsManager::COIN_FREE: //fall thru
|
|
||||||
case PrefsManager::COIN_HOME: //fall thru
|
|
||||||
case PrefsManager::COIN_PAY:
|
|
||||||
GAMESTATE->m_iCoins++;
|
|
||||||
SCREENMAN->RefreshCreditsMessages();
|
|
||||||
SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","insert coin") );
|
|
||||||
//continue;
|
|
||||||
return;
|
|
||||||
default:
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}/* end GKSD */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(DeviceI == DeviceInput(DEVICE_KEYBOARD, SDLK_F4))
|
|
||||||
{
|
|
||||||
if(type != IET_FIRST_PRESS) continue;
|
|
||||||
if( INPUTMAN->IsBeingPressed( DeviceInput(DEVICE_KEYBOARD, SDLK_RALT)) ||
|
|
||||||
INPUTMAN->IsBeingPressed( DeviceInput(DEVICE_KEYBOARD, SDLK_LALT)) )
|
|
||||||
{
|
|
||||||
// pressed Alt+F4
|
|
||||||
SDL_Event *event;
|
|
||||||
event = (SDL_Event *) malloc(sizeof(SDL_Event));
|
|
||||||
event->type = SDL_QUIT;
|
|
||||||
SDL_PushEvent(event);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// pressed just F4
|
|
||||||
PREFSMAN->m_bWindowed = !PREFSMAN->m_bWindowed;
|
|
||||||
ApplyGraphicOptions();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(DeviceI == DeviceInput(DEVICE_KEYBOARD, SDLK_F5)) // F5 conflicts with editor and AutoSync
|
|
||||||
{
|
|
||||||
if(type != IET_FIRST_PRESS) continue;
|
|
||||||
|
|
||||||
// pressed F6. Save Screenshot.
|
|
||||||
int i=0;
|
|
||||||
CString sPath;
|
|
||||||
for( i=0; i<1000; i++ )
|
|
||||||
{
|
|
||||||
sPath = ssprintf("screen%04d.bmp",i);
|
|
||||||
if( !DoesFileExist(sPath) )
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
DISPLAY->SaveScreenshot( sPath );
|
|
||||||
SCREENMAN->SystemMessage( "Saved screenshot: " + sPath );
|
|
||||||
}
|
|
||||||
|
|
||||||
if(DeviceI == DeviceInput(DEVICE_KEYBOARD, SDLK_RETURN))
|
|
||||||
{
|
|
||||||
if( INPUTMAN->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, SDLK_RALT)) ||
|
|
||||||
INPUTMAN->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, SDLK_LALT)) )
|
|
||||||
{
|
|
||||||
if(type != IET_FIRST_PRESS) continue;
|
|
||||||
/* alt-enter */
|
|
||||||
PREFSMAN->m_bWindowed = !PREFSMAN->m_bWindowed;
|
|
||||||
ApplyGraphicOptions();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
GameInput GameI;
|
GameInput GameI;
|
||||||
MenuInput MenuI;
|
MenuInput MenuI;
|
||||||
StyleInput StyleI;
|
StyleInput StyleI;
|
||||||
@@ -527,6 +505,19 @@ static void HandleInputEvents(float fDeltaTime)
|
|||||||
INPUTMAPPER->GameToStyle( GameI, StyleI );
|
INPUTMAPPER->GameToStyle( GameI, StyleI );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HACK: Numlock is read is being pressed if the NumLock light is on.
|
||||||
|
// Filter out all NumLock repeat messages
|
||||||
|
if( DeviceI.device == DEVICE_KEYBOARD && DeviceI.button == SDLK_NUMLOCK && type != IET_FIRST_PRESS )
|
||||||
|
continue; // skip
|
||||||
|
|
||||||
|
if( HandleGlobalInputs(DeviceI, type, GameI, MenuI, StyleI ) )
|
||||||
|
continue; // skip
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SCREENMAN->Input( DeviceI, type, GameI, MenuI, StyleI );
|
SCREENMAN->Input( DeviceI, type, GameI, MenuI, StyleI );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user