From 9e3a03079cfa530fd3885e36d3f7214ec2348818 Mon Sep 17 00:00:00 2001 From: ewewukek Date: Wed, 10 Jan 2024 22:29:22 +0300 Subject: Use single tolerance value for all 4 joystick movement directions --- src/defaults.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'src/defaults.cpp') diff --git a/src/defaults.cpp b/src/defaults.cpp index 4869de8ef..30c5f3caf 100644 --- a/src/defaults.cpp +++ b/src/defaults.cpp @@ -194,10 +194,7 @@ void setConfigDefaults(Configuration &cfg) #else AddDEF("joystickEnabled", false); #endif - AddDEF("upTolerance", 100); - AddDEF("downTolerance", 100); - AddDEF("leftTolerance", 100); - AddDEF("rightTolerance", 100); + AddDEF("joystickTolerance", 10000); AddDEF("logNpcInGui", true); AddDEF("download-music", true); AddDEF("guialpha", 0.8F); -- cgit v1.2.3-70-g09d2 From 84a11a02aad86d9388175c7fd0971accdb586473 Mon Sep 17 00:00:00 2001 From: ewewukek Date: Wed, 10 Jan 2024 23:26:42 +0300 Subject: Switch joystick axis tolerance type to float --- src/defaults.cpp | 2 +- src/gui/widgets/tabs/setup_joystick.cpp | 14 ++++++++------ src/input/joystick.cpp | 12 ++++++------ src/input/joystick.h | 13 +++++++++++-- 4 files changed, 26 insertions(+), 15 deletions(-) (limited to 'src/defaults.cpp') diff --git a/src/defaults.cpp b/src/defaults.cpp index 30c5f3caf..462a278c3 100644 --- a/src/defaults.cpp +++ b/src/defaults.cpp @@ -194,7 +194,7 @@ void setConfigDefaults(Configuration &cfg) #else AddDEF("joystickEnabled", false); #endif - AddDEF("joystickTolerance", 10000); + AddDEF("joystickTolerance", 0.1F); AddDEF("logNpcInGui", true); AddDEF("download-music", true); AddDEF("guialpha", 0.8F); diff --git a/src/gui/widgets/tabs/setup_joystick.cpp b/src/gui/widgets/tabs/setup_joystick.cpp index 3542f39a5..c7ece8c7a 100644 --- a/src/gui/widgets/tabs/setup_joystick.cpp +++ b/src/gui/widgets/tabs/setup_joystick.cpp @@ -54,7 +54,7 @@ Setup_Joystick::Setup_Joystick(const Widget2 *const widget) : mNamesDropDown(new DropDown(this, mNamesModel, false, Modal_false, nullptr, std::string())), mToleranceLabel(new Label(this)), - mToleranceSlider(new Slider(this, 1000, 32767, 1000)), + mToleranceSlider(new Slider(this, 0.01, 1, 0.01)), mUseInactiveCheckBox(new CheckBox(this, // TRANSLATORS: joystick settings tab checkbox _("Use joystick if client window inactive"), @@ -71,10 +71,11 @@ Setup_Joystick::Setup_Joystick(const Widget2 *const widget) : mJoystickEnabled->setActionEventId("joystick"); mJoystickEnabled->addActionListener(this); - int tolerance = config.getIntValue("joystickTolerance"); + float tolerance = config.getFloatValue("joystickTolerance"); mToleranceSlider->setValue(tolerance); // TRANSLATORS: joystick settings tab label - mToleranceLabel->setCaption(_("Axis tolerance: ") + strprintf("%d", tolerance)); + mToleranceLabel->setCaption(_("Axis tolerance: ") + + strprintf("%.2f", tolerance)); mToleranceLabel->setWidth(150); mToleranceLabel->setHeight(20); @@ -130,9 +131,10 @@ void Setup_Joystick::action(const ActionEvent &event) } else if (source == mToleranceSlider) { - int tolerance = mToleranceSlider->getValue(); + float tolerance = mToleranceSlider->getValue(); // TRANSLATORS: joystick settings tab label - mToleranceLabel->setCaption(_("Axis tolerance: ") + strprintf("%d", tolerance)); + mToleranceLabel->setCaption(_("Axis tolerance: ") + + strprintf("%.2f", tolerance)); } else if (source == mDetectButton) { @@ -177,7 +179,7 @@ void Setup_Joystick::apply() config.setValue("useInactiveJoystick", mUseInactiveCheckBox->isSelected()); joystick->setUseInactive(mUseInactiveCheckBox->isSelected()); - int tolerance = mToleranceSlider->getValue(); + float tolerance = mToleranceSlider->getValue(); config.setValue("joystickTolerance", tolerance); joystick->setTolerance(tolerance); } diff --git a/src/input/joystick.cpp b/src/input/joystick.cpp index 4bcb070d3..0ab6102c5 100644 --- a/src/input/joystick.cpp +++ b/src/input/joystick.cpp @@ -195,9 +195,9 @@ bool Joystick::open() mButtonsNumber = MAX_BUTTONS; #ifdef __SWITCH__ - config.setValue("joystickTolerance", 10000); + config.setValue("joystickTolerance", 0.1F); #endif - mTolerance = config.getIntValue("joystickTolerance"); + mTolerance = config.getFloatValue("joystickTolerance"); mUseInactive = config.getBoolValue("useInactiveJoystick"); return true; @@ -243,16 +243,16 @@ void Joystick::logic() { // X-Axis int position = SDL_JoystickGetAxis(mJoystick, 0); - if (position >= mTolerance) + if (position >= mTolerance * SDL_JOYSTICK_AXIS_MAX) mDirection |= RIGHT; - else if (position <= -mTolerance) + else if (position <= mTolerance * SDL_JOYSTICK_AXIS_MIN) mDirection |= LEFT; // Y-Axis position = SDL_JoystickGetAxis(mJoystick, 1); - if (position <= -mTolerance) + if (position <= mTolerance * SDL_JOYSTICK_AXIS_MIN) mDirection |= UP; - else if (position >= mTolerance) + else if (position >= mTolerance * SDL_JOYSTICK_AXIS_MAX) mDirection |= DOWN; #ifdef DEBUG_JOYSTICK diff --git a/src/input/joystick.h b/src/input/joystick.h index d90420395..32fdddf2e 100644 --- a/src/input/joystick.h +++ b/src/input/joystick.h @@ -31,6 +31,15 @@ PRAGMA48(GCC diagnostic ignored "-Wshadow") #include PRAGMA48(GCC diagnostic pop) +// defined first in SDL 2.0.6 +// not available on older distros +#ifndef SDL_JOYSTICK_AXIS_MIN +#define SDL_JOYSTICK_AXIS_MIN -32768 +#endif +#ifndef SDL_JOYSTICK_AXIS_MAX +#define SDL_JOYSTICK_AXIS_MAX 32767 +#endif + class Joystick final { public: @@ -115,7 +124,7 @@ class Joystick final int getNumber() const noexcept2 A_WARN_UNUSED { return mNumber; } - void setTolerance(const int tolerance) + void setTolerance(const float tolerance) { mTolerance = tolerance; } void setUseInactive(const bool b) @@ -144,7 +153,7 @@ class Joystick final SDL_Joystick *mJoystick; - int mTolerance; + float mTolerance; int mNumber; int mButtonsNumber; bool mUseInactive; -- cgit v1.2.3-70-g09d2 From 046ac8fceda89092f01325abbc8d2b5b8602719c Mon Sep 17 00:00:00 2001 From: ewewukek Date: Thu, 11 Jan 2024 13:03:53 +0300 Subject: Add a checkbox for d-pad to switch between movement and button behavior --- src/defaults.cpp | 1 + src/gui/widgets/tabs/setup_joystick.cpp | 22 +++++++++++++---- src/gui/widgets/tabs/setup_joystick.h | 1 + src/input/joystick.cpp | 44 ++++++++++++++++++++------------- src/input/joystick.h | 4 +++ 5 files changed, 50 insertions(+), 22 deletions(-) (limited to 'src/defaults.cpp') diff --git a/src/defaults.cpp b/src/defaults.cpp index 462a278c3..2c990c42f 100644 --- a/src/defaults.cpp +++ b/src/defaults.cpp @@ -195,6 +195,7 @@ void setConfigDefaults(Configuration &cfg) AddDEF("joystickEnabled", false); #endif AddDEF("joystickTolerance", 0.1F); + AddDEF("useHatForMovement", true); AddDEF("logNpcInGui", true); AddDEF("download-music", true); AddDEF("guialpha", 0.8F); diff --git a/src/gui/widgets/tabs/setup_joystick.cpp b/src/gui/widgets/tabs/setup_joystick.cpp index c7ece8c7a..860f7a251 100644 --- a/src/gui/widgets/tabs/setup_joystick.cpp +++ b/src/gui/widgets/tabs/setup_joystick.cpp @@ -55,6 +55,11 @@ Setup_Joystick::Setup_Joystick(const Widget2 *const widget) : false, Modal_false, nullptr, std::string())), mToleranceLabel(new Label(this)), mToleranceSlider(new Slider(this, 0.01, 1, 0.01)), + mUseHatForMovementCheckBox(new CheckBox(this, + // TRANSLATORS: joystick settings tab checkbox + _("Use joystick hat (d-pad) for movement"), + config.getBoolValue("useHatForMovement"), + nullptr, std::string())), mUseInactiveCheckBox(new CheckBox(this, // TRANSLATORS: joystick settings tab checkbox _("Use joystick if client window inactive"), @@ -106,10 +111,11 @@ Setup_Joystick::Setup_Joystick(const Widget2 *const widget) : place(0, 2, mToleranceSlider, 1, 1); place(1, 2, mToleranceLabel, 1, 1).setPadding(3); - place(0, 3, mUseInactiveCheckBox, 1, 1); - place(0, 4, mDetectButton, 1, 1); + place(0, 3, mUseHatForMovementCheckBox, 1, 1); + place(0, 4, mUseInactiveCheckBox, 1, 1); + place(0, 5, mDetectButton, 1, 1); - setDimension(Rect(0, 0, 365, 60)); + setDimension(Rect(0, 0, 365, 75)); } Setup_Joystick::~Setup_Joystick() @@ -176,8 +182,14 @@ void Setup_Joystick::apply() config.setValue("joystickEnabled", Joystick::isEnabled()); - config.setValue("useInactiveJoystick", mUseInactiveCheckBox->isSelected()); - joystick->setUseInactive(mUseInactiveCheckBox->isSelected()); + config.setValue("useHatForMovement", + mUseHatForMovementCheckBox->isSelected()); + joystick->setUseHatForMovement( + mUseHatForMovementCheckBox->isSelected()); + config.setValue("useInactiveJoystick", + mUseInactiveCheckBox->isSelected()); + joystick->setUseInactive( + mUseInactiveCheckBox->isSelected()); float tolerance = mToleranceSlider->getValue(); config.setValue("joystickTolerance", tolerance); diff --git a/src/gui/widgets/tabs/setup_joystick.h b/src/gui/widgets/tabs/setup_joystick.h index fce59a02c..2c138daf5 100644 --- a/src/gui/widgets/tabs/setup_joystick.h +++ b/src/gui/widgets/tabs/setup_joystick.h @@ -57,6 +57,7 @@ class Setup_Joystick final : public SetupTab DropDown *mNamesDropDown A_NONNULLPOINTER; Label *mToleranceLabel A_NONNULLPOINTER; Slider *mToleranceSlider A_NONNULLPOINTER; + CheckBox *mUseHatForMovementCheckBox A_NONNULLPOINTER; CheckBox *mUseInactiveCheckBox A_NONNULLPOINTER; bool mOriginalJoystickEnabled A_NONNULLPOINTER; }; diff --git a/src/input/joystick.cpp b/src/input/joystick.cpp index 59087c2c7..01414b4dc 100644 --- a/src/input/joystick.cpp +++ b/src/input/joystick.cpp @@ -52,6 +52,7 @@ Joystick::Joystick(const int no) : mTolerance(0), mNumber(no >= joystickCount ? joystickCount : no), mButtonsNumber(MAX_BUTTONS), + mUseHatForMovement(true), mUseInactive(false), mHaveHats(false), mKeyToAction(), @@ -199,6 +200,7 @@ bool Joystick::open() config.setValue("joystickTolerance", 0.1F); #endif mTolerance = config.getFloatValue("joystickTolerance"); + mUseHatForMovement = config.getBoolValue("useHatForMovement"); mUseInactive = config.getBoolValue("useInactiveJoystick"); return true; @@ -278,6 +280,8 @@ void Joystick::logic() mHatPosition |= UP; else if ((hat & SDL_HAT_DOWN) != 0) mHatPosition |= DOWN; + if ((mDirection == 0U) && mUseHatForMovement) + mDirection = mHatPosition; } // Buttons @@ -310,14 +314,17 @@ bool Joystick::buttonPressed(const int no) const return false; if (no < MAX_BUTTONS) return mActiveButtons[no]; - if (no == KEY_UP) - return (mHatPosition & UP) != 0; - if (no == KEY_DOWN) - return (mHatPosition & DOWN) != 0; - if (no == KEY_LEFT) - return (mHatPosition & LEFT) != 0; - if (no == KEY_RIGHT) - return (mHatPosition & RIGHT) != 0; + if (!mUseHatForMovement) + { + if (no == KEY_UP) + return (mHatPosition & UP) != 0; + if (no == KEY_DOWN) + return (mHatPosition & DOWN) != 0; + if (no == KEY_LEFT) + return (mHatPosition & LEFT) != 0; + if (no == KEY_RIGHT) + return (mHatPosition & RIGHT) != 0; + } return false; } @@ -358,7 +365,7 @@ int Joystick::getButtonFromEvent(const SDL_Event &event) const return -1; return event.jbutton.button; } - if (event.type == SDL_JOYHATMOTION) + if (!mUseHatForMovement && event.type == SDL_JOYHATMOTION) { // reading only hat 0 if (event.jhat.which != mNumber || event.jhat.hat != 0) @@ -415,14 +422,17 @@ void Joystick::handleRepeat(const int time) if (mActiveButtons[key]) repeat = true; } - if (key == KEY_UP && (mHatPosition & UP) != 0) - repeat = true; - if (key == KEY_DOWN && (mHatPosition & DOWN) != 0) - repeat = true; - if (key == KEY_LEFT && (mHatPosition & LEFT) != 0) - repeat = true; - if (key == KEY_RIGHT && (mHatPosition & RIGHT) != 0) - repeat = true; + if (!mUseHatForMovement) + { + if (key == KEY_UP && (mHatPosition & UP) != 0) + repeat = true; + if (key == KEY_DOWN && (mHatPosition & DOWN) != 0) + repeat = true; + if (key == KEY_LEFT && (mHatPosition & LEFT) != 0) + repeat = true; + if (key == KEY_RIGHT && (mHatPosition & RIGHT) != 0) + repeat = true; + } if (repeat) { int &keyTime = (*it).second; diff --git a/src/input/joystick.h b/src/input/joystick.h index bddf520a2..805efa6ad 100644 --- a/src/input/joystick.h +++ b/src/input/joystick.h @@ -139,6 +139,9 @@ class Joystick final void setTolerance(const float tolerance) { mTolerance = tolerance; } + void setUseHatForMovement(const bool b) + { mUseHatForMovement = b; } + void setUseInactive(const bool b) { mUseInactive = b; } @@ -169,6 +172,7 @@ class Joystick final float mTolerance; int mNumber; int mButtonsNumber; + bool mUseHatForMovement; bool mUseInactive; bool mHaveHats; -- cgit v1.2.3-70-g09d2 From a4d7bdc0bbd269d64fc885769908b79ff1b85041 Mon Sep 17 00:00:00 2001 From: ewewukek Date: Thu, 4 Apr 2024 14:30:14 +0300 Subject: Enable joystick by default, update default tolerance --- src/defaults.cpp | 6 +----- src/input/joystick.cpp | 3 --- 2 files changed, 1 insertion(+), 8 deletions(-) (limited to 'src/defaults.cpp') diff --git a/src/defaults.cpp b/src/defaults.cpp index 2c990c42f..3c663309f 100644 --- a/src/defaults.cpp +++ b/src/defaults.cpp @@ -189,12 +189,8 @@ void setConfigDefaults(Configuration &cfg) AddDEF("screenshotDirectory3", ""); AddDEF("useScreenshotDirectorySuffix", true); AddDEF("screenshotDirectorySuffix", ""); -#ifdef __SWITCH__ AddDEF("joystickEnabled", true); -#else - AddDEF("joystickEnabled", false); -#endif - AddDEF("joystickTolerance", 0.1F); + AddDEF("joystickTolerance", 0.3F); AddDEF("useHatForMovement", true); AddDEF("logNpcInGui", true); AddDEF("download-music", true); diff --git a/src/input/joystick.cpp b/src/input/joystick.cpp index 1072d3892..ea1883ad0 100644 --- a/src/input/joystick.cpp +++ b/src/input/joystick.cpp @@ -207,9 +207,6 @@ bool Joystick::open() if (mButtonsNumber > MAX_BUTTONS) mButtonsNumber = MAX_BUTTONS; -#ifdef __SWITCH__ - config.setValue("joystickTolerance", 0.1F); -#endif mTolerance = config.getFloatValue("joystickTolerance"); mUseHatForMovement = config.getBoolValue("useHatForMovement"); mUseInactive = config.getBoolValue("useInactiveJoystick"); -- cgit v1.2.3-70-g09d2