diff options
author | Jørgen Lind <jorgen.lind@theqtcompany.com> | 2015-08-07 12:35:44 +0200 |
---|---|---|
committer | Jørgen Lind <jorgen.lind@theqtcompany.com> | 2015-08-28 13:10:33 +0200 |
commit | dfec7314fd3758375e96d4641d2d6b5bec595320 (patch) | |
tree | 22cfabe1662b3e45795cd66f80388157490d575f /src/compositor/compositor_api | |
parent | fd9a8983832bbeb240097327ff9f8565f7356b08 (diff) |
Remove output from QWaylandSurface
It is the views that belong to outputs.
This leads to a couple of interesting cases with enter and leave events,
but the implementation says you will get enter events for the first view
of a surface entering an output, and for the last view being removed
from an output.
Also to throttle a surface, there has to be 1 surface which takes care
of this. This is because if multiple views throttle, then the client
might render to quick.
Change-Id: If4bba380fd4d7f506fd769606cbdea4ce58b908d
Diffstat (limited to 'src/compositor/compositor_api')
-rw-r--r-- | src/compositor/compositor_api/qwaylandoutput.cpp | 10 | ||||
-rw-r--r-- | src/compositor/compositor_api/qwaylandoutput.h | 3 | ||||
-rw-r--r-- | src/compositor/compositor_api/qwaylandquickitem.cpp | 15 | ||||
-rw-r--r-- | src/compositor/compositor_api/qwaylandquickitem.h | 1 | ||||
-rw-r--r-- | src/compositor/compositor_api/qwaylandquicksurface.cpp | 17 | ||||
-rw-r--r-- | src/compositor/compositor_api/qwaylandquicksurface.h | 4 | ||||
-rw-r--r-- | src/compositor/compositor_api/qwaylandsurface.cpp | 56 | ||||
-rw-r--r-- | src/compositor/compositor_api/qwaylandsurface.h | 12 | ||||
-rw-r--r-- | src/compositor/compositor_api/qwaylandview.cpp | 3 | ||||
-rw-r--r-- | src/compositor/compositor_api/qwaylandview.h | 1 | ||||
-rw-r--r-- | src/compositor/compositor_api/qwaylandview_p.h | 2 |
11 files changed, 59 insertions, 65 deletions
diff --git a/src/compositor/compositor_api/qwaylandoutput.cpp b/src/compositor/compositor_api/qwaylandoutput.cpp index 08aaf589d..e4865d163 100644 --- a/src/compositor/compositor_api/qwaylandoutput.cpp +++ b/src/compositor/compositor_api/qwaylandoutput.cpp @@ -272,6 +272,16 @@ void QWaylandOutput::sendFrameCallbacks() d_ptr->sendFrameCallbacks(); } +void QWaylandOutput::surfaceEnter(QWaylandSurface *surface) +{ + d_ptr->surfaceEnter(surface); +} + +void QWaylandOutput::surfaceLeave(QWaylandSurface *surface) +{ + d_ptr->surfaceLeave(surface); +} + QtWayland::Output *QWaylandOutput::handle() const { return d_ptr.data(); diff --git a/src/compositor/compositor_api/qwaylandoutput.h b/src/compositor/compositor_api/qwaylandoutput.h index 95d964d83..f261f16a4 100644 --- a/src/compositor/compositor_api/qwaylandoutput.h +++ b/src/compositor/compositor_api/qwaylandoutput.h @@ -160,6 +160,9 @@ public: void frameStarted(); void sendFrameCallbacks(); + void surfaceEnter(QWaylandSurface *surface); + void surfaceLeave(QWaylandSurface *surface); + QtWayland::Output *handle() const; Q_INVOKABLE virtual QWaylandView *pickView(const QPointF &outputPosition) const; diff --git a/src/compositor/compositor_api/qwaylandquickitem.cpp b/src/compositor/compositor_api/qwaylandquickitem.cpp index 4e357dea2..376ea0582 100644 --- a/src/compositor/compositor_api/qwaylandquickitem.cpp +++ b/src/compositor/compositor_api/qwaylandquickitem.cpp @@ -150,6 +150,7 @@ QWaylandQuickItem::QWaylandQuickItem(QQuickItem *parent) setAcceptHoverEvents(true); connect(this, &QQuickItem::windowChanged, this, &QWaylandQuickItem::updateWindow); + connect(this, &QQuickItem::windowChanged, this, &QWaylandQuickItem::outputHasChanged); } QWaylandQuickItem::~QWaylandQuickItem() @@ -354,6 +355,10 @@ void QWaylandQuickItem::waylandSurfaceChanged(QWaylandSurface *newSurface, QWayl m_origin = newSurface->origin(); emit originChanged(); } + if (window()) { + QWaylandOutput *output = newSurface->compositor()->output(window()); + setOutput(output); + } } emit surfaceChanged(); @@ -531,6 +536,16 @@ void QWaylandQuickItem::beforeSync() } } +void QWaylandQuickItem::outputHasChanged() +{ + if (!compositor()) + return; + QWaylandOutput *output = Q_NULLPTR; + if (window()) + output = compositor()->output(window()); + setOutput(output); +} + QSGNode *QWaylandQuickItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) { bool mapped = (surface() && surface()->isMapped() && currentBuffer().hasBuffer()) diff --git a/src/compositor/compositor_api/qwaylandquickitem.h b/src/compositor/compositor_api/qwaylandquickitem.h index d7b32c1aa..33234cfce 100644 --- a/src/compositor/compositor_api/qwaylandquickitem.h +++ b/src/compositor/compositor_api/qwaylandquickitem.h @@ -135,6 +135,7 @@ private Q_SLOTS: void updateBuffer(bool hasBuffer); void updateWindow(); void beforeSync(); + void outputHasChanged(); Q_SIGNALS: void surfaceChanged(); diff --git a/src/compositor/compositor_api/qwaylandquicksurface.cpp b/src/compositor/compositor_api/qwaylandquicksurface.cpp index f5399699d..3e5f1c656 100644 --- a/src/compositor/compositor_api/qwaylandquicksurface.cpp +++ b/src/compositor/compositor_api/qwaylandquicksurface.cpp @@ -41,7 +41,6 @@ #include "qwaylandquicksurface.h" #include "qwaylandquickcompositor.h" -#include "qwaylandoutput.h" #include "qwaylandquickitem.h" #include <QtCompositor/qwaylandbufferref.h> #include <QtCompositor/QWaylandView> @@ -67,16 +66,6 @@ public: { } - void surface_commit(Resource *resource) Q_DECL_OVERRIDE - { - QWaylandSurfacePrivate::surface_commit(resource); - - Q_FOREACH (QWaylandView *view, views) { - if (view->output()) - view->output()->update(); - } - } - QWaylandQuickCompositor *compositor; bool useTextureAlpha; bool clientRenderingEnabled; @@ -85,7 +74,6 @@ public: QWaylandQuickSurface::QWaylandQuickSurface(wl_client *client, quint32 id, int version, QWaylandQuickCompositor *compositor) : QWaylandSurface(new QWaylandQuickSurfacePrivate(client, id, version, compositor, this)) { - connect(this, &QWaylandSurface::primaryOutputChanged, this, &QWaylandQuickSurface::primaryOutputWindowChanged); } QWaylandQuickSurface::~QWaylandQuickSurface() @@ -109,11 +97,6 @@ void QWaylandQuickSurface::setUseTextureAlpha(bool useTextureAlpha) } } -QWindow *QWaylandQuickSurface::primaryOutputWindow() const -{ - return primaryOutput() ? primaryOutput()->window() : Q_NULLPTR; -} - bool QWaylandQuickSurface::clientRenderingEnabled() const { Q_D(const QWaylandQuickSurface); diff --git a/src/compositor/compositor_api/qwaylandquicksurface.h b/src/compositor/compositor_api/qwaylandquicksurface.h index 622a1e7e0..decb15216 100644 --- a/src/compositor/compositor_api/qwaylandquicksurface.h +++ b/src/compositor/compositor_api/qwaylandquicksurface.h @@ -53,7 +53,6 @@ class Q_COMPOSITOR_EXPORT QWaylandQuickSurface : public QWaylandSurface Q_DECLARE_PRIVATE(QWaylandQuickSurface) Q_PROPERTY(bool useTextureAlpha READ useTextureAlpha WRITE setUseTextureAlpha NOTIFY useTextureAlphaChanged) Q_PROPERTY(bool clientRenderingEnabled READ clientRenderingEnabled WRITE setClientRenderingEnabled NOTIFY clientRenderingEnabledChanged) - Q_PROPERTY(QWindow *primaryOutputWindow READ primaryOutputWindow NOTIFY primaryOutputWindowChanged) public: QWaylandQuickSurface(wl_client *client, quint32 id, int version, QWaylandQuickCompositor *compositor); ~QWaylandQuickSurface(); @@ -64,12 +63,9 @@ public: bool clientRenderingEnabled() const; void setClientRenderingEnabled(bool enabled); - QWindow *primaryOutputWindow() const; - Q_SIGNALS: void useTextureAlphaChanged(); void clientRenderingEnabledChanged(); - void primaryOutputWindowChanged(); }; QT_END_NAMESPACE diff --git a/src/compositor/compositor_api/qwaylandsurface.cpp b/src/compositor/compositor_api/qwaylandsurface.cpp index d6d9b1d53..ca5e3cfb9 100644 --- a/src/compositor/compositor_api/qwaylandsurface.cpp +++ b/src/compositor/compositor_api/qwaylandsurface.cpp @@ -53,7 +53,6 @@ #include "qwaylandsurface_p.h" #include "qwaylandview_p.h" #include "qwaylandbufferref.h" -#include "qwaylandoutput.h" #include <QtGui/QGuiApplication> #include <QtGui/QScreen> @@ -162,20 +161,6 @@ QWaylandCompositor *QWaylandSurface::compositor() const return d->compositor()->waylandCompositor(); } -QWaylandOutput *QWaylandSurface::primaryOutput() const -{ - Q_D(const QWaylandSurface); - if (!d->primaryOutput()) - return Q_NULLPTR; - return d->primaryOutput()->waylandOutput(); -} - -void QWaylandSurface::setPrimaryOutput(QWaylandOutput *output) -{ - Q_D(QWaylandSurface); - d->setPrimaryOutput(output->handle()); -} - void QWaylandSurface::sendFrameCallbacks() { Q_D(QWaylandSurface); @@ -212,22 +197,6 @@ void QWaylandSurface::destroy() deref(); } -void QWaylandSurface::enter(QWaylandOutput *output) -{ - Q_D(QWaylandSurface); - QtWayland::OutputResource *outputResource = output->handle()->outputForClient(d->resource()->client()); - if (outputResource) - handle()->send_enter(outputResource->handle); -} - -void QWaylandSurface::leave(QWaylandOutput *output) -{ - Q_D(QWaylandSurface); - QtWayland::OutputResource *outputResource = output->handle()->outputForClient(d->resource()->client()); - if (outputResource) - d->send_leave(outputResource->handle); -} - void QWaylandSurface::markAsCursorSurface(bool cursorSurface) { Q_D(QWaylandSurface); @@ -271,6 +240,31 @@ void QWaylandSurface::deref() compositor()->handle()->destroySurface(d); } +QWaylandView *QWaylandSurface::throttlingView() const +{ + Q_D(const QWaylandSurface); + if (d->views.isEmpty()) + return Q_NULLPTR; + return d->views.first(); +} + +void QWaylandSurface::setThrottlingView(QWaylandView *view) +{ + Q_D(QWaylandSurface); + + if (!view) + return; + + int index = d->views.indexOf(view); + + if (index < 0) { + view->setSurface(this); + index = d->views.indexOf(view); + } + + d->views.move(index, 0); +} + QList<QWaylandView *> QWaylandSurface::views() const { Q_D(const QWaylandSurface); diff --git a/src/compositor/compositor_api/qwaylandsurface.h b/src/compositor/compositor_api/qwaylandsurface.h index 038c7d611..17f585e73 100644 --- a/src/compositor/compositor_api/qwaylandsurface.h +++ b/src/compositor/compositor_api/qwaylandsurface.h @@ -58,7 +58,6 @@ class QWaylandCompositor; class QWaylandBufferRef; class QWaylandView; class QWaylandSurfaceOp; -class QWaylandOutput; namespace QtWayland { class Surface; @@ -75,7 +74,6 @@ class Q_COMPOSITOR_EXPORT QWaylandSurface : public QObject, public QWaylandExten Q_PROPERTY(Qt::ScreenOrientation contentOrientation READ contentOrientation NOTIFY contentOrientationChanged) Q_PROPERTY(QString className READ className NOTIFY classNameChanged) Q_PROPERTY(QString title READ title NOTIFY titleChanged) - Q_PROPERTY(QWaylandOutput *primaryOutput READ primaryOutput WRITE setPrimaryOutput NOTIFY primaryOutputChanged) Q_PROPERTY(QWaylandSurface::Origin origin READ origin NOTIFY originChanged) Q_PROPERTY(bool isMapped READ isMapped NOTIFY mappedChanged) @@ -108,9 +106,6 @@ public: QWaylandCompositor *compositor() const; - QWaylandOutput *primaryOutput() const; - void setPrimaryOutput(QWaylandOutput *output); - QString className() const; QString title() const; @@ -126,14 +121,14 @@ public: void ref(); void deref(); + QWaylandView *throttlingView() const; + void setThrottlingView(QWaylandView *view); + QList<QWaylandView *> views() const; static QWaylandSurface *fromResource(::wl_resource *resource); struct wl_resource *resource() const; - void enter(QWaylandOutput *output); - void leave(QWaylandOutput *output); - void markAsCursorSurface(bool cursorSurface); bool isCursorSurface() const; @@ -157,7 +152,6 @@ Q_SIGNALS: void lowerRequested(); void pong(); void surfaceDestroyed(); - void primaryOutputChanged(QWaylandOutput *newOutput, QWaylandOutput *oldOutput); void originChanged(); void configure(bool hasBuffer); diff --git a/src/compositor/compositor_api/qwaylandview.cpp b/src/compositor/compositor_api/qwaylandview.cpp index 1a64b73ee..1dd570d94 100644 --- a/src/compositor/compositor_api/qwaylandview.cpp +++ b/src/compositor/compositor_api/qwaylandview.cpp @@ -91,9 +91,6 @@ void QWaylandView::setSurface(QWaylandSurface *newSurface) if (d->surface == newSurface) return; - if (!d->output && newSurface && !d->surface) - setOutput(newSurface->primaryOutput()); - QWaylandSurface *oldSurface = d->surface; d->surface = newSurface; diff --git a/src/compositor/compositor_api/qwaylandview.h b/src/compositor/compositor_api/qwaylandview.h index a11e20df9..4bb9b39d5 100644 --- a/src/compositor/compositor_api/qwaylandview.h +++ b/src/compositor/compositor_api/qwaylandview.h @@ -47,6 +47,7 @@ QT_BEGIN_NAMESPACE class QWaylandSurface; class QWaylandCompositor; class QWaylandViewPrivate; +class QWaylandOutput; class Q_COMPOSITOR_EXPORT QWaylandView { diff --git a/src/compositor/compositor_api/qwaylandview_p.h b/src/compositor/compositor_api/qwaylandview_p.h index 777675f96..562b54f6c 100644 --- a/src/compositor/compositor_api/qwaylandview_p.h +++ b/src/compositor/compositor_api/qwaylandview_p.h @@ -64,7 +64,7 @@ public: bool shouldBroadcastRequestedPositionChanged() const { - return broadcastRequestedPositionChanged && output && surface && surface->primaryOutput() == output; + return broadcastRequestedPositionChanged && output; } QWaylandView *q_ptr; |