diff options
author | Erik Larsson <erik@ortogonal.com> | 2016-04-17 20:24:01 +0200 |
---|---|---|
committer | Erik Larsson <erik@ortogonal.com> | 2016-04-18 14:39:01 +0000 |
commit | fb8c3ac47bcf6a192930c0758195d836017ead78 (patch) | |
tree | 03e228ff24f74ce67aff1c5a7c16656f9916df41 /src/client | |
parent | f4b7f65cb1a37c999dc152c50f04b1fe2829752e (diff) |
Compensate for window decoration size in data_device_enter/motion.
Change-Id: I71a549e597ec0821c778edca9f8cb20eefdcc75e
Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
Reviewed-by: Giulio Camuffo <giulio.camuffo@kdab.com>
Diffstat (limited to 'src/client')
-rw-r--r-- | src/client/qwaylanddatadevice.cpp | 19 | ||||
-rw-r--r-- | src/client/qwaylanddatadevice_p.h | 2 |
2 files changed, 18 insertions, 3 deletions
diff --git a/src/client/qwaylanddatadevice.cpp b/src/client/qwaylanddatadevice.cpp index 2ab8d8728..9cc4217ff 100644 --- a/src/client/qwaylanddatadevice.cpp +++ b/src/client/qwaylanddatadevice.cpp @@ -46,6 +46,7 @@ #include "qwaylanddnd_p.h" #include "qwaylandinputdevice_p.h" #include "qwaylanddisplay_p.h" +#include "qwaylandabstractdecoration_p.h" #include <QtCore/QMimeData> #include <QtGui/QGuiApplication> @@ -153,7 +154,7 @@ void QWaylandDataDevice::data_device_enter(uint32_t serial, wl_surface *surface, { m_enterSerial = serial; m_dragWindow = QWaylandWindow::fromWlSurface(surface)->window(); - m_dragPoint = QPoint(wl_fixed_to_int(x), wl_fixed_to_int(y)); + m_dragPoint = calculateDragPosition(x, y, m_dragWindow); QDrag *drag = static_cast<QWaylandDrag *>(QGuiApplicationPrivate::platformIntegration()->drag())->currentDrag(); @@ -202,7 +203,7 @@ void QWaylandDataDevice::data_device_motion(uint32_t time, wl_fixed_t x, wl_fixe if (!drag && !m_dragOffer) return; - m_dragPoint = QPoint(wl_fixed_to_int(x), wl_fixed_to_int(y)); + m_dragPoint = calculateDragPosition(x, y, m_dragWindow); QMimeData *dragData; Qt::DropActions supportedActions; @@ -246,7 +247,6 @@ void QWaylandDataDevice::selectionSourceCancelled() void QWaylandDataDevice::dragSourceCancelled() { m_dragSource.reset(); - } void QWaylandDataDevice::dragSourceTargetChanged(const QString &mimeType) @@ -254,6 +254,19 @@ void QWaylandDataDevice::dragSourceTargetChanged(const QString &mimeType) static_cast<QWaylandDrag *>(QGuiApplicationPrivate::platformIntegration()->drag())->updateTarget(mimeType); } +QPoint QWaylandDataDevice::calculateDragPosition(int x, int y, QWindow *wnd) const +{ + QPoint pnt(wl_fixed_to_int(x), wl_fixed_to_int(y)); + if (wnd) { + QWaylandWindow *wwnd = static_cast<QWaylandWindow*>(m_dragWindow->handle()); + if (wwnd && wwnd->decoration()) { + pnt -= QPoint(wwnd->decoration()->margins().left(), + wwnd->decoration()->margins().top()); + } + } + return pnt; +} + } QT_END_NAMESPACE diff --git a/src/client/qwaylanddatadevice_p.h b/src/client/qwaylanddatadevice_p.h index 4d229ad25..579cb3c7c 100644 --- a/src/client/qwaylanddatadevice_p.h +++ b/src/client/qwaylanddatadevice_p.h @@ -101,6 +101,8 @@ private Q_SLOTS: void dragSourceTargetChanged(const QString &mimeType); private: + QPoint calculateDragPosition(int x, int y, QWindow *wnd) const; + QWaylandDisplay *m_display; QWaylandInputDevice *m_inputDevice; uint32_t m_enterSerial; |