diff --git a/src/gui/kernel/qplatformwindow.cpp b/src/gui/kernel/qplatformwindow.cpp index 748a7825b6..6200ad01bf 100644 --- a/src/gui/kernel/qplatformwindow.cpp +++ b/src/gui/kernel/qplatformwindow.cpp @@ -187,6 +187,30 @@ bool QPlatformWindow::isEmbedded(const QPlatformWindow *parentWindow) const return false; } +/*! + Translates the window coordinate \a pos to global screen + coordinates using native methods. This is required for embedded windows, + where the topmost QWindow coordinates are not global screen coordinates. + + Returns \a pos if there is no platform specific implementation. +*/ +QPoint QPlatformWindow::mapToGlobal(const QPoint &pos) const +{ + return pos; +} + +/*! + Translates the global screen coordinate \a pos to window + coordinates using native methods. This is required for embedded windows, + where the topmost QWindow coordinates are not global screen coordinates. + + Returns \a pos if there is no platform specific implementation. +*/ +QPoint QPlatformWindow::mapFromGlobal(const QPoint &pos) const +{ + return pos; +} + /*! Requests setting the window state of this surface to \a type. Returns the actual state set. diff --git a/src/gui/kernel/qplatformwindow.h b/src/gui/kernel/qplatformwindow.h index e27851830e..7d6bb80df1 100644 --- a/src/gui/kernel/qplatformwindow.h +++ b/src/gui/kernel/qplatformwindow.h @@ -104,6 +104,8 @@ public: virtual bool isExposed() const; virtual bool isActive() const; virtual bool isEmbedded(const QPlatformWindow *parentWindow) const; + virtual QPoint mapToGlobal(const QPoint &pos) const; + virtual QPoint mapFromGlobal(const QPoint &pos) const; virtual void propagateSizeHints(); diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index 3b12768678..a2447e282a 100644 --- a/src/gui/kernel/qwindow.cpp +++ b/src/gui/kernel/qwindow.cpp @@ -1744,7 +1744,11 @@ bool QWindow::nativeEvent(const QByteArray &eventType, void *message, long *resu */ QPoint QWindow::mapToGlobal(const QPoint &pos) const { - return pos + d_func()->globalPosition(); + Q_D(const QWindow); + if (d->platformWindow && d->platformWindow->isEmbedded(0)) + return d->platformWindow->mapToGlobal(pos); + else + return pos + d_func()->globalPosition(); } @@ -1758,7 +1762,11 @@ QPoint QWindow::mapToGlobal(const QPoint &pos) const */ QPoint QWindow::mapFromGlobal(const QPoint &pos) const { - return pos - d_func()->globalPosition(); + Q_D(const QWindow); + if (d->platformWindow && d->platformWindow->isEmbedded(0)) + return d->platformWindow->mapFromGlobal(pos); + else + return pos - d_func()->globalPosition(); } diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index d9fcb99f42..1d458d5bb1 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -849,6 +849,22 @@ bool QWindowsWindow::isEmbedded(const QPlatformWindow *parentWindow) const return m_data.embedded; } +QPoint QWindowsWindow::mapToGlobal(const QPoint &pos) const +{ + if (m_data.hwnd) + return QWindowsGeometryHint::mapToGlobal(m_data.hwnd, pos); + else + return pos; +} + +QPoint QWindowsWindow::mapFromGlobal(const QPoint &pos) const +{ + if (m_data.hwnd) + return QWindowsGeometryHint::mapFromGlobal(m_data.hwnd, pos); + else + return pos; +} + // partially from QWidgetPrivate::show_sys() void QWindowsWindow::show_sys() const { diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h index 2171c7f725..a040aab2bd 100644 --- a/src/plugins/platforms/windows/qwindowswindow.h +++ b/src/plugins/platforms/windows/qwindowswindow.h @@ -155,6 +155,9 @@ public: bool isVisible() const; virtual bool isActive() const; virtual bool isEmbedded(const QPlatformWindow *parentWindow) const; + virtual QPoint mapToGlobal(const QPoint &pos) const; + virtual QPoint mapFromGlobal(const QPoint &pos) const; + virtual Qt::WindowFlags setWindowFlags(Qt::WindowFlags flags); virtual Qt::WindowState setWindowState(Qt::WindowState state); diff --git a/src/widgets/kernel/qwidget_qpa.cpp b/src/widgets/kernel/qwidget_qpa.cpp index a94ecebc64..60a29ae049 100644 --- a/src/widgets/kernel/qwidget_qpa.cpp +++ b/src/widgets/kernel/qwidget_qpa.cpp @@ -290,6 +290,10 @@ QPoint QWidget::mapToGlobal(const QPoint &pos) const int x = pos.x(), y = pos.y(); const QWidget *w = this; while (w) { + QWindow *window = w->windowHandle(); + if (window && window->handle()) + return window->mapToGlobal(QPoint(x, y)); + x += w->data->crect.x(); y += w->data->crect.y(); w = w->isWindow() ? 0 : w->parentWidget(); @@ -302,6 +306,10 @@ QPoint QWidget::mapFromGlobal(const QPoint &pos) const int x = pos.x(), y = pos.y(); const QWidget *w = this; while (w) { + QWindow *window = w->windowHandle(); + if (window && window->handle()) + return window->mapFromGlobal(QPoint(x, y)); + x -= w->data->crect.x(); y -= w->data->crect.y(); w = w->isWindow() ? 0 : w->parentWidget(); diff --git a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp index 3e937fefd4..e9fe51dd0c 100644 --- a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp +++ b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp @@ -1489,6 +1489,8 @@ void tst_QAccessibility::spinBoxTest() QVERIFY(interface); QCOMPARE(interface->role(), QAccessible::SpinBox); + QVERIFY(QTest::qWaitForWindowExposed(spinBox)); + const QRect widgetRect = spinBox->geometry(); const QRect accessibleRect = interface->rect(); QCOMPARE(accessibleRect, widgetRect); @@ -1527,6 +1529,8 @@ void tst_QAccessibility::doubleSpinBoxTest() QAccessibleInterface *interface = QAccessible::queryAccessibleInterface(doubleSpinBox); QVERIFY(interface); + QVERIFY(QTest::qWaitForWindowExposed(doubleSpinBox)); + const QRect widgetRect = doubleSpinBox->geometry(); const QRect accessibleRect = interface->rect(); QCOMPARE(accessibleRect, widgetRect); @@ -2197,6 +2201,8 @@ void tst_QAccessibility::dialTest() QVERIFY(interface); QCOMPARE(interface->childCount(), 0); + QVERIFY(QTest::qWaitForWindowExposed(&dial)); + QCOMPARE(interface->text(QAccessible::Value), QString::number(dial.value())); QCOMPARE(interface->rect(), dial.geometry()); @@ -2827,6 +2833,7 @@ void tst_QAccessibility::comboBoxTest() QComboBox combo; combo.addItems(QStringList() << "one" << "two" << "three"); combo.show(); + QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(&combo); QCOMPARE(verifyHierarchy(iface), 0);