Attempting to fix offscreen UI event handling

This commit is contained in:
Bradley Austin Davis 2015-07-25 19:26:38 -04:00
parent ce9a6298f0
commit 7edf138843
8 changed files with 75 additions and 22 deletions

View file

@ -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();
});
}

View file

@ -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();

View file

@ -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(),

View file

@ -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 <QOpenGLContext>
#include <QWidget>
#include <QMainWindow>
#include <GlWindow.h>

View file

@ -9,8 +9,6 @@
#include "WindowOpenGLDisplayPlugin.h"
class QGLWidget;
class MainWindowOpenGLDisplayPlugin : public WindowOpenGLDisplayPlugin {
Q_OBJECT
public:

View file

@ -18,6 +18,9 @@
#include <QEvent>
#include <QResizeEvent>
#include <QOpenGLContext>
#include <QGuiApplication>
#include <QScreen>
#include <OVR_CAPI_GL.h>
@ -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

View file

@ -41,7 +41,6 @@ protected:
private:
ovrTexture _eyeTextures[2];
static const QString NAME;
GlWindow* _hmdWindow;
};

View file

@ -4,6 +4,7 @@
#include <functional>
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;
};