summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/wayland/qwindow-compositor/qwindowcompositor.cpp6
-rw-r--r--src/compositor/compositor_api/qwaylandcompositor.cpp5
-rw-r--r--src/compositor/compositor_api/qwaylandsurfaceitem.cpp52
-rw-r--r--src/compositor/compositor_api/qwaylandsurfaceitem.h16
-rw-r--r--src/compositor/compositor_api/qwaylandsurfaceview.cpp13
-rw-r--r--src/compositor/compositor_api/qwaylandsurfaceview.h3
-rw-r--r--src/compositor/wayland_wrapper/qwldatadevice.cpp2
-rw-r--r--src/compositor/wayland_wrapper/qwlinputdevice.cpp2
-rw-r--r--src/compositor/wayland_wrapper/qwlqttouch.cpp2
-rw-r--r--src/compositor/wayland_wrapper/qwlshellsurface.cpp20
-rw-r--r--src/compositor/wayland_wrapper/qwlsubsurface.cpp2
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)