From c54d0bc9938dcd4106953c05e38620d6eb62b7aa Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Tue, 12 Apr 2016 12:28:12 -0700 Subject: [PATCH] Don't expose raw pointer to the display plugin --- interface/src/Application.cpp | 23 ++++++++----------- interface/src/Application.h | 5 ++-- interface/src/PluginContainerProxy.cpp | 2 +- interface/src/PluginContainerProxy.h | 2 +- .../plugins/src/plugins/PluginContainer.h | 2 +- plugins/openvr/src/ViveControllerManager.cpp | 6 ++++- tests/controllers/src/main.cpp | 2 +- 7 files changed, 20 insertions(+), 22 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c2a4088dcc..7e8c96f5af 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4957,24 +4957,19 @@ qreal Application::getDevicePixelRatio() { return (_window && _window->windowHandle()) ? _window->windowHandle()->devicePixelRatio() : 1.0; } -DisplayPlugin* Application::getActiveDisplayPlugin() { - DisplayPlugin* result = nullptr; - if (QThread::currentThread() == thread()) { - if (nullptr == _displayPlugin) { - updateDisplayMode(); - Q_ASSERT(_displayPlugin); - } - result = _displayPlugin.get(); - } else { +DisplayPluginPointer Application::getActiveDisplayPlugin() const { + if (QThread::currentThread() != thread()) { std::unique_lock lock(_displayPluginLock); - result = _displayPlugin.get(); + return _displayPlugin; } - return result; + + if (!_displayPlugin) { + const_cast(this)->updateDisplayMode(); + Q_ASSERT(_displayPlugin); + } + return _displayPlugin; } -const DisplayPlugin* Application::getActiveDisplayPlugin() const { - return const_cast(this)->getActiveDisplayPlugin(); -} static void addDisplayPluginToMenu(DisplayPluginPointer displayPlugin, bool active = false) { auto menu = Menu::getInstance(); diff --git a/interface/src/Application.h b/interface/src/Application.h index 2911d42b65..fdd5e42006 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -177,8 +177,7 @@ public: void setActiveDisplayPlugin(const QString& pluginName); - DisplayPlugin* getActiveDisplayPlugin(); - const DisplayPlugin* getActiveDisplayPlugin() const; + DisplayPluginPointer getActiveDisplayPlugin() const; FileLogger* getLogger() const { return _logger; } @@ -388,7 +387,7 @@ private: OffscreenGLCanvas* _offscreenContext { nullptr }; DisplayPluginPointer _displayPlugin; - std::mutex _displayPluginLock; + mutable std::mutex _displayPluginLock; InputPluginList _activeInputPlugins; bool _activatingDisplayPlugin { false }; diff --git a/interface/src/PluginContainerProxy.cpp b/interface/src/PluginContainerProxy.cpp index c3d186f190..b651a1520d 100644 --- a/interface/src/PluginContainerProxy.cpp +++ b/interface/src/PluginContainerProxy.cpp @@ -54,7 +54,7 @@ QOpenGLContext* PluginContainerProxy::getPrimaryContext() { return qApp->_glWidget->context()->contextHandle(); } -const DisplayPlugin* PluginContainerProxy::getActiveDisplayPlugin() const { +const DisplayPluginPointer PluginContainerProxy::getActiveDisplayPlugin() const { return qApp->getActiveDisplayPlugin(); } diff --git a/interface/src/PluginContainerProxy.h b/interface/src/PluginContainerProxy.h index 3ec2489c54..a04a1b2977 100644 --- a/interface/src/PluginContainerProxy.h +++ b/interface/src/PluginContainerProxy.h @@ -24,7 +24,7 @@ class PluginContainerProxy : public QObject, PluginContainer { virtual ui::Menu* getPrimaryMenu() override; virtual QOpenGLContext* getPrimaryContext() override; virtual bool isForeground() override; - virtual const DisplayPlugin* getActiveDisplayPlugin() const override; + virtual const DisplayPluginPointer getActiveDisplayPlugin() const override; friend class Application; diff --git a/libraries/plugins/src/plugins/PluginContainer.h b/libraries/plugins/src/plugins/PluginContainer.h index feaabf83e1..e1d1a212e2 100644 --- a/libraries/plugins/src/plugins/PluginContainer.h +++ b/libraries/plugins/src/plugins/PluginContainer.h @@ -64,7 +64,7 @@ public: virtual MainWindow* getPrimaryWindow() = 0; virtual QOpenGLContext* getPrimaryContext() = 0; virtual bool isForeground() = 0; - virtual const DisplayPlugin* getActiveDisplayPlugin() const = 0; + virtual const DisplayPluginPointer getActiveDisplayPlugin() const = 0; /// settings interface bool getBoolSetting(const QString& settingName, bool defaultValue); diff --git a/plugins/openvr/src/ViveControllerManager.cpp b/plugins/openvr/src/ViveControllerManager.cpp index c1ed5aa880..4c469ccefa 100644 --- a/plugins/openvr/src/ViveControllerManager.cpp +++ b/plugins/openvr/src/ViveControllerManager.cpp @@ -11,6 +11,8 @@ #include "ViveControllerManager.h" +#include + #include #include #include @@ -48,9 +50,11 @@ static const QString MENU_PATH = MENU_PARENT + ">" + MENU_NAME; static const QString RENDER_CONTROLLERS = "Render Hand Controllers"; const QString ViveControllerManager::NAME = "OpenVR"; +static const QString DEBUG_FLAG("HIFI_DEBUG_OPENVR"); +static bool enableDebugOpenVR = QProcessEnvironment::systemEnvironment().contains(DEBUG_FLAG); bool ViveControllerManager::isSupported() const { - return !isOculusPresent() && vr::VR_IsHmdPresent(); + return (enableDebugOpenVR || !isOculusPresent()) && vr::VR_IsHmdPresent(); } bool ViveControllerManager::activate() { diff --git a/tests/controllers/src/main.cpp b/tests/controllers/src/main.cpp index 81acf2594d..e978dd9a38 100644 --- a/tests/controllers/src/main.cpp +++ b/tests/controllers/src/main.cpp @@ -91,7 +91,7 @@ public: virtual QOpenGLContext* getPrimaryContext() override { return nullptr; } virtual ui::Menu* getPrimaryMenu() { return nullptr; } virtual bool isForeground() override { return true; } - virtual const DisplayPlugin* getActiveDisplayPlugin() const override { return nullptr; } + virtual const DisplayPluginPointer getActiveDisplayPlugin() const override { return DisplayPluginPointer(); } }; class MyControllerScriptingInterface : public controller::ScriptingInterface {