BACKEND: Allow SDL2 mapping of L2/R2, fix psp2/switch mapping

This commit is contained in:
rsn8887 2020-02-07 13:38:17 -06:00
parent 31ecbd086d
commit eea70a3c8c
8 changed files with 121 additions and 1 deletions

View file

@ -89,7 +89,7 @@ void SdlEventSource::loadGameControllerMappingFile() {
SdlEventSource::SdlEventSource() SdlEventSource::SdlEventSource()
: EventSource(), _scrollLock(false), _joystick(0), _lastScreenID(0), _graphicsManager(0), _queuedFakeMouseMove(false), _lastHatPosition(SDL_HAT_CENTERED) : EventSource(), _scrollLock(false), _joystick(0), _lastScreenID(0), _graphicsManager(0), _queuedFakeMouseMove(false), _lastHatPosition(SDL_HAT_CENTERED)
#if SDL_VERSION_ATLEAST(2, 0, 0) #if SDL_VERSION_ATLEAST(2, 0, 0)
, _queuedFakeKeyUp(false), _fakeKeyUp(), _controller(nullptr) , _queuedFakeKeyUp(false), _fakeKeyUp(), _controller(nullptr), _leftTriggerDown(false), _rightTriggerDown(false)
#endif #endif
{ {
// Reset mouse state // Reset mouse state
@ -1064,6 +1064,48 @@ bool SdlEventSource::handleControllerAxisMotion(const SDL_Event &ev, Common::Eve
return handleAxisToMouseMotion(_km.joy_x, _km.joy_y); return handleAxisToMouseMotion(_km.joy_x, _km.joy_y);
} }
// Left trigger is treated as axis in SDL
if (ev.caxis.axis == SDL_CONTROLLER_AXIS_TRIGGERLEFT) {
if (ev.caxis.value < 8192) { // 25% pressed
if (_leftTriggerDown) {
_leftTriggerDown = false;
event.type = Common::EVENT_JOYBUTTON_UP;
event.joystick.button = Common::JOYSTICK_BUTTON_LEFT_TRIGGER;
return true;
} else
return false;
} else if (ev.caxis.value > 16384) { // 50% pressed
if (!_leftTriggerDown) {
_leftTriggerDown = true;
event.type = Common::EVENT_JOYBUTTON_DOWN;
event.joystick.button = Common::JOYSTICK_BUTTON_LEFT_TRIGGER;
return true;
} else
return false;
}
}
// Right trigger is treated as axis in SDL
if (ev.caxis.axis == SDL_CONTROLLER_AXIS_TRIGGERRIGHT) {
if (ev.caxis.value < 8192) { // 25% pressed
if (_rightTriggerDown) {
_rightTriggerDown = false;
event.type = Common::EVENT_JOYBUTTON_UP;
event.joystick.button = Common::JOYSTICK_BUTTON_RIGHT_TRIGGER;
return true;
} else
return false;
} else if (ev.caxis.value > 16384) { // 50% pressed
if (!_rightTriggerDown) {
_rightTriggerDown = true;
event.type = Common::EVENT_JOYBUTTON_DOWN;
event.joystick.button = Common::JOYSTICK_BUTTON_RIGHT_TRIGGER;
return true;
} else
return false;
}
}
return false; return false;
} }
#endif #endif

View file

@ -84,6 +84,10 @@ protected:
#if SDL_VERSION_ATLEAST(2, 0, 0) #if SDL_VERSION_ATLEAST(2, 0, 0)
/** Game controller */ /** Game controller */
SDL_GameController *_controller; SDL_GameController *_controller;
/** keep memory of current trigger status */
bool _leftTriggerDown;
bool _rightTriggerDown;
#endif #endif
/** Last screen id for checking if it was modified */ /** Last screen id for checking if it was modified */

View file

