diff --git a/interface/resources/qml/hifi/dialogs/GeneralPreferencesDialog.qml b/interface/resources/qml/hifi/dialogs/GeneralPreferencesDialog.qml index 861de001d8..82f4872417 100644 --- a/interface/resources/qml/hifi/dialogs/GeneralPreferencesDialog.qml +++ b/interface/resources/qml/hifi/dialogs/GeneralPreferencesDialog.qml @@ -17,7 +17,7 @@ PreferencesDialog { id: root objectName: "GeneralPreferencesDialog" title: "General Settings" - showCategories: ["User Interface", "Mouse Sensitivity", "HMD", "Snapshots", "Privacy"] + showCategories: ["User Interface", "Mouse Sensitivity", "HMD", "Snapshots", "Privacy", "Plugins"] property var settings: Settings { category: root.objectName property alias x: root.x diff --git a/interface/resources/qml/hifi/tablet/TabletGeneralPreferences.qml b/interface/resources/qml/hifi/tablet/TabletGeneralPreferences.qml index 1d15fe8b23..4576c8cbbb 100644 --- a/interface/resources/qml/hifi/tablet/TabletGeneralPreferences.qml +++ b/interface/resources/qml/hifi/tablet/TabletGeneralPreferences.qml @@ -38,6 +38,6 @@ StackView { TabletPreferencesDialog { id: root objectName: "TabletGeneralPreferences" - showCategories: ["User Interface", "Mouse Sensitivity", "HMD", "Snapshots", "Privacy"] + showCategories: ["User Interface", "Mouse Sensitivity", "HMD", "Snapshots", "Privacy", "Plugins"] } } diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index 9340f59391..8597cb5717 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include "scripting/RenderScriptingInterface.h" @@ -637,4 +638,12 @@ void setupPreferences() { preferences->addPreference(preference); } } + + static const QString PLUGIN_CATEGORY{ "Plugins" }; + auto pluginManager = PluginManager::getInstance(); + { + auto getter = [pluginManager]()->bool { return pluginManager->getEnableOculusPluginSetting(); }; + auto setter = [pluginManager](bool value) { pluginManager->setEnableOculusPluginSetting(value); }; + preferences->addPreference(new CheckPreference(PLUGIN_CATEGORY, "Enable Oculus Platform Plugin", getter, setter)); + } } diff --git a/libraries/plugins/src/plugins/PluginManager.cpp b/libraries/plugins/src/plugins/PluginManager.cpp index f53b3ccf13..c1ca853563 100644 --- a/libraries/plugins/src/plugins/PluginManager.cpp +++ b/libraries/plugins/src/plugins/PluginManager.cpp @@ -211,18 +211,27 @@ const OculusPlatformPluginPointer PluginManager::getOculusPlatformPlugin() { static OculusPlatformPluginPointer oculusPlatformPlugin; static std::once_flag once; std::call_once(once, [&] { - // Now grab the dynamic plugins - for (auto loader : getLoadedPlugins()) { - OculusPlatformProvider* oculusPlatformProvider = qobject_cast(loader->instance()); - if (oculusPlatformProvider) { - oculusPlatformPlugin = oculusPlatformProvider->getOculusPlatformPlugin(); - break; + // Now grab the dynamic plugins if the setting allows it + if (_enableOculusPluginSetting.get()) { + qCDebug(plugins) << "PluginManager::getOculusPlatformPlugin: Oculus plugin enabled by a setting"; + for (auto loader : getLoadedPlugins()) { + OculusPlatformProvider* oculusPlatformProvider = qobject_cast(loader->instance()); + if (oculusPlatformProvider) { + oculusPlatformPlugin = oculusPlatformProvider->getOculusPlatformPlugin(); + break; + } } + } else { + qCDebug(plugins) << "PluginManager::getOculusPlatformPlugin: Oculus plugin disabled by a setting"; } }); return oculusPlatformPlugin; } +void PluginManager::setEnableOculusPluginSetting(bool value) { + _enableOculusPluginSetting.set(value); +} + DisplayPluginList PluginManager::getAllDisplayPlugins() { return _displayPlugins; } diff --git a/libraries/plugins/src/plugins/PluginManager.h b/libraries/plugins/src/plugins/PluginManager.h index d3040f1d9b..26c98ce5db 100644 --- a/libraries/plugins/src/plugins/PluginManager.h +++ b/libraries/plugins/src/plugins/PluginManager.h @@ -54,6 +54,9 @@ public: void setPluginFilter(PluginFilter pluginFilter) { _pluginFilter = pluginFilter; } Q_INVOKABLE DisplayPluginList getAllDisplayPlugins(); + bool getEnableOculusPluginSetting() { return _enableOculusPluginSetting.get(); } + void setEnableOculusPluginSetting(bool value); + signals: void inputDeviceRunningChanged(const QString& pluginName, bool isRunning, const QStringList& runningDevices); @@ -76,6 +79,8 @@ private: Setting::Handle _enableScriptingPlugins { "private/enableScriptingPlugins", (bool)qgetenv("enableScriptingPlugins").toInt() }; + + Setting::Handle _enableOculusPluginSetting { "enableOculusPluginSetting", false }; }; // TODO: we should define this value in CMake, and then use CMake diff --git a/plugins/openvr/src/OpenVrHelpers.cpp b/plugins/openvr/src/OpenVrHelpers.cpp index d22aecaa1f..d5cb7d6c8f 100644 --- a/plugins/openvr/src/OpenVrHelpers.cpp +++ b/plugins/openvr/src/OpenVrHelpers.cpp @@ -23,6 +23,8 @@ #include #include #include +#include + #include #include "../../interface/src/Menu.h" @@ -50,15 +52,21 @@ static const uint32_t RELEASE_OPENVR_HMD_DELAY_MS = 5000; bool isOculusPresent() { bool result = false; -#ifdef Q_OS_WIN - HANDLE oculusServiceEvent = ::OpenEventW(SYNCHRONIZE, FALSE, L"OculusHMDConnected"); - // The existence of the service indicates a running Oculus runtime - if (oculusServiceEvent) { - // A signaled event indicates a connected HMD - if (WAIT_OBJECT_0 == ::WaitForSingleObject(oculusServiceEvent, 0)) { - result = true; +#ifdef Q_OS_WIN + // Only check for Oculus presence if Oculus plugin is enabled + if (PluginManager::getInstance()->getEnableOculusPluginSetting()) { + qDebug() << "isOculusPresent: Oculus plugin enabled by a setting"; + HANDLE oculusServiceEvent = ::OpenEventW(SYNCHRONIZE, FALSE, L"OculusHMDConnected"); + // The existence of the service indicates a running Oculus runtime + if (oculusServiceEvent) { + // A signaled event indicates a connected HMD + if (WAIT_OBJECT_0 == ::WaitForSingleObject(oculusServiceEvent, 0)) { + result = true; + } + ::CloseHandle(oculusServiceEvent); } - ::CloseHandle(oculusServiceEvent); + } else { + qDebug() << "isOculusPresent: Oculus plugin disabled by a setting"; } #endif return result;