diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 8fb82f7ec0..15ae0891a0 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4919,3 +4919,43 @@ mat4 Application::getHMDSensorPose() const { } return mat4(); } + +static QRect savedGeometry; +static QScreen* originalScreen = nullptr; + +void Application::setFullscreen(const QScreen* target) { + // Work around Qt bug that prevents floating menus being shown when in fullscreen mode. + // https://bugreports.qt.io/browse/QTBUG-41883 + // Known issue: Top-level menu items don't highlight when cursor hovers. This is probably a side-effect of the work-around. + // TODO: Remove this work-around once the bug has been fixed and restore the following lines. + //_window->setWindowState(fullscreen ? (_window->windowState() | Qt::WindowFullScreen) : + // (_window->windowState() & ~Qt::WindowFullScreen)); + if (!_window->isFullScreen()) { + savedGeometry = _window->geometry(); + originalScreen = _window->windowHandle()->screen(); + qDebug() << savedGeometry; + } + _window->hide(); + _window->setGeometry(target->availableGeometry()); +// _window->windowHandle()->setScreen((QScreen*)target); + _window->showFullScreen(); + if (!_aboutToQuit) { + _window->show(); + } +} + +void Application::unsetFullscreen() { + _window->hide(); +// _window->windowHandle()->setScreen(originalScreen); +// _window->setGeometry(savedGeometry); + _window->setWindowState(_window->windowState() & ~Qt::WindowFullScreen); + _window->show(); + + QTimer* geometryTimer = new QTimer(); + // FIXME do better and moving from screen to screen on unset of fullscreen + geometryTimer->singleShot(2000, [=]{ + qDebug() << savedGeometry; + _window->setGeometry(savedGeometry); + geometryTimer->deleteLater(); + }); +} diff --git a/interface/src/Application.h b/interface/src/Application.h index 9ae775496c..6d28f83da9 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -287,6 +287,8 @@ public: virtual bool isOptionChecked(const QString& name); virtual void setIsOptionChecked(const QString& path, bool checked); virtual GlWindow* getVisibleWindow(); + virtual void setFullscreen(const QScreen* target) override; + virtual void unsetFullscreen() override; private: DisplayPlugin * getActiveDisplayPlugin(); diff --git a/interface/src/DisplayPlugins.cpp b/interface/src/DisplayPlugins.cpp index 5b5239b85a..ffdf4721c3 100644 --- a/interface/src/DisplayPlugins.cpp +++ b/interface/src/DisplayPlugins.cpp @@ -53,8 +53,11 @@ const DisplayPluginList& getDisplayPlugins() { DisplayPlugin* PLUGIN_POOL[] = { new Basic2DWindowOpenGLDisplayPlugin(), +#ifdef DEBUG new NullDisplayPlugin(), - new SideBySideStereoDisplayPlugin(), +#endif + // FIXME fix stereo display plugins +// new SideBySideStereoDisplayPlugin(), // new InterleavedStereoDisplayPlugin(), #if (OVR_MAJOR_VERSION == 5) new Oculus_0_5_DisplayPlugin(), diff --git a/libraries/display-plugins/src/display-plugins/MainWindowOpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/MainWindowOpenGLDisplayPlugin.cpp index 794ac1c15c..b2b148d9f1 100644 --- a/libraries/display-plugins/src/display-plugins/MainWindowOpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/MainWindowOpenGLDisplayPlugin.cpp @@ -1,3 +1,4 @@ + // // Created by Bradley Austin Davis on 2015/05/29 // Copyright 2015 High Fidelity, Inc. @@ -8,7 +9,6 @@ #include "MainWindowOpenGLDisplayPlugin.h" #include -#include #include #include diff --git a/libraries/display-plugins/src/display-plugins/MainWindowOpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/MainWindowOpenGLDisplayPlugin.h index 81404acaa2..44345b30e2 100644 --- a/libraries/display-plugins/src/display-plugins/MainWindowOpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/MainWindowOpenGLDisplayPlugin.h @@ -9,8 +9,6 @@ #include "WindowOpenGLDisplayPlugin.h" -class QGLWidget; - class MainWindowOpenGLDisplayPlugin : public WindowOpenGLDisplayPlugin { Q_OBJECT public: diff --git a/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.cpp index 12b0b8d38f..7b4b5ddbe3 100644 --- a/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.cpp @@ -18,6 +18,9 @@ #include #include #include +#include +#include + #include @@ -58,21 +61,24 @@ void Oculus_0_5_DisplayPlugin::activate(PluginContainer * container) { } OculusBaseDisplayPlugin::activate(container); + QScreen* target{nullptr}; + QPoint targetPosition{ _hmd->WindowsPos.x, _hmd->WindowsPos.y }; + foreach(auto screen, qApp->screens()) { + QRect screenPosition = screen->geometry(); + QPoint position = screenPosition.topLeft(); + if (position == targetPosition) { + target = screen; + break; + } + } + + + if (target) { + container->setFullscreen(target); + } + _window->installEventFilter(this); _window->makeCurrent(); - _hmdWindow = new GlWindow(QOpenGLContext::currentContext()); - - QSurfaceFormat format; - initSurfaceFormat(format); - _hmdWindow->setFlags(Qt::FramelessWindowHint); - _hmdWindow->setFormat(format); - _hmdWindow->create(); - _hmdWindow->setGeometry(_hmd->WindowsPos.x, _hmd->WindowsPos.y, _hmd->Resolution.w, _hmd->Resolution.h); - //_hmdWindow->setGeometry(0, -1080, _hmd->Resolution.w, _hmd->Resolution.h); - _hmdWindow->show(); - _hmdWindow->installEventFilter(this); - bool makeCurrentResult = _hmdWindow->makeCurrent(); - qDebug() << makeCurrentResult; ovrGLConfig config; memset(&config, 0, sizeof(ovrRenderAPIConfig)); auto& header = config.Config.Header; header.API = ovrRenderAPI_OpenGL; @@ -100,11 +106,12 @@ void Oculus_0_5_DisplayPlugin::activate(PluginContainer * container) { } void Oculus_0_5_DisplayPlugin::deactivate(PluginContainer* container) { - _hmdWindow->deleteLater(); - _hmdWindow = nullptr; + _window->removeEventFilter(this); OculusBaseDisplayPlugin::deactivate(container); + container->unsetFullscreen(); + ovrHmd_Destroy(_hmd); _hmd = nullptr; ovr_Shutdown(); @@ -116,7 +123,7 @@ void Oculus_0_5_DisplayPlugin::preRender() { } void Oculus_0_5_DisplayPlugin::preDisplay() { - _hmdWindow->makeCurrent(); + _window->makeCurrent(); } void Oculus_0_5_DisplayPlugin::display(GLuint finalTexture, const glm::uvec2& sceneSize) { @@ -151,7 +158,8 @@ bool Oculus_0_5_DisplayPlugin::eventFilter(QObject* receiver, QEvent* event) { // at 60 Hz. This would introduce judder. Perhaps we can push mirroring to a separate // thread void Oculus_0_5_DisplayPlugin::finishFrame() { - _hmdWindow->doneCurrent(); + _window->doneCurrent(); +// _hmdWindow->doneCurrent(); }; #endif diff --git a/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.h b/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.h index 6b77f7617e..10c752d599 100644 --- a/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.h @@ -41,7 +41,6 @@ protected: private: ovrTexture _eyeTextures[2]; static const QString NAME; - GlWindow* _hmdWindow; }; diff --git a/libraries/plugins/src/plugins/PluginContainer.h b/libraries/plugins/src/plugins/PluginContainer.h index 305906e978..19adcb9e3e 100644 --- a/libraries/plugins/src/plugins/PluginContainer.h +++ b/libraries/plugins/src/plugins/PluginContainer.h @@ -4,6 +4,7 @@ #include class GlWindow; +class QScreen; class PluginContainer { public: @@ -14,4 +15,6 @@ public: virtual bool isOptionChecked(const QString& name) = 0; virtual void setIsOptionChecked(const QString& path, bool checked) = 0; virtual GlWindow* getVisibleWindow() = 0; + virtual void setFullscreen(const QScreen* targetScreen) = 0; + virtual void unsetFullscreen() = 0; };