[Scummvm-git-logs] scummvm master -> 9cc2fee8878937bfc4a3ce8f8560473169ae9d50
bgK
bastien.bouclet at gmail.com
Mon Mar 16 17:41:31 UTC 2020
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
9cc2fee887 SDL: Enable joystick input by default
Commit: 9cc2fee8878937bfc4a3ce8f8560473169ae9d50
https://github.com/scummvm/scummvm/commit/9cc2fee8878937bfc4a3ce8f8560473169ae9d50
Author: Bastien Bouclet (bastien.bouclet at gmail.com)
Date: 2020-03-16T18:41:27+01:00
Commit Message:
SDL: Enable joystick input by default
Game controller input is now enabled whenever a compatible device is
connected. The keymapper's keymaps are refreshed when a joystick is added
or removed.
Fixes #10366.
Changed paths:
backends/events/default/default-events.cpp
backends/events/sdl/sdl-events.cpp
backends/events/sdl/sdl-events.h
backends/keymapper/keymap.h
backends/keymapper/keymapper.cpp
backends/keymapper/keymapper.h
backends/keymapper/remap-widget.cpp
backends/keymapper/remap-widget.h
backends/platform/3ds/osystem.cpp
backends/platform/sdl/sdl.cpp
backends/platform/sdl/switch/switch.cpp
base/commandLine.cpp
base/main.cpp
common/events.h
gui/options.cpp
gui/options.h
diff --git a/backends/events/default/default-events.cpp b/backends/events/default/default-events.cpp
index 8781b1ce7f..5fa5de8cee 100644
--- a/backends/events/default/default-events.cpp
+++ b/backends/events/default/default-events.cpp
@@ -220,6 +220,14 @@ bool DefaultEventManager::pollEvent(Common::Event &event) {
break;
}
+ case Common::EVENT_INPUT_CHANGED: {
+ Common::HardwareInputSet *inputSet = g_system->getHardwareInputSet();
+ Common::KeymapperDefaultBindings *backendDefaultBindings = g_system->getKeymapperDefaultBindings();
+
+ _keymapper->registerHardwareInputSet(inputSet, backendDefaultBindings);
+ break;
+ }
+
default:
break;
}
diff --git a/backends/events/sdl/sdl-events.cpp b/backends/events/sdl/sdl-events.cpp
index a218457248..f70f8c2ec8 100644
--- a/backends/events/sdl/sdl-events.cpp
+++ b/backends/events/sdl/sdl-events.cpp
@@ -527,10 +527,10 @@ bool SdlEventSource::dispatchSDLEvent(SDL_Event &ev, Common::Event &event) {
}
case SDL_JOYDEVICEADDED:
- return handleJoystickAdded(ev.jdevice);
+ return handleJoystickAdded(ev.jdevice, event);
case SDL_JOYDEVICEREMOVED:
- return handleJoystickRemoved(ev.jdevice);
+ return handleJoystickRemoved(ev.jdevice, event);
case SDL_DROPFILE:
event.type = Common::EVENT_DROP_FILE;
@@ -722,7 +722,7 @@ void SdlEventSource::openJoystick(int joystickIndex) {
);
}
} else {
- warning("Invalid joystick: %d", joystickIndex);
+ debug(5, "Invalid joystick: %d", joystickIndex);
}
}
@@ -823,21 +823,24 @@ bool SdlEventSource::handleJoyHatMotion(SDL_Event &ev, Common::Event &event) {
}
#if SDL_VERSION_ATLEAST(2, 0, 0)
-bool SdlEventSource::handleJoystickAdded(const SDL_JoyDeviceEvent &device) {
+bool SdlEventSource::handleJoystickAdded(const SDL_JoyDeviceEvent &device, Common::Event &event) {
debug(5, "SdlEventSource: Received joystick added event for index '%d'", device.which);
int joystick_num = ConfMan.getInt("joystick_num");
- if (joystick_num == device.which) {
- debug(5, "SdlEventSource: Newly added joystick with index '%d' matches 'joysticky_num', trying to use it", device.which);
-
- closeJoystick();
- openJoystick(joystick_num);
+ if (joystick_num != device.which) {
+ return false;
}
- return false;
+ debug(5, "SdlEventSource: Newly added joystick with index '%d' matches 'joysticky_num', trying to use it", device.which);
+
+ closeJoystick();
+ openJoystick(joystick_num);
+
+ event.type = Common::EVENT_INPUT_CHANGED;
+ return true;
}
-bool SdlEventSource::handleJoystickRemoved(const SDL_JoyDeviceEvent &device) {
+bool SdlEventSource::handleJoystickRemoved(const SDL_JoyDeviceEvent &device, Common::Event &event) {
debug(5, "SdlEventSource: Received joystick removed event for instance id '%d'", device.which);
SDL_Joystick *joystick;
@@ -851,13 +854,16 @@ bool SdlEventSource::handleJoystickRemoved(const SDL_JoyDeviceEvent &device) {
return false;
}
- if (SDL_JoystickInstanceID(joystick) == device.which) {
- debug(5, "SdlEventSource: Newly removed joystick with instance id '%d' matches currently used joystick, closing current joystick", device.which);
-
- closeJoystick();
+ if (SDL_JoystickInstanceID(joystick) != device.which) {
+ return false;
}
- return false;
+ debug(5, "SdlEventSource: Newly removed joystick with instance id '%d' matches currently used joystick, closing current joystick", device.which);
+
+ closeJoystick();
+
+ event.type = Common::EVENT_INPUT_CHANGED;
+ return true;
}
int SdlEventSource::mapSDLControllerButtonToOSystem(Uint8 sdlButton) {
@@ -917,6 +923,14 @@ void SdlEventSource::fakeWarpMouse(const int x, const int y) {
_fakeMouseMove.mouse = Common::Point(x, y);
}
+bool SdlEventSource::isJoystickConnected() const {
+ return _joystick
+#if SDL_VERSION_ATLEAST(2, 0, 0)
+ || _controller
+#endif
+ ;
+}
+
bool SdlEventSource::handleResizeEvent(Common::Event &event, int w, int h) {
if (_graphicsManager) {
_graphicsManager->notifyResize(w, h);
diff --git a/backends/events/sdl/sdl-events.h b/backends/events/sdl/sdl-events.h
index 746e7f8d59..90454dad2e 100644
--- a/backends/events/sdl/sdl-events.h
+++ b/backends/events/sdl/sdl-events.h
@@ -56,6 +56,9 @@ public:
*/
void fakeWarpMouse(const int x, const int y);
+ /** Returns whether a joystick is currently connected */
+ bool isJoystickConnected() const;
+
protected:
/** Scroll lock state - since SDL doesn't track it */
bool _scrollLock;
@@ -131,8 +134,8 @@ protected:
virtual bool handleJoyHatMotion(SDL_Event &ev, Common::Event &event);
#if SDL_VERSION_ATLEAST(2, 0, 0)
- virtual bool handleJoystickAdded(const SDL_JoyDeviceEvent &event);
- virtual bool handleJoystickRemoved(const SDL_JoyDeviceEvent &device);
+ virtual bool handleJoystickAdded(const SDL_JoyDeviceEvent &device, Common::Event &event);
+ virtual bool handleJoystickRemoved(const SDL_JoyDeviceEvent &device, Common::Event &event);
virtual int mapSDLControllerButtonToOSystem(Uint8 sdlButton);
virtual bool handleControllerButton(const SDL_Event &ev, Common::Event &event, bool buttonUp);
virtual bool handleControllerAxisMotion(const SDL_Event &ev, Common::Event &event);
diff --git a/backends/keymapper/keymap.h b/backends/keymapper/keymap.h
index d860c4107d..2f4d5680a2 100644
--- a/backends/keymapper/keymap.h
+++ b/backends/keymapper/keymap.h
@@ -144,7 +144,6 @@ public:
/**
* Save this keymap's mappings to the config manager
* @note Changes are *not* flushed to disk, to do so call ConfMan.flushToDisk()
- * @note Changes are *not* flushed to disk, to do so call ConfMan.flushToDisk()
*/
void saveMappings();
diff --git a/backends/keymapper/keymapper.cpp b/backends/keymapper/keymapper.cpp
index 37f1776689..a823611792 100644
--- a/backends/keymapper/keymapper.cpp
+++ b/backends/keymapper/keymapper.cpp
@@ -62,9 +62,16 @@ void Keymapper::clear() {
_hardwareInputs = nullptr;
}
-void Keymapper::registerHardwareInputSet(HardwareInputSet *inputs) {
- if (_hardwareInputs)
- error("Hardware input set already registered");
+void Keymapper::registerHardwareInputSet(HardwareInputSet *inputs, KeymapperDefaultBindings *backendDefaultBindings) {
+ bool reloadMappings = false;
+ if (_hardwareInputs) {
+ reloadMappings = true;
+ delete _hardwareInputs;
+ }
+ if (_backendDefaultBindings) {
+ reloadMappings = true;
+ delete _backendDefaultBindings;
+ }
if (!inputs) {
warning("No hardware input were defined, using defaults");
@@ -75,13 +82,11 @@ void Keymapper::registerHardwareInputSet(HardwareInputSet *inputs) {
}
_hardwareInputs = inputs;
-}
-
-void Keymapper::registerBackendDefaultBindings(KeymapperDefaultBindings *backendDefaultBindings) {
- if (!_keymaps.empty())
- error("Backend default bindings must be defined before adding keymaps");
-
_backendDefaultBindings = backendDefaultBindings;
+
+ if (reloadMappings) {
+ reloadAllMappings();
+ }
}
void Keymapper::addGlobalKeymap(Keymap *keymap) {
@@ -113,6 +118,10 @@ void Keymapper::initKeymap(Keymap *keymap, ConfigManager::Domain *domain) {
}
keymap->setConfigDomain(domain);
+ reloadKeymapMappings(keymap);
+}
+
+void Keymapper::reloadKeymapMappings(Keymap *keymap) {
keymap->setHardwareInputs(_hardwareInputs);
keymap->setBackendDefaultBindings(_backendDefaultBindings);
keymap->loadMappings();
@@ -143,7 +152,7 @@ Keymap *Keymapper::getKeymap(const String &id) const {
void Keymapper::reloadAllMappings() {
for (uint i = 0; i < _keymaps.size(); i++) {
- _keymaps[i]->loadMappings();
+ reloadKeymapMappings(_keymaps[i]);
}
}
diff --git a/backends/keymapper/keymapper.h b/backends/keymapper/keymapper.h
index 9e524ec33a..26bc90d769 100644
--- a/backends/keymapper/keymapper.h
+++ b/backends/keymapper/keymapper.h
@@ -52,19 +52,11 @@ public:
virtual List<Event> mapEvent(const Event &ev);
/**
- * Registers a HardwareInputSet with the Keymapper
- * @note should only be called once (during backend initialisation)
+ * Registers a HardwareInputSet and platform-specific default mappings with the Keymapper
*
* Transfers ownership to the Keymapper
*/
- void registerHardwareInputSet(HardwareInputSet *inputs);
-
- /**
- * Registers platform-specific default mappings for keymap actions
- *
- * Transfers ownership to the Keymapper
- */
- void registerBackendDefaultBindings(KeymapperDefaultBindings *backendDefaultBindings);
+ void registerHardwareInputSet(HardwareInputSet *inputs, KeymapperDefaultBindings *backendDefaultBindings);
/**
* Add a keymap to the global domain.
@@ -131,6 +123,7 @@ public:
HardwareInput findHardwareInput(const Event &event);
void initKeymap(Keymap *keymap, ConfigManager::Domain *domain);
+ void reloadKeymapMappings(Keymap *keymap);
private:
EventManager *_eventMan;
diff --git a/backends/keymapper/remap-widget.cpp b/backends/keymapper/remap-widget.cpp
index 46e82f47a4..dd5f291040 100644
--- a/backends/keymapper/remap-widget.cpp
+++ b/backends/keymapper/remap-widget.cpp
@@ -93,6 +93,17 @@ bool RemapWidget::save() {
return changes;
}
+void RemapWidget::handleInputChanged() {
+ Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+ assert(keymapper);
+
+ for (uint i = 0; i < _keymapTable.size(); i++) {
+ keymapper->reloadKeymapMappings(_keymapTable[i]);
+ }
+
+ refreshKeymap();
+}
+
void RemapWidget::reflowActionWidgets() {
int buttonHeight = g_gui.xmlEval()->getVar("Globals.Button.Height", 0);
diff --git a/backends/keymapper/remap-widget.h b/backends/keymapper/remap-widget.h
index 112f5addcf..cbcbfb2c37 100644
--- a/backends/keymapper/remap-widget.h
+++ b/backends/keymapper/remap-widget.h
@@ -51,6 +51,7 @@ public:
~RemapWidget() override;
void build();
bool save();
+ void handleInputChanged();
void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) override;
void handleMouseDown(int x, int y, int button, int clickCount) override;
void handleTickle() override;
diff --git a/backends/platform/3ds/osystem.cpp b/backends/platform/3ds/osystem.cpp
index ce68f97815..6c405cffab 100644
--- a/backends/platform/3ds/osystem.cpp
+++ b/backends/platform/3ds/osystem.cpp
@@ -125,7 +125,6 @@ void OSystem_3DS::quit() {
void OSystem_3DS::initBackend() {
loadConfig();
- ConfMan.set("joystick_num", 0);
ConfMan.registerDefault("fullscreen", true);
ConfMan.registerDefault("aspect_ratio", true);
if (!ConfMan.hasKey("vkeybd_pack_name")) {
diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp
index f4cb7a0678..de2d908511 100644
--- a/backends/platform/sdl/sdl.cpp
+++ b/backends/platform/sdl/sdl.cpp
@@ -177,8 +177,7 @@ bool OSystem_SDL::hasFeature(Feature f) {
if (f == kFeatureClipboardSupport) return true;
#endif
if (f == kFeatureJoystickDeadzone || f == kFeatureKbdMouseSpeed) {
- bool joystickSupportEnabled = ConfMan.getInt("joystick_num") >= 0;
- return joystickSupportEnabled;
+ return _eventSource->isJoystickConnected();
}
return ModularBackend::hasFeature(f);
}
@@ -403,8 +402,7 @@ Common::HardwareInputSet *OSystem_SDL::getHardwareInputSet() {
inputSet->addHardwareInputSet(new MouseHardwareInputSet(defaultMouseButtons));
inputSet->addHardwareInputSet(new KeyboardHardwareInputSet(defaultKeys, defaultModifiers));
- bool joystickSupportEnabled = ConfMan.getInt("joystick_num") >= 0;
- if (joystickSupportEnabled) {
+ if (_eventSource->isJoystickConnected()) {
inputSet->addHardwareInputSet(new JoystickHardwareInputSet(defaultJoystickButtons, defaultJoystickAxes));
}
diff --git a/backends/platform/sdl/switch/switch.cpp b/backends/platform/sdl/switch/switch.cpp
index da25386337..ba30f77ec9 100644
--- a/backends/platform/sdl/switch/switch.cpp
+++ b/backends/platform/sdl/switch/switch.cpp
@@ -71,7 +71,6 @@ void OSystem_Switch::init() {
void OSystem_Switch::initBackend() {
- ConfMan.registerDefault("joystick_num", 0);
ConfMan.registerDefault("fullscreen", true);
ConfMan.registerDefault("aspect_ratio", false);
ConfMan.registerDefault("gfx_mode", "2x");
@@ -80,10 +79,8 @@ void OSystem_Switch::initBackend() {
ConfMan.registerDefault("touchpad_mouse_mode", false);
ConfMan.setBool("fullscreen", true);
+ ConfMan.setInt("joystick_num", 0);
- if (!ConfMan.hasKey("joystick_num")) {
- ConfMan.setInt("joystick_num", 0);
- }
if (!ConfMan.hasKey("aspect_ratio")) {
ConfMan.setBool("aspect_ratio", false);
}
diff --git a/base/commandLine.cpp b/base/commandLine.cpp
index 8294f85a8b..b982e50cb2 100644
--- a/base/commandLine.cpp
+++ b/base/commandLine.cpp
@@ -281,7 +281,7 @@ void registerDefaults() {
#endif
// Miscellaneous
- ConfMan.registerDefault("joystick_num", -1);
+ ConfMan.registerDefault("joystick_num", 0);
ConfMan.registerDefault("confirm_exit", false);
ConfMan.registerDefault("disable_sdl_parachute", false);
diff --git a/base/main.cpp b/base/main.cpp
index 17298927f1..8ab43d0e12 100644
--- a/base/main.cpp
+++ b/base/main.cpp
@@ -366,8 +366,7 @@ static void setupKeymapper(OSystem &system) {
HardwareInputSet *inputSet = system.getHardwareInputSet();
KeymapperDefaultBindings *backendDefaultBindings = system.getKeymapperDefaultBindings();
- mapper->registerHardwareInputSet(inputSet);
- mapper->registerBackendDefaultBindings(backendDefaultBindings);
+ mapper->registerHardwareInputSet(inputSet, backendDefaultBindings);
Keymap *primaryGlobalKeymap = system.getEventManager()->getGlobalKeymap();
if (primaryGlobalKeymap) {
diff --git a/common/events.h b/common/events.h
index d314acf0d2..2ba0425b5c 100644
--- a/common/events.h
+++ b/common/events.h
@@ -65,6 +65,10 @@ enum EventType {
EVENT_QUIT = 10,
EVENT_SCREEN_CHANGED = 11,
+
+ /** The input devices have changed, input related configuration needs to be re-applied */
+ EVENT_INPUT_CHANGED = 35,
+
/**
* The backend requests the agi engine's predictive dialog to be shown.
* TODO: Fingolfin suggests that it would be of better value to expand
diff --git a/gui/options.cpp b/gui/options.cpp
index d0837e563c..8e62b71d06 100644
--- a/gui/options.cpp
+++ b/gui/options.cpp
@@ -916,6 +916,14 @@ void OptionsDialog::handleTickle() {
}
}
+void OptionsDialog::handleOtherEvent(const Common::Event &event) {
+ Dialog::handleOtherEvent(event);
+
+ if (event.type == Common::EVENT_INPUT_CHANGED && _keymapperWidget) {
+ _keymapperWidget->handleInputChanged();
+ }
+}
+
void OptionsDialog::setGraphicSettingsState(bool enabled) {
_enableGraphicSettings = enabled;
diff --git a/gui/options.h b/gui/options.h
index e012579d8a..2ec441df3e 100644
--- a/gui/options.h
+++ b/gui/options.h
@@ -75,6 +75,7 @@ public:
void close() override;
void handleCommand(CommandSender *sender, uint32 cmd, uint32 data) override;
void handleTickle() override;
+ void handleOtherEvent(const Common::Event &event) override;
const Common::String& getDomain() const { return _domain; }
More information about the Scummvm-git-logs
mailing list