[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