From e76d994ed59a2112038476dc298fa0ff7353984a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 9 Aug 2021 22:33:53 +0200 Subject: [PATCH] Improve default pad mapping for Android. Hide irrelevant options on Android TV. --- Core/KeyMap.cpp | 27 +++++++++++++++++---------- UI/GameSettingsScreen.cpp | 21 +++++++++++---------- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/Core/KeyMap.cpp b/Core/KeyMap.cpp index ad3e95cac9..46d39dd51a 100644 --- a/Core/KeyMap.cpp +++ b/Core/KeyMap.cpp @@ -211,22 +211,26 @@ static const DefMappingStruct defaultMOQI7SKeyMap[] = { }; static const DefMappingStruct defaultPadMap[] = { -#if defined(__ANDROID__) +#if PPSSPP_PLATFORM(ANDROID) {CTRL_CROSS , NKCODE_BUTTON_A}, {CTRL_CIRCLE , NKCODE_BUTTON_B}, {CTRL_SQUARE , NKCODE_BUTTON_X}, {CTRL_TRIANGLE , NKCODE_BUTTON_Y}, // The hat for DPAD is standard for bluetooth pads, which is the most likely pads on Android I think. {CTRL_LEFT , JOYSTICK_AXIS_HAT_X, -1}, + {CTRL_LEFT , NKCODE_DPAD_LEFT}, {CTRL_RIGHT , JOYSTICK_AXIS_HAT_X, +1}, + {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, {CTRL_UP , JOYSTICK_AXIS_HAT_Y, -1}, + {CTRL_UP , NKCODE_DPAD_UP}, {CTRL_DOWN , JOYSTICK_AXIS_HAT_Y, +1}, + {CTRL_DOWN , NKCODE_DPAD_DOWN}, {CTRL_START , NKCODE_BUTTON_START}, - {CTRL_SELECT , NKCODE_BUTTON_SELECT}, + {CTRL_SELECT , NKCODE_BACK}, {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, {VIRTKEY_UNTHROTTLE , NKCODE_BUTTON_R2}, - {VIRTKEY_PAUSE , NKCODE_BUTTON_THUMBR}, + {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, {VIRTKEY_SPEED_TOGGLE, NKCODE_BUTTON_L2}, {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, @@ -249,6 +253,7 @@ static const DefMappingStruct defaultPadMap[] = { {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, + {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, #endif }; @@ -936,17 +941,17 @@ void RestoreDefault() { // Autodetect a few common (and less common) devices std::string name = System_GetProperty(SYSPROP_NAME); if (IsNvidiaShield(name) || IsNvidiaShieldTV(name)) { - SetDefaultKeyMap(DEFAULT_MAPPING_SHIELD, true); + SetDefaultKeyMap(DEFAULT_MAPPING_SHIELD, false); } else if (IsOuya(name)) { - SetDefaultKeyMap(DEFAULT_MAPPING_OUYA, true); + SetDefaultKeyMap(DEFAULT_MAPPING_OUYA, false); } else if (IsXperiaPlay(name)) { - SetDefaultKeyMap(DEFAULT_MAPPING_XPERIA_PLAY, true); + SetDefaultKeyMap(DEFAULT_MAPPING_XPERIA_PLAY, false); } else if (IsMOQII7S(name)) { INFO_LOG(SYSTEM, "MOQI pad map"); - SetDefaultKeyMap(DEFAULT_MAPPING_MOQI_I7S, true); + SetDefaultKeyMap(DEFAULT_MAPPING_MOQI_I7S, false); } else { INFO_LOG(SYSTEM, "Default pad map"); - SetDefaultKeyMap(DEFAULT_MAPPING_PAD, true); + SetDefaultKeyMap(DEFAULT_MAPPING_PAD, false); } #else SetDefaultKeyMap(DEFAULT_MAPPING_KEYBOARD, true); @@ -1037,11 +1042,13 @@ void NotifyPadConnected(const std::string &name) { } void AutoConfForPad(const std::string &name) { + g_controllerMap.clear(); + INFO_LOG(SYSTEM, "Autoconfiguring pad for '%s'", name.c_str()); if (name == "Xbox 360 Pad") { - SetDefaultKeyMap(DEFAULT_MAPPING_X360, true); + SetDefaultKeyMap(DEFAULT_MAPPING_X360, false); } else { - SetDefaultKeyMap(DEFAULT_MAPPING_PAD, true); + SetDefaultKeyMap(DEFAULT_MAPPING_PAD, false); } #ifndef MOBILE_DEVICE diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 382ca9cbfc..4f987882cf 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -679,17 +679,18 @@ void GameSettingsScreen::CreateViews() { controlsSettings->Add(new CheckBox(&g_Config.bGamepadOnlyFocused, co->T("Ignore gamepads when not focused"))); #endif -#if defined(MOBILE_DEVICE) - controlsSettings->Add(new CheckBox(&g_Config.bHapticFeedback, co->T("HapticFeedback", "Haptic Feedback (vibration)"))); - static const char *tiltTypes[] = { "None (Disabled)", "Analog Stick", "D-PAD", "PSP Action Buttons", "L/R Trigger Buttons" }; - controlsSettings->Add(new PopupMultiChoice(&g_Config.iTiltInputType, co->T("Tilt Input Type"), tiltTypes, 0, ARRAY_SIZE(tiltTypes), co->GetName(), screenManager()))->OnClick.Handle(this, &GameSettingsScreen::OnTiltTypeChange); + if (System_GetPropertyInt(SYSPROP_DEVICE_TYPE) == DEVICE_TYPE_MOBILE) { + controlsSettings->Add(new CheckBox(&g_Config.bHapticFeedback, co->T("HapticFeedback", "Haptic Feedback (vibration)"))); - Choice *customizeTilt = controlsSettings->Add(new Choice(co->T("Customize tilt"))); - customizeTilt->OnClick.Handle(this, &GameSettingsScreen::OnTiltCustomize); - customizeTilt->SetEnabledFunc([] { - return g_Config.iTiltInputType != 0; - }); -#endif + static const char *tiltTypes[] = { "None (Disabled)", "Analog Stick", "D-PAD", "PSP Action Buttons", "L/R Trigger Buttons" }; + controlsSettings->Add(new PopupMultiChoice(&g_Config.iTiltInputType, co->T("Tilt Input Type"), tiltTypes, 0, ARRAY_SIZE(tiltTypes), co->GetName(), screenManager()))->OnClick.Handle(this, &GameSettingsScreen::OnTiltTypeChange); + + Choice *customizeTilt = controlsSettings->Add(new Choice(co->T("Customize tilt"))); + customizeTilt->OnClick.Handle(this, &GameSettingsScreen::OnTiltCustomize); + customizeTilt->SetEnabledFunc([] { + return g_Config.iTiltInputType != 0; + }); + } // TVs don't have touch control, at least not yet. if (System_GetPropertyInt(SYSPROP_DEVICE_TYPE) != DEVICE_TYPE_TV) {