From bc1d7650fd171a6b8a42ed744dfb83d533b56b09 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Tue, 9 Sep 2003 04:57:22 +0000 Subject: [PATCH] remove IgnoreJoyAxes option. Instead, have ScreenMapControllers prefer button presses over axis presses for simultaneouly received input events. --- stepmania/src/InputMapper.cpp | 11 ---- stepmania/src/PrefsManager.cpp | 1 - stepmania/src/PrefsManager.h | 1 - stepmania/src/ScreenInputOptions.cpp | 4 -- stepmania/src/ScreenMapControllers.cpp | 77 +++++++++++--------------- stepmania/src/ScreenMapControllers.h | 3 + 6 files changed, 34 insertions(+), 63 deletions(-) diff --git a/stepmania/src/InputMapper.cpp b/stepmania/src/InputMapper.cpp index e961a2d380..9c08b1a5d7 100644 --- a/stepmania/src/InputMapper.cpp +++ b/stepmania/src/InputMapper.cpp @@ -73,7 +73,6 @@ struct AutoJoyMapping Game game; const char *szDeviceDescription; // reported by InputHandler const char *szControllerName; // the product name of the controller - bool bIgnoreAxes; struct { int iSlotIndex; // -1 == end marker int deviceButton; @@ -95,7 +94,6 @@ const AutoJoyMapping g_AutoJoyMappings[] = GAME_DANCE, "GIC USB Joystick", "Boom USB convertor (black/gray)", - false, { { 0, JOY_16, DANCE_BUTTON_LEFT }, { 0, JOY_14, DANCE_BUTTON_RIGHT }, @@ -108,7 +106,6 @@ const AutoJoyMapping g_AutoJoyMappings[] = GAME_DANCE, "4 axis 16 button joystick", "PC Magic Box", - false, { { 0, JOY_16, DANCE_BUTTON_LEFT }, { 0, JOY_14, DANCE_BUTTON_RIGHT }, @@ -121,7 +118,6 @@ const AutoJoyMapping g_AutoJoyMappings[] = GAME_DANCE, "GamePad Pro USB ", // yes, there is a space at the end "GamePad Pro USB", - false, { { 0, JOY_LEFT, DANCE_BUTTON_LEFT }, { 0, JOY_RIGHT, DANCE_BUTTON_RIGHT }, @@ -142,7 +138,6 @@ const AutoJoyMapping g_AutoJoyMappings[] = GAME_DANCE, "4 axis 12 button joystick with hat switch", "Super Joy Box 5", - false, { { 0, JOY_HAT_LEFT, DANCE_BUTTON_LEFT }, { 0, JOY_HAT_RIGHT, DANCE_BUTTON_RIGHT }, @@ -165,7 +160,6 @@ const AutoJoyMapping g_AutoJoyMappings[] = GAME_DANCE, "MP-8866 Dual USB Joypad", "Super Dual Box", - false, { { 0, JOY_HAT_LEFT, DANCE_BUTTON_LEFT }, { 0, JOY_HAT_RIGHT, DANCE_BUTTON_RIGHT }, @@ -188,7 +182,6 @@ const AutoJoyMapping g_AutoJoyMappings[] = GAME_DANCE, "XBOX Gamepad Plugin V0.01", "X-Box gamepad", - false, { { 0, JOY_HAT_LEFT, DANCE_BUTTON_LEFT }, { 0, JOY_HAT_RIGHT, DANCE_BUTTON_RIGHT }, @@ -209,7 +202,6 @@ const AutoJoyMapping g_AutoJoyMappings[] = GAME_PUMP, "Pump USB", "Pump USB pad", - false, { { 0, PUMP_UL, PUMP_BUTTON_UPLEFT }, { 0, PUMP_UR, PUMP_BUTTON_UPRIGHT }, @@ -231,7 +223,6 @@ void InputMapper::AutoMapJoysticksForCurrentGame() { vector vDevices; vector vDescriptions; - PREFSMAN->m_bIgnoreJoyAxes = false; INPUTMAN->GetDevicesAndDescriptions(vDevices,vDescriptions); int iNumJoysticksMapped = 0; @@ -256,8 +247,6 @@ void InputMapper::AutoMapJoysticksForCurrentGame() LOG->Info( "Applying default joystick mapping #%d for device '%s' (%s)", iNumJoysticksMapped+1, mapping.szDeviceDescription, mapping.szControllerName ); - PREFSMAN->m_bIgnoreJoyAxes |= mapping.bIgnoreAxes; - for( int k=0; mapping.maps[k].iSlotIndex != -1; k++ ) { if( mapping.maps[k].SecondController ) diff --git a/stepmania/src/PrefsManager.cpp b/stepmania/src/PrefsManager.cpp index 97d1745778..e5aa5662bb 100644 --- a/stepmania/src/PrefsManager.cpp +++ b/stepmania/src/PrefsManager.cpp @@ -45,7 +45,6 @@ PrefsManager::PrefsManager() m_iMovieColorDepth = 16; m_iMaxTextureResolution = 2048; m_iRefreshRate = REFRESH_DEFAULT; - m_bIgnoreJoyAxes = true; // ON by default because all USB convertors that are compatible with pads map to buttons m_bOnlyDedicatedMenuButtons = false; #ifdef DEBUG m_bShowStats = true; diff --git a/stepmania/src/PrefsManager.h b/stepmania/src/PrefsManager.h index a639b2da8e..bb45c449bc 100644 --- a/stepmania/src/PrefsManager.h +++ b/stepmania/src/PrefsManager.h @@ -43,7 +43,6 @@ public: bool m_bDelayedScreenLoad; bool m_bBannerCache; - bool m_bIgnoreJoyAxes; bool m_bOnlyDedicatedMenuButtons; bool m_bMenuTimer; bool m_bShowDanger; diff --git a/stepmania/src/ScreenInputOptions.cpp b/stepmania/src/ScreenInputOptions.cpp index 706884a002..059a915de8 100644 --- a/stepmania/src/ScreenInputOptions.cpp +++ b/stepmania/src/ScreenInputOptions.cpp @@ -24,7 +24,6 @@ enum { IO_AUTO_MAP_JOYSTICKS = 0, - IO_IGNORE_AXES, IO_DEDICATED_MENU_BUTTONS, IO_AUTOPLAY, IO_DELAYED_ESCAPE, @@ -37,7 +36,6 @@ enum { * preferably alongside button configuration. */ OptionRow g_InputOptionsLines[NUM_INPUT_OPTIONS_LINES] = { OptionRow( "Auto Map\nJoysticks", true, "OFF","ON (recommended)" ), - OptionRow( "Ignore\nJoy Axes", true, "OFF","ON (for NTPad or DirectPad)" ), OptionRow( "Menu\nButtons", true, "USE GAMEPLAY BUTTONS","ONLY DEDICATED BUTTONS" ), OptionRow( "AutoPlay", true, "OFF","ON" ), OptionRow( "Back\nDelayed", true, "INSTANT","HOLD" ), @@ -63,7 +61,6 @@ ScreenInputOptions::ScreenInputOptions() : void ScreenInputOptions::ImportOptions() { m_iSelectedOption[0][IO_AUTO_MAP_JOYSTICKS] = PREFSMAN->m_bAutoMapJoysticks ? 1:0; - m_iSelectedOption[0][IO_IGNORE_AXES] = PREFSMAN->m_bIgnoreJoyAxes ? 1:0; m_iSelectedOption[0][IO_DEDICATED_MENU_BUTTONS] = PREFSMAN->m_bOnlyDedicatedMenuButtons ? 1:0; m_iSelectedOption[0][IO_AUTOPLAY] = PREFSMAN->m_bAutoPlay; m_iSelectedOption[0][IO_DELAYED_ESCAPE] = PREFSMAN->m_bDelayedEscape ? 1:0; @@ -77,7 +74,6 @@ void ScreenInputOptions::ImportOptions() void ScreenInputOptions::ExportOptions() { PREFSMAN->m_bAutoMapJoysticks = m_iSelectedOption[0][IO_AUTO_MAP_JOYSTICKS] == 1; - PREFSMAN->m_bIgnoreJoyAxes = m_iSelectedOption[0][IO_IGNORE_AXES] == 1; PREFSMAN->m_bOnlyDedicatedMenuButtons= m_iSelectedOption[0][IO_DEDICATED_MENU_BUTTONS] == 1; PREFSMAN->m_bDelayedEscape = m_iSelectedOption[0][IO_DELAYED_ESCAPE] == 1; PREFSMAN->m_bAutoPlay = m_iSelectedOption[0][IO_AUTOPLAY] == 1; diff --git a/stepmania/src/ScreenMapControllers.cpp b/stepmania/src/ScreenMapControllers.cpp index abfc095b30..a0d45236e8 100644 --- a/stepmania/src/ScreenMapControllers.cpp +++ b/stepmania/src/ScreenMapControllers.cpp @@ -119,12 +119,18 @@ void ScreenMapControllers::Update( float fDeltaTime ) { Screen::Update( fDeltaTime ); - for( int b=0; bGetCurrentGameDef()->m_iButtonsPerController; b++ ) - { - CString sButtonName = GAMESTATE->GetCurrentGameDef()->m_szButtonNames[b]; + + if( m_bWaitingForPress && m_DeviceIToMap.IsValid() ) // we're going to map an input + { + GameInput curGameI( (GameController)m_iCurController, + (GameButton)m_iCurButton ); - if( sButtonName == "Start" || sButtonName == "Back" ) - continue; + INPUTMAPPER->SetInputMap( m_DeviceIToMap, curGameI, m_iCurSlot ); + INPUTMAPPER->AddDefaultMappingsForCurrentGameIfUnmapped(); + // commit to disk so we don't lose the changes! + INPUTMAPPER->SaveMappingsToDisk(); + + m_bWaitingForPress = false; } } @@ -144,8 +150,22 @@ void ScreenMapControllers::Input( const DeviceInput& DeviceI, const InputEventTy LOG->Trace( "ScreenMapControllers::Input(): device: %d, button: %d", DeviceI.device, DeviceI.button ); - if( m_bWaitingForPress ) // we're going to map an input - { + // + // TRICKY: This eliminates the need for a separate "ignore joy axes" + // preference. Some adapters map the PlayStation digital d-pad to + // both axes and buttons. We want buttons to be used for + // any mappings where possible because presses of buttons aren't mutually + // exclusive and presses of axes are (e.g. can't read presses of both Left and + // Right simultaneously). So, when the user presses a button, we'll wait + // until the next Update before adding a mapping so that we get a chance + // to see all input events the user's press of a panel. This screen will be + // receive input events for joystick axes presses first, then the input events + // for button presses. We'll use the last input event received in the same + // Update so that a button presses are favored for mapping over axis presses. + // + + if( m_bWaitingForPress ) + { /* Don't allow function keys to be mapped. */ if ( DeviceI.device == DEVICE_KEYBOARD && (DeviceI.button >= SDLK_F1 && DeviceI.button <= SDLK_F12) ) { @@ -156,47 +176,11 @@ void ScreenMapControllers::Input( const DeviceInput& DeviceI, const InputEventTy m_textError.BeginTweening( 3 ); m_textError.BeginTweening( 1 ); m_textError.SetDiffuse( RageColor(0,1,0,0) ); - return; } - - static int axes[] = + else { - JOY_LEFT, JOY_RIGHT, JOY_UP, JOY_DOWN, - JOY_Z_UP, JOY_Z_DOWN, - JOY_ROT_UP, JOY_ROT_DOWN, JOY_ROT_LEFT, JOY_ROT_RIGHT, JOY_ROT_Z_UP, JOY_ROT_Z_DOWN, - JOY_HAT_LEFT, JOY_HAT_RIGHT, JOY_HAT_UP, JOY_HAT_DOWN, - JOY_AUX_1, JOY_AUX_2, JOY_AUX_3, JOY_AUX_4, - -1 - }; - - bool IsAxis = false; - for( int ax = 0; axes[ax] != -1; ++ax ) - if( DeviceI.button == axes[ax] ) - IsAxis = true; - - // ignore joystick D-Pad presses if the user has set their pref. - if( PREFSMAN->m_bIgnoreJoyAxes && IsAxis && DeviceI.IsJoystick() ) - { - //m_textError.SetText( "Game option is set to ignore the Joystick D-Pad." ); - //m_fErrorDisplayCountdown = 5; // show the error message - m_textError.StopTweening(); - m_textError.SetDiffuse( RageColor(0,1,0,1) ); - m_textError.BeginTweening( 3 ); - m_textError.BeginTweening( 1 ); - m_textError.SetDiffuse( RageColor(0,1,0,0) ); - - return; // ignore this press + m_DeviceIToMap = DeviceI; } - - GameInput curGameI( (GameController)m_iCurController, - (GameButton)m_iCurButton ); - - INPUTMAPPER->SetInputMap( DeviceI, curGameI, m_iCurSlot ); - INPUTMAPPER->AddDefaultMappingsForCurrentGameIfUnmapped(); - // commit to disk so we don't lose the changes! - INPUTMAPPER->SaveMappingsToDisk(); - - m_bWaitingForPress = false; } else if( DeviceI.device == DEVICE_KEYBOARD ) { @@ -257,7 +241,8 @@ void ScreenMapControllers::Input( const DeviceInput& DeviceI, const InputEventTy break; case SDLK_RETURN: /* Change the selection. */ case SDLK_KP_ENTER: - m_bWaitingForPress = true; + m_bWaitingForPress = true; + m_DeviceIToMap.MakeInvalid(); break; } } diff --git a/stepmania/src/ScreenMapControllers.h b/stepmania/src/ScreenMapControllers.h index 159b6b1f1b..b97a95f4b7 100644 --- a/stepmania/src/ScreenMapControllers.h +++ b/stepmania/src/ScreenMapControllers.h @@ -16,6 +16,7 @@ #include "GrayArrow.h" #include "InputMapper.h" #include "MenuElements.h" +#include "RageInputDevice.h" class ScreenMapControllers : public Screen @@ -43,7 +44,9 @@ private: int m_iCurController; int m_iCurButton; int m_iCurSlot; + bool m_bWaitingForPress; + DeviceInput m_DeviceIToMap; BitmapText m_textError; BitmapText m_textName[MAX_GAME_BUTTONS];