From f7b8f2e8b51f244ed459d869747f5abc48aceeb0 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 5 Mar 2018 13:15:11 +0100 Subject: Windows QPA: Fix sending of the mouse release in case of a Drop Use the new API of QWindowSystemInterface to send the release event which does not depend on the state of QGuiApplicationPrivate::mouse_buttons. Amends 1f6bd8bfb2206480ca5b5c267da38659e6cff20e. Task-number: QTBUG-66447 Change-Id: Iae889ea416b633c9307da9535dfb51ad1dbf288e Reviewed-by: Shawn Rutledge --- src/plugins/platforms/windows/qwindowsdrag.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/plugins/platforms/windows') diff --git a/src/plugins/platforms/windows/qwindowsdrag.cpp b/src/plugins/platforms/windows/qwindowsdrag.cpp index db06f81434..593ff3cef1 100644 --- a/src/plugins/platforms/windows/qwindowsdrag.cpp +++ b/src/plugins/platforms/windows/qwindowsdrag.cpp @@ -412,7 +412,8 @@ QWindowsOleDropSource::QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState) const QPoint localPos = m_windowUnderMouse->handle()->mapFromGlobal(globalPos); QWindowSystemInterface::handleMouseEvent(m_windowUnderMouse.data(), QPointF(localPos), QPointF(globalPos), - QWindowsMouseHandler::queryMouseButtons()); + QWindowsMouseHandler::queryMouseButtons(), + Qt::LeftButton, QEvent::MouseButtonRelease); } } m_currentButtons = Qt::NoButton; -- cgit v1.2.3 From 8abbb6ec725c41e08db8421f3e10b15b66ba28b1 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 2 Mar 2018 14:59:57 +0100 Subject: Windows QPA: Fix scaling of tablet coordinates for High DPI scaling Determine the virtual desktop geometry in native pixels from the QPlatformScreen siblings. Use the platform window to determine the local position. Task-number: QTBUG-36937 Change-Id: Ic250f1b41d8e74099558796112dbd70a7e1f6956 Reviewed-by: Shawn Rutledge --- src/plugins/platforms/windows/qwindowsscreen.cpp | 9 +++++++++ src/plugins/platforms/windows/qwindowsscreen.h | 2 ++ src/plugins/platforms/windows/qwindowstabletsupport.cpp | 7 +++++-- 3 files changed, 16 insertions(+), 2 deletions(-) (limited to 'src/plugins/platforms/windows') diff --git a/src/plugins/platforms/windows/qwindowsscreen.cpp b/src/plugins/platforms/windows/qwindowsscreen.cpp index c0781df973..66d3b140e2 100644 --- a/src/plugins/platforms/windows/qwindowsscreen.cpp +++ b/src/plugins/platforms/windows/qwindowsscreen.cpp @@ -318,6 +318,15 @@ void QWindowsScreen::handleChanges(const QWindowsScreenData &newData) } } +QRect QWindowsScreen::virtualGeometry(const QPlatformScreen *screen) // cf QScreen::virtualGeometry() +{ + QRect result; + const auto siblings = screen->virtualSiblings(); + for (const QPlatformScreen *sibling : siblings) + result |= sibling->geometry(); + return result; +} + enum OrientationPreference // matching Win32 API ORIENTATION_PREFERENCE #if defined(Q_COMPILER_CLASS_ENUM) || defined(Q_CC_MSVC) : DWORD diff --git a/src/plugins/platforms/windows/qwindowsscreen.h b/src/plugins/platforms/windows/qwindowsscreen.h index 7cf73f03af..5753e605da 100644 --- a/src/plugins/platforms/windows/qwindowsscreen.h +++ b/src/plugins/platforms/windows/qwindowsscreen.h @@ -113,6 +113,8 @@ public: const QWindowsScreenData &data() const { return m_data; } + static QRect virtualGeometry(const QPlatformScreen *screen); + private: QWindowsScreenData m_data; #ifndef QT_NO_CURSOR diff --git a/src/plugins/platforms/windows/qwindowstabletsupport.cpp b/src/plugins/platforms/windows/qwindowstabletsupport.cpp index 5fdc664603..78e33e57ab 100644 --- a/src/plugins/platforms/windows/qwindowstabletsupport.cpp +++ b/src/plugins/platforms/windows/qwindowstabletsupport.cpp @@ -421,7 +421,8 @@ bool QWindowsTabletSupport::translateTabletPacketEvent() // in which case we snap the position to the mouse position. // It seems there is no way to find out the mode programmatically, the LOGCONTEXT orgX/Y/Ext // area is always the virtual desktop. - const QRect virtualDesktopArea = QGuiApplication::primaryScreen()->virtualGeometry(); + const QRect virtualDesktopArea = + QWindowsScreen::virtualGeometry(QGuiApplication::primaryScreen()->handle()); qCDebug(lcQpaTablet) << __FUNCTION__ << "processing " << packetCount << "target:" << QGuiApplicationPrivate::tabletDevicePoint(uniqueId).target; @@ -455,7 +456,9 @@ bool QWindowsTabletSupport::translateTabletPacketEvent() if (!target) continue; - const QPoint localPos = target->mapFromGlobal(globalPos); + const QPlatformWindow *platformWindow = target->handle(); + Q_ASSERT(platformWindow); + const QPoint localPos = platformWindow->mapFromGlobal(globalPos); const qreal pressureNew = packet.pkButtons && (currentPointer == QTabletEvent::Pen || currentPointer == QTabletEvent::Eraser) ? m_devices.at(m_currentDevice).scalePressure(packet.pkNormalPressure) : -- cgit v1.2.3