diff --git a/Core/Config.cpp b/Core/Config.cpp index 48f2b7e86c..c03217a517 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -289,14 +289,7 @@ static const ConfigSetting generalSettings[] = { ConfigSetting("RightAnalogPress", SETTING(g_Config, iRightAnalogPress), 0, CfgFlag::PER_GAME), ConfigSetting("RightAnalogCustom", SETTING(g_Config, bRightAnalogCustom), false, CfgFlag::PER_GAME), ConfigSetting("RightAnalogDisableDiagonal", SETTING(g_Config, bRightAnalogDisableDiagonal), false, CfgFlag::PER_GAME), - ConfigSetting("SwipeUp", SETTING(g_Config, iSwipeUp), 0, CfgFlag::PER_GAME), - ConfigSetting("SwipeDown", SETTING(g_Config, iSwipeDown), 0, CfgFlag::PER_GAME), - ConfigSetting("SwipeLeft", SETTING(g_Config, iSwipeLeft), 0, CfgFlag::PER_GAME), - ConfigSetting("SwipeRight", SETTING(g_Config, iSwipeRight), 0, CfgFlag::PER_GAME), - ConfigSetting("SwipeSensitivity", SETTING(g_Config, fSwipeSensitivity), 1.0f, CfgFlag::PER_GAME), - ConfigSetting("SwipeSmoothing", SETTING(g_Config, fSwipeSmoothing), 0.3f, CfgFlag::PER_GAME), - ConfigSetting("DoubleTapGesture", SETTING(g_Config, iDoubleTapGesture), 0, CfgFlag::PER_GAME), - ConfigSetting("GestureControlEnabled", SETTING(g_Config, bGestureControlEnabled), false, CfgFlag::PER_GAME), + ConfigSetting("TouchGliding", SETTING(g_Config, bTouchGliding), false, CfgFlag::PER_GAME), // "default" means let emulator decide, "" means disable. @@ -680,6 +673,27 @@ static const ConfigSetting displayLayoutSettings[] = { ConfigSetting("ImmersiveMode", SETTING(g_Config.displayLayoutLandscape, bImmersiveMode), CfgFlag::PER_GAME), }; +bool GestureControlConfig::ResetToDefault(std::string_view blockName) { + static const GestureControlConfig defaultLayout; + *this = defaultLayout; + // TODO: Check blockname to set defaults differently for secondary zone(s). + return true; +} + +// These were previously mostly part of General (which was wrong). +static const ConfigSetting gestureControlSettings[] = { + ConfigSetting("SwipeUp", SETTING(g_Config.gestureControlsZone1, iSwipeUp), 0, CfgFlag::PER_GAME), + ConfigSetting("SwipeDown", SETTING(g_Config.gestureControlsZone1, iSwipeDown), 0, CfgFlag::PER_GAME), + ConfigSetting("SwipeLeft", SETTING(g_Config.gestureControlsZone1, iSwipeLeft), 0, CfgFlag::PER_GAME), + ConfigSetting("SwipeRight", SETTING(g_Config.gestureControlsZone1, iSwipeRight), 0, CfgFlag::PER_GAME), + ConfigSetting("SwipeSensitivity", SETTING(g_Config.gestureControlsZone1, fSwipeSensitivity), 1.0f, CfgFlag::PER_GAME), + ConfigSetting("SwipeSmoothing", SETTING(g_Config.gestureControlsZone1, fSwipeSmoothing), 0.3f, CfgFlag::PER_GAME), + ConfigSetting("DoubleTapGesture", SETTING(g_Config.gestureControlsZone1, iDoubleTapGesture), 0, CfgFlag::PER_GAME), + ConfigSetting("GestureControlEnabled", SETTING(g_Config.gestureControlsZone1, bGestureControlEnabled), false, CfgFlag::PER_GAME), + ConfigSetting("AnalogGesture", SETTING(g_Config.gestureControlsZone1, bAnalogGesture), false, CfgFlag::PER_GAME), + ConfigSetting("AnalogGestureSensibility", SETTING(g_Config.gestureControlsZone1, fAnalogGestureSensibility), 1.0f, CfgFlag::PER_GAME), +}; + static const ConfigSetting graphicsSettings[] = { ConfigSetting("iShowStatusFlags", SETTING(g_Config, iShowStatusFlags), 0, CfgFlag::PER_GAME), ConfigSetting("GraphicsBackend", SETTING(g_Config, iGPUBackend), &DefaultGPUBackend, &GPUBackendTranslator::To, &GPUBackendTranslator::From, CfgFlag::DEFAULT | CfgFlag::REPORT), @@ -1012,9 +1026,6 @@ static const ConfigSetting controlSettings[] = { ConfigSetting("SystemControls", SETTING(g_Config, bSystemControls), true, CfgFlag::DEFAULT), ConfigSetting("RapidFileInterval", SETTING(g_Config, iRapidFireInterval), 5, CfgFlag::DEFAULT), - - ConfigSetting("AnalogGesture", SETTING(g_Config, bAnalogGesture), false, CfgFlag::PER_GAME), - ConfigSetting("AnalogGestureSensibility", SETTING(g_Config, fAnalogGestureSensibility), 1.0f, CfgFlag::PER_GAME), }; static const ConfigSetting networkSettings[] = { @@ -1139,6 +1150,7 @@ static const ConfigSectionMeta g_sectionMeta[] = { { &g_Config.displayLayoutPortrait, displayLayoutSettings, ARRAY_SIZE(displayLayoutSettings), "DisplayLayout.Portrait"}, // These we don't want to read from the old settings, since for most people, those settings will be bad. { &g_Config.touchControlsLandscape, touchControlSettings, ARRAY_SIZE(touchControlSettings), "TouchControls.Landscape", "Control" }, // We read the old settings from [Control], since most people played in landscape before. { &g_Config.touchControlsPortrait, touchControlSettings, ARRAY_SIZE(touchControlSettings), "TouchControls.Portrait"}, // These we don't want to read from the old settings, since for most people, those settings will be bad. + { &g_Config.gestureControlsZone1, gestureControlSettings, ARRAY_SIZE(gestureControlSettings), "GestureControls.Zone1", "General"}, // We read the old settings from [General], since most of them used to be there (except the analog stuff). }; ConfigBlock *GetConfigBlockForSection(std::string_view sectionName) { @@ -1257,7 +1269,8 @@ void Config::ReadAllSettings(const IniFile &iniFile) { applyDefaultPerSetting = false; } for (size_t j = 0; j < meta.settingsCount; j++) { - meta.settings[j].ReadFromIniSection(configBlock, section, applyDefaultPerSetting); + const ConfigSetting &setting = meta.settings[j]; + setting.ReadFromIniSection(configBlock, section, applyDefaultPerSetting); } } } diff --git a/Core/Config.h b/Core/Config.h index 6503645764..6ac3158976 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -145,6 +145,24 @@ struct TouchControlConfig : public ConfigBlock { size_t Size() const override { return sizeof(TouchControlConfig); } // For sanity checks }; +struct GestureControlConfig : public ConfigBlock { + // Motion gesture controller + bool bGestureControlEnabled = false; + int iSwipeUp = 0; + int iSwipeDown = 0; + int iSwipeLeft = 0; + int iSwipeRight = 0; + float fSwipeSensitivity = 1.0f; + float fSwipeSmoothing = 0.5f; + int iDoubleTapGesture = 0; + bool bAnalogGesture = false; + float fAnalogGestureSensibility = 1.0f; + + bool CanResetToDefault() const override { return true; } + bool ResetToDefault(std::string_view blockName) override; + size_t Size() const override { return sizeof(GestureControlConfig); } // For sanity checks +}; + struct Config : public ConfigBlock { public: ~Config(); @@ -444,17 +462,8 @@ public: bool bRightAnalogCustom; bool bRightAnalogDisableDiagonal; - // Motion gesture controller - bool bGestureControlEnabled; - int iSwipeUp; - int iSwipeDown; - int iSwipeLeft; - int iSwipeRight; - float fSwipeSensitivity; - float fSwipeSmoothing; - int iDoubleTapGesture; - bool bAnalogGesture; - float fAnalogGestureSensibility; + // Currently only one zone, but we will split this into left/right probably. + GestureControlConfig gestureControlsZone1; // Controls Visibility bool bShowTouchControls = false; diff --git a/Core/ConfigSettings.cpp b/Core/ConfigSettings.cpp index 9dfeaf6522..d0062dc447 100644 --- a/Core/ConfigSettings.cpp +++ b/Core/ConfigSettings.cpp @@ -14,7 +14,7 @@ bool ConfigSetting::PerGame(void *ptr) { bool ConfigSetting::ReadFromIniSection(ConfigBlock *configBlock, const Section *section, bool applyDefaultIfMissing) const { char *owner = (char *)configBlock; - _dbg_assert_(offset_ >= 0 && offset_ < configBlock->Size()); + _dbg_assert_msg_(offset_ >= 0 && offset_ < configBlock->Size(), "offset: %d size: %d", (int)offset_, (int)configBlock->Size()); switch (type_) { case Type::TYPE_BOOL: diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 9cb812e3a1..99ca53f3ad 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -2021,28 +2021,30 @@ void GestureMappingScreen::CreateGestureTab(UI::LinearLayout *vert) { auto co = GetI18NCategory(I18NCat::CONTROLS); auto mc = GetI18NCategory(I18NCat::MAPPABLECONTROLS); - static const char *gestureButton[ARRAY_SIZE(GestureKey::keyList)+1]; + static const char *gestureButton[ARRAY_SIZE(GestureKey::keyList) + 1]; gestureButton[0] = "None"; for (int i = 1; i < ARRAY_SIZE(gestureButton); ++i) { - gestureButton[i] = KeyMap::GetPspButtonNameCharPointer(GestureKey::keyList[i-1]); + gestureButton[i] = KeyMap::GetPspButtonNameCharPointer(GestureKey::keyList[i - 1]); } - vert->Add(new CheckBox(&g_Config.bGestureControlEnabled, co->T("Enable gesture control"))); + GestureControlConfig &zone = g_Config.gestureControlsZone1; + + vert->Add(new CheckBox(&zone.bGestureControlEnabled, co->T("Enable gesture control"))); vert->Add(new ItemHeader(co->T("Swipe"))); - vert->Add(new PopupMultiChoice(&g_Config.iSwipeUp, mc->T("Swipe Up"), gestureButton, 0, ARRAY_SIZE(gestureButton), I18NCat::MAPPABLECONTROLS, screenManager()))->SetEnabledPtr(&g_Config.bGestureControlEnabled); - vert->Add(new PopupMultiChoice(&g_Config.iSwipeDown, mc->T("Swipe Down"), gestureButton, 0, ARRAY_SIZE(gestureButton), I18NCat::MAPPABLECONTROLS, screenManager()))->SetEnabledPtr(&g_Config.bGestureControlEnabled); - vert->Add(new PopupMultiChoice(&g_Config.iSwipeLeft, mc->T("Swipe Left"), gestureButton, 0, ARRAY_SIZE(gestureButton), I18NCat::MAPPABLECONTROLS, screenManager()))->SetEnabledPtr(&g_Config.bGestureControlEnabled); - vert->Add(new PopupMultiChoice(&g_Config.iSwipeRight, mc->T("Swipe Right"), gestureButton, 0, ARRAY_SIZE(gestureButton), I18NCat::MAPPABLECONTROLS, screenManager()))->SetEnabledPtr(&g_Config.bGestureControlEnabled); - vert->Add(new PopupSliderChoiceFloat(&g_Config.fSwipeSensitivity, 0.01f, 1.0f, 1.0f, co->T("Swipe sensitivity"), 0.01f, screenManager(), "x"))->SetEnabledPtr(&g_Config.bGestureControlEnabled); - vert->Add(new PopupSliderChoiceFloat(&g_Config.fSwipeSmoothing, 0.0f, 0.95f, 0.3f, co->T("Swipe smoothing"), 0.05f, screenManager(), "x"))->SetEnabledPtr(&g_Config.bGestureControlEnabled); + vert->Add(new PopupMultiChoice(&zone.iSwipeUp, mc->T("Swipe Up"), gestureButton, 0, ARRAY_SIZE(gestureButton), I18NCat::MAPPABLECONTROLS, screenManager()))->SetEnabledPtr(&zone.bGestureControlEnabled); + vert->Add(new PopupMultiChoice(&zone.iSwipeDown, mc->T("Swipe Down"), gestureButton, 0, ARRAY_SIZE(gestureButton), I18NCat::MAPPABLECONTROLS, screenManager()))->SetEnabledPtr(&zone.bGestureControlEnabled); + vert->Add(new PopupMultiChoice(&zone.iSwipeLeft, mc->T("Swipe Left"), gestureButton, 0, ARRAY_SIZE(gestureButton), I18NCat::MAPPABLECONTROLS, screenManager()))->SetEnabledPtr(&zone.bGestureControlEnabled); + vert->Add(new PopupMultiChoice(&zone.iSwipeRight, mc->T("Swipe Right"), gestureButton, 0, ARRAY_SIZE(gestureButton), I18NCat::MAPPABLECONTROLS, screenManager()))->SetEnabledPtr(&zone.bGestureControlEnabled); + vert->Add(new PopupSliderChoiceFloat(&zone.fSwipeSensitivity, 0.01f, 1.0f, 1.0f, co->T("Swipe sensitivity"), 0.01f, screenManager(), "x"))->SetEnabledPtr(&zone.bGestureControlEnabled); + vert->Add(new PopupSliderChoiceFloat(&zone.fSwipeSmoothing, 0.0f, 0.95f, 0.3f, co->T("Swipe smoothing"), 0.05f, screenManager(), "x"))->SetEnabledPtr(&zone.bGestureControlEnabled); vert->Add(new ItemHeader(co->T("Double tap"))); - vert->Add(new PopupMultiChoice(&g_Config.iDoubleTapGesture, mc->T("Double tap button"), gestureButton, 0, ARRAY_SIZE(gestureButton), I18NCat::MAPPABLECONTROLS, screenManager()))->SetEnabledPtr(&g_Config.bGestureControlEnabled); + vert->Add(new PopupMultiChoice(&zone.iDoubleTapGesture, mc->T("Double tap button"), gestureButton, 0, ARRAY_SIZE(gestureButton), I18NCat::MAPPABLECONTROLS, screenManager()))->SetEnabledPtr(&zone.bGestureControlEnabled); vert->Add(new ItemHeader(co->T("Analog Stick"))); - vert->Add(new CheckBox(&g_Config.bAnalogGesture, co->T("Enable analog stick gesture"))); - vert->Add(new PopupSliderChoiceFloat(&g_Config.fAnalogGestureSensibility, 0.01f, 5.0f, 1.0f, co->T("Sensitivity"), 0.01f, screenManager(), "x"))->SetEnabledPtr(&g_Config.bAnalogGesture); + vert->Add(new CheckBox(&zone.bAnalogGesture, co->T("Enable analog stick gesture"))); + vert->Add(new PopupSliderChoiceFloat(&zone.fAnalogGestureSensibility, 0.01f, 5.0f, 1.0f, co->T("Sensitivity"), 0.01f, screenManager(), "x"))->SetEnabledPtr(&zone.bAnalogGesture); } RestoreSettingsScreen::RestoreSettingsScreen(std::string_view title) diff --git a/UI/GamepadEmu.cpp b/UI/GamepadEmu.cpp index 39199b4322..943b0a9de4 100644 --- a/UI/GamepadEmu.cpp +++ b/UI/GamepadEmu.cpp @@ -1029,7 +1029,7 @@ GamepadEmuView::GamepadEmuView(const TouchControlConfig &config, float xres, flo addCustomButton(g_Config.CustomButton[i], temp, config.touchCustom[i]); } - if (g_Config.bGestureControlEnabled) { + if (g_Config.gestureControlsZone1.bGestureControlEnabled) { Add(new GestureGamepad(controlMapper)); } } @@ -1053,7 +1053,14 @@ void GamepadEmuView::Update() { } } +const GestureControlConfig &GestureGamepad::GetZone() { + // TODO: Add support for multiple zones. + return g_Config.gestureControlsZone1; +} + bool GestureGamepad::Touch(const TouchInput &input) { + const GestureControlConfig &zone = GetZone(); + if (usedPointerMask & (1 << input.id)) { if (input.id == dragPointerId_) dragPointerId_ = -1; @@ -1074,8 +1081,8 @@ bool GestureGamepad::Touch(const TouchInput &input) { downY_ = input.y; const float now = time_now_d(); if (now - lastTapRelease_ < 0.3f && !haveDoubleTapped_) { - if (g_Config.iDoubleTapGesture != 0 ) - controlMapper_->PSPKey(DEVICE_ID_TOUCH, GestureKey::keyList[g_Config.iDoubleTapGesture-1], KeyInputFlags::DOWN); + if (zone.iDoubleTapGesture != 0 ) + controlMapper_->PSPKey(DEVICE_ID_TOUCH, GestureKey::keyList[zone.iDoubleTapGesture - 1], KeyInputFlags::DOWN); haveDoubleTapped_ = true; } @@ -1089,8 +1096,8 @@ bool GestureGamepad::Touch(const TouchInput &input) { lastX_ = input.x; lastY_ = input.y; - if (g_Config.bAnalogGesture) { - const float k = g_Config.fAnalogGestureSensibility * 0.02; + if (zone.bAnalogGesture) { + const float k = zone.fAnalogGestureSensibility * 0.02; float dx = (input.x - downX_)*g_display.dpi_scale_x * k; float dy = (input.y - downY_)*g_display.dpi_scale_y * k; dx = std::min(1.0f, std::max(-1.0f, dx)); @@ -1106,12 +1113,12 @@ bool GestureGamepad::Touch(const TouchInput &input) { lastTapRelease_ = time_now_d(); if (haveDoubleTapped_) { - if (g_Config.iDoubleTapGesture != 0) - controlMapper_->PSPKey(DEVICE_ID_TOUCH, GestureKey::keyList[g_Config.iDoubleTapGesture-1], KeyInputFlags::UP); + if (zone.iDoubleTapGesture != 0) + controlMapper_->PSPKey(DEVICE_ID_TOUCH, GestureKey::keyList[zone.iDoubleTapGesture - 1], KeyInputFlags::UP); haveDoubleTapped_ = false; } - if (g_Config.bAnalogGesture) + if (zone.bAnalogGesture) __CtrlSetAnalogXY(0, 0, 0); } } @@ -1125,51 +1132,52 @@ void GestureGamepad::Draw(UIContext &dc) { uint32_t colorBg = colorAlpha(GetButtonColor(), opacity); - if (g_Config.bAnalogGesture && dragPointerId_ != -1) { + if (GetZone().bAnalogGesture && dragPointerId_ != -1) { dc.Draw()->DrawImage(ImageID("I_CIRCLE"), downX_, downY_, 0.7f, colorBg, ALIGN_CENTER); } } void GestureGamepad::Update() { const float th = 1.0f; - float dx = deltaX_ * g_display.dpi_scale_x * g_Config.fSwipeSensitivity; - float dy = deltaY_ * g_display.dpi_scale_y * g_Config.fSwipeSensitivity; - if (g_Config.iSwipeRight != 0) { + float dx = deltaX_ * g_display.dpi_scale_x * GetZone().fSwipeSensitivity; + float dy = deltaY_ * g_display.dpi_scale_y * GetZone().fSwipeSensitivity; + if (GetZone().iSwipeRight != 0) { if (dx > th) { - controlMapper_->PSPKey(DEVICE_ID_TOUCH, GestureKey::keyList[g_Config.iSwipeRight-1], KeyInputFlags::DOWN); + controlMapper_->PSPKey(DEVICE_ID_TOUCH, GestureKey::keyList[GetZone().iSwipeRight - 1], KeyInputFlags::DOWN); swipeRightReleased_ = false; } else if (!swipeRightReleased_) { - controlMapper_->PSPKey(DEVICE_ID_TOUCH, GestureKey::keyList[g_Config.iSwipeRight-1], KeyInputFlags::UP); + controlMapper_->PSPKey(DEVICE_ID_TOUCH, GestureKey::keyList[GetZone().iSwipeRight -1], KeyInputFlags::UP); swipeRightReleased_ = true; } } - if (g_Config.iSwipeLeft != 0) { + if (GetZone().iSwipeLeft != 0) { if (dx < -th) { - controlMapper_->PSPKey(DEVICE_ID_TOUCH, GestureKey::keyList[g_Config.iSwipeLeft-1], KeyInputFlags::DOWN); + controlMapper_->PSPKey(DEVICE_ID_TOUCH, GestureKey::keyList[GetZone().iSwipeLeft - 1], KeyInputFlags::DOWN); swipeLeftReleased_ = false; } else if (!swipeLeftReleased_) { - controlMapper_->PSPKey(DEVICE_ID_TOUCH, GestureKey::keyList[g_Config.iSwipeLeft-1], KeyInputFlags::UP); + controlMapper_->PSPKey(DEVICE_ID_TOUCH, GestureKey::keyList[GetZone().iSwipeLeft - 1], KeyInputFlags::UP); swipeLeftReleased_ = true; } } - if (g_Config.iSwipeUp != 0) { + if (GetZone().iSwipeUp != 0) { if (dy < -th) { - controlMapper_->PSPKey(DEVICE_ID_TOUCH, GestureKey::keyList[g_Config.iSwipeUp-1], KeyInputFlags::DOWN); + controlMapper_->PSPKey(DEVICE_ID_TOUCH, GestureKey::keyList[GetZone().iSwipeUp - 1], KeyInputFlags::DOWN); swipeUpReleased_ = false; } else if (!swipeUpReleased_) { - controlMapper_->PSPKey(DEVICE_ID_TOUCH, GestureKey::keyList[g_Config.iSwipeUp-1], KeyInputFlags::UP); + controlMapper_->PSPKey(DEVICE_ID_TOUCH, GestureKey::keyList[GetZone().iSwipeUp - 1], KeyInputFlags::UP); swipeUpReleased_ = true; } } - if (g_Config.iSwipeDown != 0) { + if (GetZone().iSwipeDown != 0) { if (dy > th) { - controlMapper_->PSPKey(DEVICE_ID_TOUCH, GestureKey::keyList[g_Config.iSwipeDown-1], KeyInputFlags::DOWN); + controlMapper_->PSPKey(DEVICE_ID_TOUCH, GestureKey::keyList[GetZone().iSwipeDown - 1], KeyInputFlags::DOWN); swipeDownReleased_ = false; } else if (!swipeDownReleased_) { - controlMapper_->PSPKey(DEVICE_ID_TOUCH, GestureKey::keyList[g_Config.iSwipeDown-1], KeyInputFlags::UP); + controlMapper_->PSPKey(DEVICE_ID_TOUCH, GestureKey::keyList[GetZone().iSwipeDown - 1], KeyInputFlags::UP); swipeDownReleased_ = true; } } - deltaX_ *= g_Config.fSwipeSmoothing; - deltaY_ *= g_Config.fSwipeSmoothing; + const float smoothing = GetZone().fSwipeSmoothing; + deltaX_ *= smoothing; + deltaY_ *= smoothing; } diff --git a/UI/GamepadEmu.h b/UI/GamepadEmu.h index 416c978a7c..e00c6835a0 100644 --- a/UI/GamepadEmu.h +++ b/UI/GamepadEmu.h @@ -206,6 +206,8 @@ private: bool invertedContentDimension_; // Swap width and height }; +struct GestureControlConfig; + class GestureGamepad : public UI::View { public: explicit GestureGamepad(ControlMapper* controlMapper) : controlMapper_(controlMapper) {} @@ -214,7 +216,8 @@ public: void Update() override; void Draw(UIContext &dc) override; -protected: +private: + const GestureControlConfig &GetZone(); float lastX_ = 0.0f; float lastY_ = 0.0f; diff --git a/android/jni/app-android.cpp b/android/jni/app-android.cpp index 8143b25d21..cb0b70ec50 100644 --- a/android/jni/app-android.cpp +++ b/android/jni/app-android.cpp @@ -4,6 +4,10 @@ // It calls a set of methods defined in NativeApp.h. These should be implemented // by your game or app. +#include "ppsspp_config.h" + +#if PPSSPP_PLATFORM(ANDROID) + #include #include @@ -1839,3 +1843,5 @@ Java_org_ppsspp_ppsspp_ShortcutActivity_queryGameInfo(JNIEnv * env, jclass, jobj } return result; } + +#endif diff --git a/assets/lang/sv_SE.ini b/assets/lang/sv_SE.ini index b7bfdb7e00..238d18eab1 100644 --- a/assets/lang/sv_SE.ini +++ b/assets/lang/sv_SE.ini @@ -846,7 +846,7 @@ Analog Stick = Analog-sticka Audio/Video Recording = Audio/Video-inspelning AxisSwap = Byt axlar Circle = Cirkel -Cross = X +Cross = Kryss Custom %d = Anpassad %d D-pad down = D-pad down D-pad left = D-pad left