From f04d1b4998108809430b20ed88e449c404a73e1a Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Wed, 9 Mar 2016 21:47:08 -0800 Subject: [PATCH] Handle fake mouse events properly when triggered from a script --- .../src/display-plugins/CompositorHelper.cpp | 39 +++++++++++-------- .../src/display-plugins/CompositorHelper.h | 3 ++ 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp b/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp index 0e82cf7e7f..f6e9d8dbbc 100644 --- a/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp +++ b/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp @@ -286,32 +286,39 @@ glm::vec2 CompositorHelper::getReticleMaximumPosition() const { return result; } +void CompositorHelper::sendFakeMouseEvent() { + if (qApp->thread() != QThread::currentThread()) { + QMetaObject::invokeMethod(this, "sendFakeMouseEvent", Qt::BlockingQueuedConnection); + return; + } + + // in HMD mode we need to fake our mouse moves... + QPoint globalPos(_reticlePositionInHMD.x, _reticlePositionInHMD.y); + auto button = Qt::NoButton; + auto buttons = QApplication::mouseButtons(); + auto modifiers = QApplication::keyboardModifiers(); + static auto renderingWidget = PluginContainer::getInstance().getPrimaryWidget(); + QMouseEvent event(QEvent::MouseMove, globalPos, button, buttons, modifiers); + _fakeMouseEvent = true; + qApp->sendEvent(renderingWidget, &event); + _fakeMouseEvent = false; +} + void CompositorHelper::setReticlePosition(const glm::vec2& position, bool sendFakeEvent) { if (isHMD()) { - QMutexLocker locker(&_reticleLock); glm::vec2 maxOverlayPosition = _currentDisplayPlugin->getRecommendedUiSize(); // FIXME don't allow negative mouseExtra glm::vec2 mouseExtra = (MOUSE_EXTENTS_PIXELS - maxOverlayPosition) / 2.0f; glm::vec2 minMouse = vec2(0) - mouseExtra; glm::vec2 maxMouse = maxOverlayPosition + mouseExtra; - _reticlePositionInHMD = glm::clamp(position, minMouse, maxMouse); + { + QMutexLocker locker(&_reticleLock); + _reticlePositionInHMD = glm::clamp(position, minMouse, maxMouse); + } if (sendFakeEvent) { - // in HMD mode we need to fake our mouse moves... - QPoint globalPos(_reticlePositionInHMD.x, _reticlePositionInHMD.y); - auto button = Qt::NoButton; - auto buttons = QApplication::mouseButtons(); - auto modifiers = QApplication::keyboardModifiers(); - static auto renderingWidget = PluginContainer::getInstance().getPrimaryWidget(); - if (qApp->thread() == QThread::currentThread()) { - QMouseEvent event(QEvent::MouseMove, globalPos, button, buttons, modifiers); - _fakeMouseEvent = true; - qApp->sendEvent(renderingWidget, &event); - _fakeMouseEvent = false; - } else { - qApp->postEvent(renderingWidget, new QMouseEvent(QEvent::MouseMove, globalPos, button, buttons, modifiers)); - } + sendFakeMouseEvent(); } } else { // NOTE: This is some debugging code we will leave in while debugging various reticle movement strategies, diff --git a/libraries/display-plugins/src/display-plugins/CompositorHelper.h b/libraries/display-plugins/src/display-plugins/CompositorHelper.h index cf1394cbc3..55364be85b 100644 --- a/libraries/display-plugins/src/display-plugins/CompositorHelper.h +++ b/libraries/display-plugins/src/display-plugins/CompositorHelper.h @@ -116,6 +116,9 @@ public: signals: void allowMouseCaptureChanged(); +protected slots: + void sendFakeMouseEvent(); + private: glm::mat4 getUiTransform() const; void updateTooltips();