summaryrefslogtreecommitdiffstats
path: root/src/compositor/compositor_api
diff options
context:
space:
mode:
authorJørgen Lind <jorgen.lind@theqtcompany.com>2015-08-07 12:35:44 +0200
committerJørgen Lind <jorgen.lind@theqtcompany.com>2015-08-28 13:10:33 +0200
commitdfec7314fd3758375e96d4641d2d6b5bec595320 (patch)
tree22cfabe1662b3e45795cd66f80388157490d575f /src/compositor/compositor_api
parentfd9a8983832bbeb240097327ff9f8565f7356b08 (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.cpp10
-rw-r--r--src/compositor/compositor_api/qwaylandoutput.h3
-rw-r--r--src/compositor/compositor_api/qwaylandquickitem.cpp15
-rw-r--r--src/compositor/compositor_api/qwaylandquickitem.h1
-rw-r--r--src/compositor/compositor_api/qwaylandquicksurface.cpp17
-rw-r--r--src/compositor/compositor_api/qwaylandquicksurface.h4
-rw-r--r--src/compositor/compositor_api/qwaylandsurface.cpp56
-rw-r--r--src/compositor/compositor_api/qwaylandsurface.h12
-rw-r--r--src/compositor/compositor_api/qwaylandview.cpp3
-rw-r--r--src/compositor/compositor_api/qwaylandview.h1
-rw-r--r--src/compositor/compositor_api/qwaylandview_p.h2
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;