summaryrefslogtreecommitdiffstats
path: root/src/compositor
diff options
context:
space:
mode:
authorJørgen Lind <jorgen.lind@theqtcompany.com>2015-07-29 14:34:49 +0200
committerJørgen Lind <jorgen.lind@theqtcompany.com>2015-08-28 13:09:41 +0200
commit6181c91c9718532ac0ccf1566c10953d6a6c69d7 (patch)
treebaa5884e7d990e22601f3b14b2d715d7faa6c4fd /src/compositor
parent71ddf5f5b8611463d4ab824219b9dfa41c45c616 (diff)
Make it possible for QWaylandSurfaceItem to children of arbitrary items
The main problem is that the position of the QWaylandSurfaceItem is changed through the position of the views setPos function. However, it might be that we don't want the surface position to map it directly. Rename QWaylandSurfaceView::setPos to setRequestedPos Then let the compositors choose what to do with this position Change-Id: I43c74baad688d2f3e49ca091bbf436c718e81318
Diffstat (limited to 'src/compositor')
-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
10 files changed, 91 insertions, 26 deletions
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)