summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2020-03-31 19:22:44 +0200
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2020-04-02 10:33:29 +0200
commit7e9481f1fb00bee9d20e8c13d761c0f16ee04973 (patch)
treec08929f98a5dfdfe100b1ef4d5649a67fa8f6a5d /src
parentc83ae88faf5b28872cb4bda92e9dddf22b989265 (diff)
Resolve QWidget window handle without depending on QtWidgets
Change-Id: If5b2f17283193d7a1718f476b72f380e9e67d0f0 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/platforms/cocoa/qcocoadrag.mm25
-rw-r--r--src/widgets/kernel/qwidget.cpp11
-rw-r--r--src/widgets/kernel/qwidget.h1
-rw-r--r--src/widgets/kernel/qwidget_p.h1
4 files changed, 23 insertions, 15 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoadrag.mm b/src/plugins/platforms/cocoa/qcocoadrag.mm
index b4a16ab912..3525fddfd1 100644
--- a/src/plugins/platforms/cocoa/qcocoadrag.mm
+++ b/src/plugins/platforms/cocoa/qcocoadrag.mm
@@ -40,9 +40,6 @@
#include "qcocoadrag.h"
#include "qmacclipboard.h"
#include "qcocoahelpers.h"
-#ifndef QT_NO_WIDGETS
-#include <QtWidgets/qwidget.h>
-#endif
#include <QtGui/private/qcoregraphics_p.h>
QT_BEGIN_NAMESPACE
@@ -189,19 +186,17 @@ QPixmap QCocoaDrag::dragPixmap(QDrag *drag, QPoint &hotSpot) const
const int height = fm.height();
if (width > 0 && height > 0) {
qreal dpr = 1.0;
- if (const QWindow *sourceWindow = qobject_cast<QWindow *>(drag->source())) {
- dpr = sourceWindow->devicePixelRatio();
- }
-#ifndef QT_NO_WIDGETS
- else if (const QWidget *sourceWidget = qobject_cast<QWidget *>(drag->source())) {
- if (const QWindow *sourceWindow = sourceWidget->window()->windowHandle())
- dpr = sourceWindow->devicePixelRatio();
- }
-#endif
- else {
- if (const QWindow *focusWindow = qApp->focusWindow())
- dpr = focusWindow->devicePixelRatio();
+ QWindow *window = qobject_cast<QWindow *>(drag->source());
+ if (!window && drag->source()->metaObject()->indexOfMethod("_q_closestWindowHandle()") != -1) {
+ QMetaObject::invokeMethod(drag->source(), "_q_closestWindowHandle",
+ Q_RETURN_ARG(QWindow *, window));
}
+ if (!window)
+ window = qApp->focusWindow();
+
+ if (window)
+ dpr = window->devicePixelRatio();
+
pm = QPixmap(width * dpr, height * dpr);
pm.setDevicePixelRatio(dpr);
QPainter p(&pm);
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp
index 19945473da..79c8aba8cf 100644
--- a/src/widgets/kernel/qwidget.cpp
+++ b/src/widgets/kernel/qwidget.cpp
@@ -1112,6 +1112,17 @@ QWindow *QWidgetPrivate::windowHandle(WindowHandleMode mode) const
return nullptr;
}
+/*!
+ \internal
+
+ Used by clients outside of widgets to get a handle to the
+ closest QWindow without having to link to widgets.
+*/
+QWindow *QWidgetPrivate::_q_closestWindowHandle() const
+{
+ return windowHandle(QWidgetPrivate::WindowHandleMode::Closest);
+}
+
QScreen *QWidgetPrivate::associatedScreen() const
{
if (auto window = windowHandle(WindowHandleMode::Closest))
diff --git a/src/widgets/kernel/qwidget.h b/src/widgets/kernel/qwidget.h
index 9ea4301428..68a9b7ca9b 100644
--- a/src/widgets/kernel/qwidget.h
+++ b/src/widgets/kernel/qwidget.h
@@ -742,6 +742,7 @@ private:
private:
Q_DISABLE_COPY(QWidget)
Q_PRIVATE_SLOT(d_func(), void _q_showIfNotHidden())
+ Q_PRIVATE_SLOT(d_func(), QWindow *_q_closestWindowHandle())
QWidgetData *data;
};
diff --git a/src/widgets/kernel/qwidget_p.h b/src/widgets/kernel/qwidget_p.h
index 3c29b48973..a3eac8d9ec 100644
--- a/src/widgets/kernel/qwidget_p.h
+++ b/src/widgets/kernel/qwidget_p.h
@@ -270,6 +270,7 @@ public:
TopLevel
};
QWindow *windowHandle(WindowHandleMode mode = WindowHandleMode::Direct) const;
+ QWindow *_q_closestWindowHandle() const; // Private slot in QWidget
QScreen *associatedScreen() const;