From 287ea8eff2b2635ef953bf5029fc16fdf65fbf9b Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 2 Mar 2018 15:40:49 +1300 Subject: [PATCH 1/5] Fix Window.setFocus() unsetting focus if Interface has focus --- interface/src/Application.cpp | 10 ++++++++++ interface/src/Application.h | 1 + interface/src/scripting/WindowScriptingInterface.cpp | 4 +--- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 34cdf3cda8..06d1be6997 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -7329,6 +7329,16 @@ bool Application::hasFocus() const { return (QApplication::activeWindow() != nullptr); } +void Application::setFocus() { + // Note: Windows doesn't allow a user focus to be taken away from another application. Instead, it changes the color of and + // flashes the taskbar icon. + auto window = qApp->getWindow(); + window->activateWindow(); + + // Do NOT do the following because it takes focus away from the _displayPlugin. + //window->setFocus(); +} + void Application::setMaxOctreePacketsPerSecond(int maxOctreePPS) { if (maxOctreePPS != _maxOctreePPS) { _maxOctreePPS = maxOctreePPS; diff --git a/interface/src/Application.h b/interface/src/Application.h index ad12a4dc67..c673138369 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -160,6 +160,7 @@ public: QRect getRecommendedHUDRect() const; glm::vec2 getDeviceSize() const; bool hasFocus() const; + void setFocus(); void showCursor(const Cursor::Icon& cursor); diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp index 12b20566ed..1c98f5190d 100644 --- a/interface/src/scripting/WindowScriptingInterface.cpp +++ b/interface/src/scripting/WindowScriptingInterface.cpp @@ -74,9 +74,7 @@ QScriptValue WindowScriptingInterface::hasFocus() { void WindowScriptingInterface::setFocus() { // It's forbidden to call focus() from another thread. qApp->postLambdaEvent([] { - auto window = qApp->getWindow(); - window->activateWindow(); - window->setFocus(); + qApp->setFocus(); }); } From c8b4217a962b12a16d9df9efad22d9c601d7a62a Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 14 Mar 2018 12:57:23 +1300 Subject: [PATCH 2/5] Fix Window.hasFocus() --- interface/src/Application.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 2b77cb8950..cffb390644 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -7347,10 +7347,14 @@ bool Application::isThrottleRendering() const { } bool Application::hasFocus() const { - if (_displayPlugin) { - return getActiveDisplayPlugin()->hasFocus(); - } - return (QApplication::activeWindow() != nullptr); + bool result = (QApplication::activeWindow() != nullptr); +#if defined(Q_OS_WIN) + // On Windows, QWidget::activateWindow() - as called in setFocus() - makes the application's taskbar icon flash but doesn't + // take user focus away from their current window. So also check whether the application is the user's current foreground + // window. + result = result && (HWND)QApplication::activeWindow()->winId() == GetForegroundWindow(); +#endif + return result; } void Application::setFocus() { From 025d2807f47a2b1a5d2006513a11e67330bc46fb Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 14 Mar 2018 12:59:27 +1300 Subject: [PATCH 3/5] Fix Window.setFocus() JSDoc --- interface/src/scripting/WindowScriptingInterface.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/src/scripting/WindowScriptingInterface.h b/interface/src/scripting/WindowScriptingInterface.h index 5a30f44856..dfe117b239 100644 --- a/interface/src/scripting/WindowScriptingInterface.h +++ b/interface/src/scripting/WindowScriptingInterface.h @@ -62,7 +62,8 @@ public slots: QScriptValue hasFocus(); /**jsdoc - * Make the Interface window have focus. + * Make the Interface window have focus. On Windows, if Interface doesn't already have focus, the task bar icon flashes to + * indicate that Interface wants attention but focus isn't taken away from the application that the user is using. * @function Window.setFocus */ void setFocus(); From 966d711e56f7f7585290fef3a11ef4dca67eb9b1 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 14 Mar 2018 13:38:48 +1300 Subject: [PATCH 4/5] Fix Window.raiseMainWindow() --- interface/src/Application.cpp | 17 ++++++++++++++--- interface/src/Application.h | 1 + .../src/scripting/WindowScriptingInterface.cpp | 2 +- .../src/scripting/WindowScriptingInterface.h | 2 +- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index cffb390644..e3168f228a 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -7362,9 +7362,20 @@ void Application::setFocus() { // flashes the taskbar icon. auto window = qApp->getWindow(); window->activateWindow(); - - // Do NOT do the following because it takes focus away from the _displayPlugin. - //window->setFocus(); +} + +void Application::raise() { + auto windowState = qApp->getWindow()->windowState(); + if (windowState & Qt::WindowMinimized) { + if (windowState & Qt::WindowMaximized) { + qApp->getWindow()->showMaximized(); + } else if (windowState & Qt::WindowFullScreen) { + qApp->getWindow()->showFullScreen(); + } else { + qApp->getWindow()->showNormal(); + } + } + qApp->getWindow()->raise(); } void Application::setMaxOctreePacketsPerSecond(int maxOctreePPS) { diff --git a/interface/src/Application.h b/interface/src/Application.h index 7339257bba..1420d5b056 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -162,6 +162,7 @@ public: glm::vec2 getDeviceSize() const; bool hasFocus() const; void setFocus(); + void raise(); void showCursor(const Cursor::Icon& cursor); diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp index ffd2a76318..4cedfb5a34 100644 --- a/interface/src/scripting/WindowScriptingInterface.cpp +++ b/interface/src/scripting/WindowScriptingInterface.cpp @@ -81,7 +81,7 @@ void WindowScriptingInterface::setFocus() { void WindowScriptingInterface::raiseMainWindow() { // It's forbidden to call raise() from another thread. qApp->postLambdaEvent([] { - qApp->getWindow()->raise(); + qApp->raise(); }); } diff --git a/interface/src/scripting/WindowScriptingInterface.h b/interface/src/scripting/WindowScriptingInterface.h index dfe117b239..2a9806a302 100644 --- a/interface/src/scripting/WindowScriptingInterface.h +++ b/interface/src/scripting/WindowScriptingInterface.h @@ -69,7 +69,7 @@ public slots: void setFocus(); /**jsdoc - * Raise the Interface window if it is minimized, and give it focus. + * Raise the Interface window if it is minimized. If raised, the window gains focus. * @function Window.raiseMainWindow */ void raiseMainWindow(); From c1e256a4f39725446f1478355ac5b28f057e2cb1 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 14 Mar 2018 13:58:00 +1300 Subject: [PATCH 5/5] Remove unused methods --- .../src/display-plugins/NullDisplayPlugin.cpp | 4 ---- .../display-plugins/src/display-plugins/NullDisplayPlugin.h | 1 - .../src/display-plugins/OpenGLDisplayPlugin.cpp | 5 ----- .../src/display-plugins/OpenGLDisplayPlugin.h | 2 -- libraries/plugins/src/plugins/DisplayPlugin.h | 3 --- 5 files changed, 15 deletions(-) diff --git a/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.cpp index 6a19a34727..47a213cf71 100644 --- a/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.cpp @@ -21,10 +21,6 @@ glm::uvec2 NullDisplayPlugin::getRecommendedRenderSize() const { return glm::uvec2(100, 100); } -bool NullDisplayPlugin::hasFocus() const { - return false; -} - void NullDisplayPlugin::submitFrame(const gpu::FramePointer& frame) { if (frame) { _gpuContext->consumeFrameUpdates(frame); diff --git a/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.h index 97b71b5780..11563b3798 100644 --- a/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/NullDisplayPlugin.h @@ -16,7 +16,6 @@ public: grouping getGrouping() const override { return DEVELOPER; } glm::uvec2 getRecommendedRenderSize() const override; - bool hasFocus() const override; void submitFrame(const gpu::FramePointer& newFrame) override; QImage getScreenshot(float aspectRatio = 0.0f) const override; QImage getSecondaryCameraScreenshot() const override; diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index 9bd7d89634..c4b26e80de 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -828,11 +828,6 @@ glm::uvec2 OpenGLDisplayPlugin::getSurfaceSize() const { return result; } -bool OpenGLDisplayPlugin::hasFocus() const { - auto window = _container->getPrimaryWidget(); - return window ? window->hasFocus() : false; -} - void OpenGLDisplayPlugin::assertNotPresentThread() const { Q_ASSERT(QThread::currentThread() != _presentThread); } diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h index bf06486095..ec8d6df2d1 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h @@ -98,8 +98,6 @@ protected: virtual void compositePointer(); virtual void compositeExtra() {}; - virtual bool hasFocus() const override; - // These functions must only be called on the presentation thread virtual void customizeContext(); virtual void uncustomizeContext(); diff --git a/libraries/plugins/src/plugins/DisplayPlugin.h b/libraries/plugins/src/plugins/DisplayPlugin.h index 2c717f629c..25f4b247da 100644 --- a/libraries/plugins/src/plugins/DisplayPlugin.h +++ b/libraries/plugins/src/plugins/DisplayPlugin.h @@ -142,9 +142,6 @@ public: virtual void setContext(const gpu::ContextPointer& context) final { _gpuContext = context; } virtual void submitFrame(const gpu::FramePointer& newFrame) = 0; - // Does the rendering surface have current focus? - virtual bool hasFocus() const = 0; - // The size of the rendering target (may be larger than the device size due to distortion) virtual glm::uvec2 getRecommendedRenderSize() const = 0;