diff --git a/examples/controllers/controllerMappings.js b/examples/controllers/controllerMappings.js index 42494816f4..3848f62096 100644 --- a/examples/controllers/controllerMappings.js +++ b/examples/controllers/controllerMappings.js @@ -91,5 +91,11 @@ Object.keys(Controller.Actions).forEach(function (actionName) { Controller.hardwareChanged.connect(function () { - print("hardwareChanged"); + print("hardwareChanged ---------------------------------------------------"); + Object.keys(Controller.Hardware).forEach(function (deviceName) { + Object.keys(Controller.Hardware[deviceName]).forEach(function (input) { + print("Controller.Hardware." + deviceName + "." + input + ":" + Controller.Hardware[deviceName][input]); + }); + }); + print("-------------------------------------------------------------------"); }); \ No newline at end of file diff --git a/libraries/controllers/src/controllers/ScriptingInterface.cpp b/libraries/controllers/src/controllers/ScriptingInterface.cpp index e49248e8f0..a62172a730 100644 --- a/libraries/controllers/src/controllers/ScriptingInterface.cpp +++ b/libraries/controllers/src/controllers/ScriptingInterface.cpp @@ -204,25 +204,24 @@ namespace controller { } void ScriptingInterface::updateMaps() { + QVariantMap newHardware; auto userInputMapper = DependencyManager::get(); auto devices = userInputMapper->getDevices(); - QSet foundDevices; for (const auto& deviceMapping : devices) { auto deviceID = deviceMapping.first; if (deviceID != userInputMapper->getStandardDeviceID()) { auto device = deviceMapping.second; auto deviceName = QString(device->getName()).remove(SANITIZE_NAME_EXPRESSION); qCDebug(controllers) << "Device" << deviceMapping.first << ":" << deviceName; - foundDevices.insert(device->getName()); - if (_hardware.contains(deviceName)) { + if (newHardware.contains(deviceName)) { continue; } // Expose the IDs to JS - _hardware.insert(deviceName, createDeviceMap(device)); + newHardware.insert(deviceName, createDeviceMap(device)); } - } + _hardware = newHardware; } diff --git a/libraries/input-plugins/src/input-plugins/SDL2Manager.cpp b/libraries/input-plugins/src/input-plugins/SDL2Manager.cpp index d021e35a54..600dc5c56f 100644 --- a/libraries/input-plugins/src/input-plugins/SDL2Manager.cpp +++ b/libraries/input-plugins/src/input-plugins/SDL2Manager.cpp @@ -74,6 +74,27 @@ void SDL2Manager::deinit() { #endif } +void SDL2Manager::activate() { +#ifdef HAVE_SDL2 + auto userInputMapper = DependencyManager::get(); + for (auto joystick : _openJoysticks) { + userInputMapper->registerDevice(joystick); + emit joystickAdded(joystick.get()); + } +#endif +} + +void SDL2Manager::deactivate() { +#ifdef HAVE_SDL2 + auto userInputMapper = DependencyManager::get(); + for (auto joystick : _openJoysticks) { + userInputMapper->removeDevice(joystick->getDeviceID()); + emit joystickRemoved(joystick.get()); + } +#endif +} + + bool SDL2Manager::isSupported() const { #ifdef HAVE_SDL2 return true; diff --git a/libraries/input-plugins/src/input-plugins/SDL2Manager.h b/libraries/input-plugins/src/input-plugins/SDL2Manager.h index 4cf9cd33d8..d6b6de24b3 100644 --- a/libraries/input-plugins/src/input-plugins/SDL2Manager.h +++ b/libraries/input-plugins/src/input-plugins/SDL2Manager.h @@ -34,7 +34,12 @@ public: virtual void init() override; virtual void deinit() override; - + + /// Called when a plugin is being activated for use. May be called multiple times. + virtual void activate() override; + /// Called when a plugin is no longer being used. May be called multiple times. + virtual void deactivate() override; + virtual void pluginFocusOutEvent() override; virtual void pluginUpdate(float deltaTime, bool jointsCaptured) override; diff --git a/libraries/input-plugins/src/input-plugins/SixenseManager.cpp b/libraries/input-plugins/src/input-plugins/SixenseManager.cpp index 9ef1599099..2527da9e03 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseManager.cpp +++ b/libraries/input-plugins/src/input-plugins/SixenseManager.cpp @@ -126,6 +126,7 @@ void SixenseManager::activate() { void SixenseManager::deactivate() { InputPlugin::deactivate(); + #ifdef HAVE_SIXENSE CONTAINER->removeMenuItem(MENU_NAME, TOGGLE_SMOOTH); CONTAINER->removeMenu(MENU_PATH); @@ -136,7 +137,6 @@ void SixenseManager::deactivate() { if (_deviceID != controller::Input::INVALID_DEVICE) { auto userInputMapper = DependencyManager::get(); userInputMapper->removeDevice(_deviceID); - _deviceID = controller::Input::INVALID_DEVICE; } #ifdef __APPLE__ diff --git a/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp b/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp index 02d27d7e05..6d1534958a 100644 --- a/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp +++ b/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp @@ -135,6 +135,11 @@ void ViveControllerManager::activate() { _renderControllers = true; } #endif + + // unregister with UserInputMapper + auto userInputMapper = DependencyManager::get(); + userInputMapper->registerDevice(instance); + _registeredWithInputMapper = true; } void ViveControllerManager::deactivate() { @@ -152,6 +157,11 @@ void ViveControllerManager::deactivate() { } _poseStateMap.clear(); #endif + + // unregister with UserInputMapper + auto userInputMapper = DependencyManager::get(); + userInputMapper->removeDevice(_deviceID); + _registeredWithInputMapper = false; } void ViveControllerManager::updateRendering(RenderArgs* args, render::ScenePointer scene, render::PendingChanges pendingChanges) { @@ -272,15 +282,16 @@ void ViveControllerManager::update(float deltaTime, bool jointsCaptured) { auto userInputMapper = DependencyManager::get(); if (numTrackedControllers == 0) { - if (_deviceID != 0) { + if (_registeredWithInputMapper) { userInputMapper->removeDevice(_deviceID); - _deviceID = 0; + _registeredWithInputMapper = false; _poseStateMap.clear(); } } if (_trackedControllers == 0 && numTrackedControllers > 0) { userInputMapper->registerDevice(instance); + _registeredWithInputMapper = true; UserActivityLogger::getInstance().connectedDevice("spatial_controller", "steamVR"); } diff --git a/libraries/input-plugins/src/input-plugins/ViveControllerManager.h b/libraries/input-plugins/src/input-plugins/ViveControllerManager.h index dc04398b20..938f2f9ba9 100644 --- a/libraries/input-plugins/src/input-plugins/ViveControllerManager.h +++ b/libraries/input-plugins/src/input-plugins/ViveControllerManager.h @@ -69,6 +69,9 @@ private: bool _renderControllers; static const QString NAME; + + bool _registeredWithInputMapper { false }; + }; #endif // hifi__ViveControllerManager