diff options
11 files changed, 94 insertions, 29 deletions
diff --git a/examples/wayland/qwindow-compositor/qwindowcompositor.cpp b/examples/wayland/qwindow-compositor/qwindowcompositor.cpp index d766fa78a..5b154d9df 100644 --- a/examples/wayland/qwindow-compositor/qwindowcompositor.cpp +++ b/examples/wayland/qwindow-compositor/qwindowcompositor.cpp @@ -207,7 +207,7 @@ void QWindowCompositor::surfaceMapped() } pos = QPoint(px, py); QWaylandSurfaceView *view = surface->views().first(); - view->setPos(pos); + view->setRequestedPosition(pos); } } else { m_surfaces.removeOne(surface); @@ -215,7 +215,7 @@ void QWindowCompositor::surfaceMapped() if (surface->windowType() == QWaylandSurface::Popup) { QWaylandSurfaceView *view = surface->views().first(); - view->setPos(surface->transientParent()->views().first()->pos() + surface->transientOffset()); + view->setRequestedPosition(surface->transientParent()->views().first()->pos() + surface->transientOffset()); } m_surfaces.append(surface); @@ -428,7 +428,7 @@ bool QWindowCompositor::eventFilter(QObject *obj, QEvent *event) case QEvent::MouseMove: { QMouseEvent *me = static_cast<QMouseEvent *>(event); if (m_draggingWindow) { - m_draggingWindow->setPos(me->localPos() - m_drag_diff); + m_draggingWindow->setRequestedPosition(me->localPos() - m_drag_diff); m_renderScheduler.start(0); } else { QPointF local; diff --git a/src/compositor/compositor_api/qwaylandcompositor.cpp b/src/compositor/compositor_api/qwaylandcompositor.cpp index 112d49923..7ee12cb46 100644 --- a/src/compositor/compositor_api/qwaylandcompositor.cpp +++ b/src/compositor/compositor_api/qwaylandcompositor.cpp @@ -208,10 +208,9 @@ QWaylandSurfaceView *QWaylandCompositor::pickView(const QPointF &globalPosition) // Skip coordinates not in output if (!QRectF(output->geometry()).contains(globalPosition)) continue; - Q_FOREACH (QWaylandSurface *surface, output->surfaces()) { Q_FOREACH (QWaylandSurfaceView *view, surface->views()) { - if (QRectF(view->pos(), surface->size()).contains(globalPosition)) + if (QRectF(view->requestedPosition(), surface->size()).contains(globalPosition)) return view; } } @@ -222,7 +221,7 @@ QWaylandSurfaceView *QWaylandCompositor::pickView(const QPointF &globalPosition) QPointF QWaylandCompositor::mapToView(QWaylandSurfaceView *surface, const QPointF &globalPosition) const { - return globalPosition - surface->pos(); + return globalPosition - surface->requestedPosition(); } /*! diff --git a/src/compositor/compositor_api/qwaylandsurfaceitem.cpp b/src/compositor/compositor_api/qwaylandsurfaceitem.cpp index 528037bc5..5ace77dbc 100644 --- a/src/compositor/compositor_api/qwaylandsurfaceitem.cpp +++ b/src/compositor/compositor_api/qwaylandsurfaceitem.cpp @@ -77,7 +77,7 @@ QWaylandSurfaceItem::QWaylandSurfaceItem(QWaylandQuickSurface *surface, QQuickIt , m_touchEventsEnabled(false) , m_resizeSurfaceToItem(false) , m_newTexture(false) - + , m_followRequestedPos(true) { if (!mutex) mutex = new QMutex; @@ -309,9 +309,17 @@ void QWaylandSurfaceItem::updateSurfaceSize() } } -void QWaylandSurfaceItem::setPos(const QPointF &pos) +void QWaylandSurfaceItem::setRequestedPosition(const QPointF &pos) { - setPosition(pos); + bool xChanged = pos.x() != requestedPosition().x(); + bool yChanged = pos.y() != requestedPosition().y(); + QWaylandSurfaceView::setRequestedPosition(pos); + if (xChanged) + emit requestedXPositionChanged(); + if (yChanged) + emit requestedYPositionChanged(); + if (m_followRequestedPos) + setPosition(pos); } QPointF QWaylandSurfaceItem::pos() const @@ -319,6 +327,44 @@ QPointF QWaylandSurfaceItem::pos() const return position(); } + +bool QWaylandSurfaceItem::followRequestedPosition() const +{ + return m_followRequestedPos; +} + +void QWaylandSurfaceItem::setFollowRequestedPosition(bool follow) +{ + if (m_followRequestedPos != follow) { + m_followRequestedPos = follow; + emit followRequestedPositionChanged(); + } +} + +qreal QWaylandSurfaceItem::requestedXPosition() const +{ + return requestedPosition().x(); +} + +void QWaylandSurfaceItem::setRequestedXPosition(qreal xPos) +{ + QPointF reqPos = requestedPosition(); + reqPos.setX(xPos); + setRequestedPosition(reqPos); +} + +qreal QWaylandSurfaceItem::requestedYPosition() const +{ + return requestedPosition().y(); +} + +void QWaylandSurfaceItem::setRequestedYPosition(qreal yPos) +{ + QPointF reqPos = requestedPosition(); + reqPos.setY(yPos); + setRequestedPosition(reqPos); +} + /*! \qmlproperty bool QtWayland::QWaylandSurfaceItem::paintEnabled diff --git a/src/compositor/compositor_api/qwaylandsurfaceitem.h b/src/compositor/compositor_api/qwaylandsurfaceitem.h index 93afd049d..ab4889e68 100644 --- a/src/compositor/compositor_api/qwaylandsurfaceitem.h +++ b/src/compositor/compositor_api/qwaylandsurfaceitem.h @@ -63,6 +63,9 @@ class Q_COMPOSITOR_EXPORT QWaylandSurfaceItem : public QQuickItem, public QWayla Q_PROPERTY(bool touchEventsEnabled READ touchEventsEnabled WRITE setTouchEventsEnabled NOTIFY touchEventsEnabledChanged) Q_PROPERTY(bool isYInverted READ isYInverted NOTIFY yInvertedChanged) Q_PROPERTY(bool resizeSurfaceToItem READ resizeSurfaceToItem WRITE setResizeSurfaceToItem NOTIFY resizeSurfaceToItemChanged) + Q_PROPERTY(bool followRequestedPosition READ followRequestedPosition WRITE setFollowRequestedPosition NOTIFY followRequestedPositionChanged) + Q_PROPERTY(qreal requestedXPosition READ requestedXPosition WRITE setRequestedXPosition NOTIFY requestedXPositionChanged) + Q_PROPERTY(qreal requestedYPosition READ requestedYPosition WRITE setRequestedYPosition NOTIFY requestedYPositionChanged) public: QWaylandSurfaceItem(QWaylandQuickSurface *surface, QQuickItem *parent = 0); @@ -81,9 +84,16 @@ public: void setTouchEventsEnabled(bool enabled); void setResizeSurfaceToItem(bool enabled); - void setPos(const QPointF &pos) Q_DECL_OVERRIDE; + void setRequestedPosition(const QPointF &pos) Q_DECL_OVERRIDE; QPointF pos() const Q_DECL_OVERRIDE; + bool followRequestedPosition() const; + void setFollowRequestedPosition(bool follow); + qreal requestedXPosition() const; + void setRequestedXPosition(qreal xPos); + qreal requestedYPosition() const; + void setRequestedYPosition(qreal yPos); + protected: void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); @@ -115,6 +125,9 @@ Q_SIGNALS: void yInvertedChanged(); void resizeSurfaceToItemChanged(); void surfaceDestroyed(); + void followRequestedPositionChanged(); + void requestedXPositionChanged(); + void requestedYPositionChanged(); protected: QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *); @@ -133,6 +146,7 @@ private: bool m_yInverted; bool m_resizeSurfaceToItem; bool m_newTexture; + bool m_followRequestedPos; }; QT_END_NAMESPACE diff --git a/src/compositor/compositor_api/qwaylandsurfaceview.cpp b/src/compositor/compositor_api/qwaylandsurfaceview.cpp index da6891011..1c63fb2c4 100644 --- a/src/compositor/compositor_api/qwaylandsurfaceview.cpp +++ b/src/compositor/compositor_api/qwaylandsurfaceview.cpp @@ -46,7 +46,7 @@ class QWaylandSurfaceViewPrivate { public: QWaylandSurface *surface; - QPointF pos; + QPointF requestedPos; }; QWaylandSurfaceView::QWaylandSurfaceView(QWaylandSurface *surf) @@ -82,14 +82,19 @@ QWaylandCompositor *QWaylandSurfaceView::compositor() const return d->surface ? d->surface->compositor() : 0; } -void QWaylandSurfaceView::setPos(const QPointF &pos) +void QWaylandSurfaceView::setRequestedPosition(const QPointF &pos) { - d->pos = pos; + d->requestedPos = pos; +} + +QPointF QWaylandSurfaceView::requestedPosition() const +{ + return d->requestedPos; } QPointF QWaylandSurfaceView::pos() const { - return d->pos; + return d->requestedPos; } QT_END_NAMESPACE diff --git a/src/compositor/compositor_api/qwaylandsurfaceview.h b/src/compositor/compositor_api/qwaylandsurfaceview.h index bb9db3cc4..277ecbc84 100644 --- a/src/compositor/compositor_api/qwaylandsurfaceview.h +++ b/src/compositor/compositor_api/qwaylandsurfaceview.h @@ -55,7 +55,8 @@ public: QWaylandCompositor *compositor() const; QWaylandSurface *surface() const; - virtual void setPos(const QPointF &pos); + virtual void setRequestedPosition(const QPointF &pos); + virtual QPointF requestedPosition() const; virtual QPointF pos() const; private: diff --git a/src/compositor/wayland_wrapper/qwldatadevice.cpp b/src/compositor/wayland_wrapper/qwldatadevice.cpp index 8c28dfeb7..2e694ca27 100644 --- a/src/compositor/wayland_wrapper/qwldatadevice.cpp +++ b/src/compositor/wayland_wrapper/qwldatadevice.cpp @@ -140,7 +140,7 @@ void DataDevice::focus() void DataDevice::motion(uint32_t time) { if (m_dragIcon) { - m_dragIcon->setPos(m_pointer->currentPosition()); + m_dragIcon->setRequestedPosition(m_pointer->currentPosition()); } if (m_dragFocusResource && m_dragFocus) { diff --git a/src/compositor/wayland_wrapper/qwlinputdevice.cpp b/src/compositor/wayland_wrapper/qwlinputdevice.cpp index 479df4d56..13bbdf872 100644 --- a/src/compositor/wayland_wrapper/qwlinputdevice.cpp +++ b/src/compositor/wayland_wrapper/qwlinputdevice.cpp @@ -276,7 +276,7 @@ void InputDevice::sendFullTouchEvent(QTouchEvent *event) return; const int pointCount = points.count(); - QPointF pos = mouseFocus()->pos(); + QPointF pos = mouseFocus()->requestedPosition(); for (int i = 0; i < pointCount; ++i) { const QTouchEvent::TouchPoint &tp(points.at(i)); // Convert the local pos in the compositor window to surface-relative. diff --git a/src/compositor/wayland_wrapper/qwlqttouch.cpp b/src/compositor/wayland_wrapper/qwlqttouch.cpp index aa9492428..b99ff776b 100644 --- a/src/compositor/wayland_wrapper/qwlqttouch.cpp +++ b/src/compositor/wayland_wrapper/qwlqttouch.cpp @@ -71,7 +71,7 @@ bool TouchExtensionGlobal::postTouchEvent(QTouchEvent *event, QWaylandSurfaceVie if (!pointCount) return false; - QPointF surfacePos = view->pos(); + QPointF surfacePos = view->requestedPosition(); wl_client *surfaceClient = view->surface()->handle()->resource()->client(); uint32_t time = m_compositor->currentTimeMsecs(); const int rescount = m_resources.count(); diff --git a/src/compositor/wayland_wrapper/qwlshellsurface.cpp b/src/compositor/wayland_wrapper/qwlshellsurface.cpp index 59301d795..efa211013 100644 --- a/src/compositor/wayland_wrapper/qwlshellsurface.cpp +++ b/src/compositor/wayland_wrapper/qwlshellsurface.cpp @@ -127,14 +127,14 @@ void ShellSurface::adjustPosInResize() int bottomLeftX = m_resizeGrabber->point.x() + m_resizeGrabber->width; int bottomLeftY = m_resizeGrabber->point.y() + m_resizeGrabber->height; - qreal x = m_view->pos().x(); - qreal y = m_view->pos().y(); + qreal x = m_view->requestedPosition().x(); + qreal y = m_view->requestedPosition().y(); if (m_resizeGrabber->resize_edges & WL_SHELL_SURFACE_RESIZE_TOP) y = bottomLeftY - m_view->surface()->size().height(); if (m_resizeGrabber->resize_edges & WL_SHELL_SURFACE_RESIZE_LEFT) x = bottomLeftX - m_view->surface()->size().width(); QPointF newPos(x,y); - m_view->setPos(newPos); + m_view->setRequestedPosition(newPos); } void ShellSurface::resetResizeGrabber() @@ -187,8 +187,8 @@ void ShellSurface::mapped() void ShellSurface::adjustOffset(const QPoint &p) { QPointF offset(p); - QPointF pos = m_view->pos(); - m_view->setPos(pos + offset); + QPointF pos = m_view->requestedPosition(); + m_view->setRequestedPosition(pos + offset); } void ShellSurface::requestSize(const QSize &size) @@ -219,7 +219,7 @@ void ShellSurface::shell_surface_move(Resource *resource, InputDevice *input_device = InputDevice::fromSeatResource(input_device_super); Pointer *pointer = input_device->pointerDevice(); - m_moveGrabber = new ShellSurfaceMoveGrabber(this, pointer->position() - m_view->pos()); + m_moveGrabber = new ShellSurfaceMoveGrabber(this, pointer->position() - m_view->requestedPosition()); pointer->startGrab(m_moveGrabber); } @@ -309,7 +309,7 @@ void ShellSurface::shell_surface_set_fullscreen(Resource *resource, } QSize outputSize = output->geometry().size(); - m_view->setPos(output->geometry().topLeft()); + m_view->setRequestedPosition(output->geometry().topLeft()); send_configure(resize_bottom_right, outputSize.width(), outputSize.height()); m_surface->setVisibility(QWindow::FullScreen); @@ -357,7 +357,7 @@ void ShellSurface::shell_surface_set_maximized(Resource *resource, } QSize outputSize = output->availableGeometry().size(); - m_view->setPos(output->availableGeometry().topLeft()); + m_view->setRequestedPosition(output->availableGeometry().topLeft()); send_configure(resize_bottom_right, outputSize.width(), outputSize.height()); m_surface->setVisibility(QWindow::Maximized); @@ -454,11 +454,11 @@ void ShellSurfaceMoveGrabber::motion(uint32_t time) Q_UNUSED(time); QPointF pos(m_pointer->position() - m_offset); - shell_surface->m_view->setPos(pos); + shell_surface->m_view->setRequestedPosition(pos); if (shell_surface->m_surface->transientParent()) { QWaylandSurfaceView *view = shell_surface->m_surface->transientParent()->waylandSurface()->views().first(); if (view) - shell_surface->setOffset(pos - view->pos()); + shell_surface->setOffset(pos - view->requestedPosition()); } } diff --git a/src/compositor/wayland_wrapper/qwlsubsurface.cpp b/src/compositor/wayland_wrapper/qwlsubsurface.cpp index 3f47f95fe..beffee403 100644 --- a/src/compositor/wayland_wrapper/qwlsubsurface.cpp +++ b/src/compositor/wayland_wrapper/qwlsubsurface.cpp @@ -99,7 +99,7 @@ void SubSurface::setSubSurface(SubSurface *subSurface, int x, int y) subSurface->setParent(this); } foreach (QWaylandSurfaceView *view, subSurface->m_surface->waylandSurface()->views()) - view->setPos(QPointF(x,y)); + view->setRequestedPosition(QPointF(x,y)); } void SubSurface::removeSubSurface(SubSurface *subSurfaces) |