From fb417c301cace4825d13e818e4e7e4e1b966c630 Mon Sep 17 00:00:00 2001 From: Erik Larsson Date: Sun, 17 Apr 2016 20:34:21 +0200 Subject: Move drag icon relative the cursor hotspot position Instead of placing the drag icons top-left corner at the cursors hotspot the drag icon is moved so it will be placed correct relative the cursor hotspot. This will makes the drag feeling more realistic. Change-Id: I8d60ae1b7788accb9034575983417abae4c58c1a Reviewed-by: Giulio Camuffo Reviewed-by: Johan Helsing --- examples/wayland/qwindow-compositor/compositorwindow.cpp | 9 +-------- examples/wayland/qwindow-compositor/compositorwindow.h | 1 - examples/wayland/qwindow-compositor/windowcompositor.cpp | 9 ++++++++- examples/wayland/qwindow-compositor/windowcompositor.h | 3 +++ 4 files changed, 12 insertions(+), 10 deletions(-) (limited to 'examples/wayland/qwindow-compositor') diff --git a/examples/wayland/qwindow-compositor/compositorwindow.cpp b/examples/wayland/qwindow-compositor/compositorwindow.cpp index 002831283..7e10a1739 100644 --- a/examples/wayland/qwindow-compositor/compositorwindow.cpp +++ b/examples/wayland/qwindow-compositor/compositorwindow.cpp @@ -62,7 +62,6 @@ void CompositorWindow::setCompositor(WindowCompositor *comp) { connect(m_compositor, &WindowCompositor::startMove, this, &CompositorWindow::startMove); connect(m_compositor, &WindowCompositor::startResize, this, &CompositorWindow::startResize); connect(m_compositor, &WindowCompositor::dragStarted, this, &CompositorWindow::startDrag); - connect(m_compositor, &WindowCompositor::frameOffset, this, &CompositorWindow::setFrameOffset); } void CompositorWindow::initializeGL() @@ -180,12 +179,6 @@ void CompositorWindow::startDrag(WindowCompositorView *dragIcon) m_compositor->raise(dragIcon); } -void CompositorWindow::setFrameOffset(const QPoint &offset) -{ - if (m_mouseView) - m_mouseView->setPosition(m_mouseView->position() + offset); -} - void CompositorWindow::mousePressEvent(QMouseEvent *e) { if (mouseGrab()) @@ -247,7 +240,7 @@ void CompositorWindow::mouseMoveEvent(QMouseEvent *e) WindowCompositorView *view = viewAt(e->localPos()); m_compositor->handleDrag(view, e); if (m_dragIconView) { - m_dragIconView->setPosition(e->localPos()); + m_dragIconView->setPosition(e->localPos() + m_dragIconView->offset()); update(); } } diff --git a/examples/wayland/qwindow-compositor/compositorwindow.h b/examples/wayland/qwindow-compositor/compositorwindow.h index c7c637e53..8b5180a00 100644 --- a/examples/wayland/qwindow-compositor/compositorwindow.h +++ b/examples/wayland/qwindow-compositor/compositorwindow.h @@ -73,7 +73,6 @@ private slots: void startMove(); void startResize(int edge, bool anchored); void startDrag(WindowCompositorView *dragIcon); - void setFrameOffset(const QPoint &offset); private: enum GrabState { NoGrab, MoveGrab, ResizeGrab, DragGrab }; diff --git a/examples/wayland/qwindow-compositor/windowcompositor.cpp b/examples/wayland/qwindow-compositor/windowcompositor.cpp index e91778725..bd39908e5 100644 --- a/examples/wayland/qwindow-compositor/windowcompositor.cpp +++ b/examples/wayland/qwindow-compositor/windowcompositor.cpp @@ -108,6 +108,12 @@ void WindowCompositorView::onXdgSetFullscreen(QWaylandOutput* clientPreferredOut setPosition(outputToFullscreen->position()); } +void WindowCompositorView::onOffsetForNextFrame(const QPoint &offset) +{ + m_offset = offset; + setPosition(position() + offset); +} + void WindowCompositorView::onXdgUnsetFullscreen() { onXdgUnsetMaximized(); @@ -145,7 +151,6 @@ void WindowCompositor::onSurfaceCreated(QWaylandSurface *surface) connect(surface, &QWaylandSurface::surfaceDestroyed, this, &WindowCompositor::surfaceDestroyed); connect(surface, &QWaylandSurface::mappedChanged, this, &WindowCompositor::surfaceMappedChanged); connect(surface, &QWaylandSurface::redraw, this, &WindowCompositor::triggerRender); - connect(surface, &QWaylandSurface::offsetForNextFrame, this, &WindowCompositor::frameOffset); connect(surface, &QWaylandSurface::subsurfacePositionChanged, this, &WindowCompositor::onSubsurfacePositionChanged); @@ -154,6 +159,7 @@ void WindowCompositor::onSurfaceCreated(QWaylandSurface *surface) view->setOutput(outputFor(m_window)); m_views << view; connect(view, &QWaylandView::surfaceDestroyed, this, &WindowCompositor::viewSurfaceDestroyed); + connect(surface, &QWaylandSurface::offsetForNextFrame, view, &WindowCompositorView::onOffsetForNextFrame); } void WindowCompositor::surfaceMappedChanged() @@ -412,6 +418,7 @@ void WindowCompositor::startDrag() QWaylandDrag *currentDrag = defaultInputDevice()->drag(); Q_ASSERT(currentDrag); WindowCompositorView *iconView = findView(currentDrag->icon()); + iconView->setPosition(m_window->mapFromGlobal(QCursor::pos())); emit dragStarted(iconView); } diff --git a/examples/wayland/qwindow-compositor/windowcompositor.h b/examples/wayland/qwindow-compositor/windowcompositor.h index 96af01f82..5290d7c85 100644 --- a/examples/wayland/qwindow-compositor/windowcompositor.h +++ b/examples/wayland/qwindow-compositor/windowcompositor.h @@ -68,6 +68,7 @@ public: WindowCompositorView *parentView() const { return m_parentView; } QPointF parentPosition() const { return m_parentView ? (m_parentView->position() + m_parentView->parentPosition()) : QPointF(); } QSize windowSize() { return m_xdgSurface ? m_xdgSurface->windowGeometry().size() : surface()->size(); } + QPoint offset() const { return m_offset; } private: friend class WindowCompositor; @@ -77,12 +78,14 @@ private: QWaylandXdgSurface *m_xdgSurface; QWaylandXdgPopup *m_xdgPopup; WindowCompositorView *m_parentView; + QPoint m_offset; public slots: void onXdgSetMaximized(); void onXdgUnsetMaximized(); void onXdgSetFullscreen(QWaylandOutput *output); void onXdgUnsetFullscreen(); + void onOffsetForNextFrame(const QPoint &offset); }; class WindowCompositor : public QWaylandCompositor -- cgit v1.2.3