@ -236,6 +236,8 @@ const HardwareInputTableEntry defaultJoystickButtons[] = {
{ "JOY_RIGHT_STICK", JOYSTICK_BUTTON_RIGHT_STICK, _s("Right Stick") }, { "JOY_RIGHT_STICK", JOYSTICK_BUTTON_RIGHT_STICK, _s("Right Stick") },
{ "JOY_LEFT_SHOULDER", JOYSTICK_BUTTON_LEFT_SHOULDER, _s("Left Shoulder") }, { "JOY_LEFT_SHOULDER", JOYSTICK_BUTTON_LEFT_SHOULDER, _s("Left Shoulder") },
{ "JOY_RIGHT_SHOULDER", JOYSTICK_BUTTON_RIGHT_SHOULDER, _s("Right Shoulder") }, { "JOY_RIGHT_SHOULDER", JOYSTICK_BUTTON_RIGHT_SHOULDER, _s("Right Shoulder") },
{ "JOY_LEFT_TRIGGER", JOYSTICK_BUTTON_LEFT_TRIGGER, _s("Left Trigger") },
{ "JOY_RIGHT_TRIGGER", JOYSTICK_BUTTON_RIGHT_TRIGGER, _s("Right Trigger") },
{ "JOY_UP", JOYSTICK_BUTTON_DPAD_UP, _s("D-pad Up") }, { "JOY_UP", JOYSTICK_BUTTON_DPAD_UP, _s("D-pad Up") },
{ "JOY_DOWN", JOYSTICK_BUTTON_DPAD_DOWN, _s("D-pad Down") }, { "JOY_DOWN", JOYSTICK_BUTTON_DPAD_DOWN, _s("D-pad Down") },
{ "JOY_LEFT", JOYSTICK_BUTTON_DPAD_LEFT, _s("D-pad Left") }, { "JOY_LEFT", JOYSTICK_BUTTON_DPAD_LEFT, _s("D-pad Left") },

View file

@ -26,6 +26,7 @@
#include "common/scummsys.h" #include "common/scummsys.h"
#include "common/config-manager.h" #include "common/config-manager.h"
#include "common/debug-channels.h" #include "common/debug-channels.h"
#include "common/translation.h"
#include "backends/platform/sdl/psp2/psp2.h" #include "backends/platform/sdl/psp2/psp2.h"
#include "backends/graphics/psp2sdl/psp2sdl-graphics.h" #include "backends/graphics/psp2sdl/psp2sdl-graphics.h"
#include "backends/saves/default/default-saves.h" #include "backends/saves/default/default-saves.h"
@ -33,12 +34,30 @@
#include "backends/fs/psp2/psp2-fs-factory.h" #include "backends/fs/psp2/psp2-fs-factory.h"
#include "backends/events/psp2sdl/psp2sdl-events.h" #include "backends/events/psp2sdl/psp2sdl-events.h"
#include "backends/fs/psp2/psp2-dirent.h" #include "backends/fs/psp2/psp2-dirent.h"
#include "backends/keymapper/hardware-input.h"
#include <sys/stat.h> #include <sys/stat.h>
#ifdef __PSP2_DEBUG__ #ifdef __PSP2_DEBUG__
#include <psp2shell.h> #include <psp2shell.h>
#endif #endif
static const Common::HardwareInputTableEntry psp2JoystickButtons[] = {
{ "JOY_A", Common::JOYSTICK_BUTTON_A, _s("Cross") },
{ "JOY_B", Common::JOYSTICK_BUTTON_B, _s("Circle") },
{ "JOY_X", Common::JOYSTICK_BUTTON_X, _s("Square") },
{ "JOY_Y", Common::JOYSTICK_BUTTON_Y, _s("Triangle") },
{ "JOY_BACK", Common::JOYSTICK_BUTTON_BACK, _s("Select") },
{ "JOY_START", Common::JOYSTICK_BUTTON_START, _s("Start") },
{ "JOY_LEFT_SHOULDER", Common::JOYSTICK_BUTTON_LEFT_SHOULDER, _s("L") },
{ "JOY_RIGHT_SHOULDER", Common::JOYSTICK_BUTTON_RIGHT_SHOULDER, _s("R") },
{ "JOY_UP", Common::JOYSTICK_BUTTON_DPAD_UP, _s("D-pad Up") },
{ "JOY_DOWN", Common::JOYSTICK_BUTTON_DPAD_DOWN, _s("D-pad Down") },
{ "JOY_LEFT", Common::JOYSTICK_BUTTON_DPAD_LEFT, _s("D-pad Left") },
{ "JOY_RIGHT", Common::JOYSTICK_BUTTON_DPAD_RIGHT, _s("D-pad Right") },
{ nullptr, 0, nullptr }
};
int access(const char *pathname, int mode) { int access(const char *pathname, int mode) {
struct stat sb; struct stat sb;
@ -174,3 +193,16 @@ Common::String OSystem_PSP2::getDefaultConfigFileName() {
Common::String OSystem_PSP2::getDefaultLogFileName() { Common::String OSystem_PSP2::getDefaultLogFileName() {
return "ux0:data/scummvm/scummvm.log"; return "ux0:data/scummvm/scummvm.log";
} }
Common::HardwareInputSet *OSystem_PSP2::getHardwareInputSet() {
using namespace Common;
CompositeHardwareInputSet *inputSet = new CompositeHardwareInputSet();
// Users may use USB / bluetooth mice and keyboards
inputSet->addHardwareInputSet(new MouseHardwareInputSet(defaultMouseButtons));
inputSet->addHardwareInputSet(new KeyboardHardwareInputSet(defaultKeys, defaultModifiers));
inputSet->addHardwareInputSet(new JoystickHardwareInputSet(psp2JoystickButtons));
return inputSet;
}

View file

@ -36,6 +36,7 @@ public:
virtual void setFeatureState(Feature f, bool enable) override; virtual void setFeatureState(Feature f, bool enable) override;
virtual bool getFeatureState(Feature f) override; virtual bool getFeatureState(Feature f) override;
virtual void logMessage(LogMessageType::Type type, const char *message) override; virtual void logMessage(LogMessageType::Type type, const char *message) override;
virtual Common::HardwareInputSet *getHardwareInputSet() override;
protected: protected:
virtual Common::String getDefaultConfigFileName() override; virtual Common::String getDefaultConfigFileName() override;

View file

@ -24,11 +24,34 @@
#include "common/scummsys.h" #include "common/scummsys.h"
#include "common/config-manager.h" #include "common/config-manager.h"
#include "common/translation.h"
#include "backends/platform/sdl/switch/switch.h" #include "backends/platform/sdl/switch/switch.h"
#include "backends/events/switchsdl/switchsdl-events.h" #include "backends/events/switchsdl/switchsdl-events.h"
#include "backends/saves/posix/posix-saves.h" #include "backends/saves/posix/posix-saves.h"
#include "backends/fs/posix/posix-fs-factory.h" #include "backends/fs/posix/posix-fs-factory.h"
#include "backends/fs/posix/posix-fs.h" #include "backends/fs/posix/posix-fs.h"
#include "backends/keymapper/hardware-input.h"
static const Common::HardwareInputTableEntry switchJoystickButtons[] = {
{ "JOY_A", Common::JOYSTICK_BUTTON_A, _s("B") },
{ "JOY_B", Common::JOYSTICK_BUTTON_B, _s("A") },
{ "JOY_X", Common::JOYSTICK_BUTTON_X, _s("Y") },
{ "JOY_Y", Common::JOYSTICK_BUTTON_Y, _s("X") },
{ "JOY_BACK", Common::JOYSTICK_BUTTON_BACK, _s("Minus") },
{ "JOY_START", Common::JOYSTICK_BUTTON_START, _s("Plus") },
{ "JOY_LEFT_STICK", Common::JOYSTICK_BUTTON_LEFT_STICK, _s("L3") },
{ "JOY_RIGHT_STICK", Common::JOYSTICK_BUTTON_RIGHT_STICK, _s("R3") },
{ "JOY_LEFT_SHOULDER", Common::JOYSTICK_BUTTON_LEFT_SHOULDER, _s("L") },
{ "JOY_RIGHT_SHOULDER", Common::JOYSTICK_BUTTON_RIGHT_SHOULDER, _s("R") },
{ "JOY_LEFT_TRIGGER", Common::JOYSTICK_BUTTON_LEFT_TRIGGER, _s("ZL") },
{ "JOY_RIGHT_TRIGGER", Common::JOYSTICK_BUTTON_RIGHT_TRIGGER, _s("ZR") },
{ "JOY_UP", Common::JOYSTICK_BUTTON_DPAD_UP, _s("D-pad Up") },
{ "JOY_DOWN", Common::JOYSTICK_BUTTON_DPAD_DOWN, _s("D-pad Down") },
{ "JOY_LEFT", Common::JOYSTICK_BUTTON_DPAD_LEFT, _s("D-pad Left") },
{ "JOY_RIGHT", Common::JOYSTICK_BUTTON_DPAD_RIGHT, _s("D-pad Right") },
{ nullptr, 0, nullptr }
};
void OSystem_Switch::init() { void OSystem_Switch::init() {
@ -125,3 +148,16 @@ void OSystem_Switch::logMessage(LogMessageType::Type type, const char *message)
Common::String OSystem_Switch::getDefaultLogFileName() { Common::String OSystem_Switch::getDefaultLogFileName() {
return "scummvm.log"; return "scummvm.log";
} }
Common::HardwareInputSet *OSystem_Switch::getHardwareInputSet() {
using namespace Common;
CompositeHardwareInputSet *inputSet = new CompositeHardwareInputSet();
// Users may use USB / bluetooth mice and keyboards
inputSet->addHardwareInputSet(new MouseHardwareInputSet(defaultMouseButtons));
inputSet->addHardwareInputSet(new KeyboardHardwareInputSet(defaultKeys, defaultModifiers));
inputSet->addHardwareInputSet(new JoystickHardwareInputSet(switchJoystickButtons));
return inputSet;
}

View file

@ -33,6 +33,7 @@ public:
virtual void setFeatureState(Feature f, bool enable) override; virtual void setFeatureState(Feature f, bool enable) override;
virtual bool getFeatureState(Feature f) override; virtual bool getFeatureState(Feature f) override;
virtual void logMessage(LogMessageType::Type type, const char *message) override; virtual void logMessage(LogMessageType::Type type, const char *message) override;
virtual Common::HardwareInputSet *getHardwareInputSet() override;
protected: protected:
virtual Common::String getDefaultLogFileName() override; virtual Common::String getDefaultLogFileName() override;

View file

@ -131,6 +131,8 @@ enum JoystickButton {
JOYSTICK_BUTTON_RIGHT_STICK, JOYSTICK_BUTTON_RIGHT_STICK,
JOYSTICK_BUTTON_LEFT_SHOULDER, JOYSTICK_BUTTON_LEFT_SHOULDER,
JOYSTICK_BUTTON_RIGHT_SHOULDER, JOYSTICK_BUTTON_RIGHT_SHOULDER,
JOYSTICK_BUTTON_LEFT_TRIGGER,
JOYSTICK_BUTTON_RIGHT_TRIGGER,
JOYSTICK_BUTTON_DPAD_UP, JOYSTICK_BUTTON_DPAD_UP,
JOYSTICK_BUTTON_DPAD_DOWN, JOYSTICK_BUTTON_DPAD_DOWN,
JOYSTICK_BUTTON_DPAD_LEFT, JOYSTICK_BUTTON_DPAD_LEFT,