summaryrefslogtreecommitdiffstats
path: root/src/compositor
diff options
context:
space:
mode:
authorJørgen Lind <jorgen.lind@theqtcompany.com>2015-09-03 12:40:19 +0200
committerJørgen Lind <jorgen.lind@theqtcompany.com>2015-09-04 16:12:47 +0200
commit4c5a796e96a66c18afbde0577d8b912a618fe710 (patch)
treee9b3aa53541f67d58dbf1599ae3181ac2cdae2ae /src/compositor
parenta814616ff34bf5901fc299c6ba91c80cad39922d (diff)
Make it possible to construct QWaylandOutput
This requires QWaylandOutput to be initialized. This will happend when the QWaylandCompositor of the QWaylandOutputSpace that is set on the QWaylandOutput is created. QWaylandCompositor will send or post a Polish event to the QWaylandOutput which again will call QWaylandOutput::initialize. This function will create the global that will be put on the wl_displays registry This makes it possible to Create WaylandOutputs in QML (see the pure-qml example) and also gives a better programming model in C++ Change-Id: Iaf907ae18a283678eda6d04390dc9790ae0bced8
Diffstat (limited to 'src/compositor')
-rw-r--r--src/compositor/compositor_api/qwaylandcompositor.cpp8
-rw-r--r--src/compositor/compositor_api/qwaylandcompositor.h7
-rw-r--r--src/compositor/compositor_api/qwaylandcompositor_p.h3
-rw-r--r--src/compositor/compositor_api/qwaylandoutput.cpp113
-rw-r--r--src/compositor/compositor_api/qwaylandoutput.h21
-rw-r--r--src/compositor/compositor_api/qwaylandoutput_p.h5
-rw-r--r--src/compositor/compositor_api/qwaylandoutputspace.cpp47
-rw-r--r--src/compositor/compositor_api/qwaylandoutputspace.h9
-rw-r--r--src/compositor/compositor_api/qwaylandoutputspace_p.h27
-rw-r--r--src/compositor/compositor_api/qwaylandquickcompositor.cpp14
-rw-r--r--src/compositor/compositor_api/qwaylandquickcompositor.h2
-rw-r--r--src/compositor/compositor_api/qwaylandquickoutput.cpp36
-rw-r--r--src/compositor/compositor_api/qwaylandquickoutput.h8
13 files changed, 157 insertions, 143 deletions
diff --git a/src/compositor/compositor_api/qwaylandcompositor.cpp b/src/compositor/compositor_api/qwaylandcompositor.cpp
index cc8c2ba4e..77e7ddce3 100644
--- a/src/compositor/compositor_api/qwaylandcompositor.cpp
+++ b/src/compositor/compositor_api/qwaylandcompositor.cpp
@@ -147,6 +147,7 @@ void QWaylandCompositorPrivate::init()
{
Q_Q(QWaylandCompositor);
outputSpaces.append(new QWaylandOutputSpace(q));
+
QStringList arguments = QCoreApplication::instance()->arguments();
int socketArg = arguments.indexOf(QLatin1String("--wayland-socket-name"));
@@ -183,7 +184,6 @@ void QWaylandCompositorPrivate::init()
qRegisterMetaType<QWaylandClient*>("WaylandClient*");
qRegisterMetaType<QWaylandSurface*>("WaylandSurface*");
qRegisterMetaType<QWaylandView*>("WaylandSurfaceView*");
- //initialize distancefieldglyphcache here
initializeHardwareIntegration();
initializeDefaultInputDevice();
@@ -472,12 +472,6 @@ uint QWaylandCompositor::currentTimeMsecs() const
return d->timer.elapsed();
}
-QWaylandOutput *QWaylandCompositor::createOutput(QWaylandOutputSpace *outputSpace,
- QWindow *window)
-{
- return new QWaylandOutput(outputSpace, window);
-}
-
QWaylandSurface *QWaylandCompositor::createSurface(QWaylandClient *client, quint32 id, int version)
{
return new QWaylandSurface(client, id, version, this);
diff --git a/src/compositor/compositor_api/qwaylandcompositor.h b/src/compositor/compositor_api/qwaylandcompositor.h
index a1118b421..45e4a7fac 100644
--- a/src/compositor/compositor_api/qwaylandcompositor.h
+++ b/src/compositor/compositor_api/qwaylandcompositor.h
@@ -39,6 +39,7 @@
#include <QtCompositor/qwaylandexport.h>
#include <QtCompositor/qwaylandextension.h>
+#include <QtCompositor/QWaylandOutput>
#include <QObject>
#include <QImage>
@@ -60,7 +61,6 @@ class QWaylandInputDevice;
class QWaylandDrag;
class QWaylandGlobalInterface;
class QWaylandView;
-class QWaylandOutput;
class QWaylandOutputSpace;
class QWaylandPointer;
class QWaylandKeyboard;
@@ -97,7 +97,7 @@ public:
QList<QWaylandSurface *> surfaces() const;
QList<QWaylandSurface *> surfacesForClient(QWaylandClient* client) const;
- QWaylandOutput *output(QWindow *window) const;
+ Q_INVOKABLE QWaylandOutput *output(QWindow *window) const;
QWaylandOutput *primaryOutput() const;
QWaylandOutputSpace *primaryOutputSpace() const;
@@ -125,6 +125,7 @@ public:
bool useHardwareIntegrationExtension() const;
void setUseHardwareIntegrationExtension(bool use);
+
public Q_SLOTS:
void cleanupGraphicsResources();
void processWaylandEvents();
@@ -140,8 +141,6 @@ Q_SIGNALS:
void useHardwareIntegrationExtensionChanged();
protected:
virtual void retainedSelectionReceived(QMimeData *mimeData);
- virtual QWaylandOutput *createOutput(QWaylandOutputSpace *outputSpace,
- QWindow *window);
virtual QWaylandSurface *createSurface(QWaylandClient *client, quint32 id, int version);
virtual QWaylandInputDevice *createInputDevice();
virtual QWaylandPointer *createPointerDevice(QWaylandInputDevice *inputDevice);
diff --git a/src/compositor/compositor_api/qwaylandcompositor_p.h b/src/compositor/compositor_api/qwaylandcompositor_p.h
index 2fcbb290c..6fa06c112 100644
--- a/src/compositor/compositor_api/qwaylandcompositor_p.h
+++ b/src/compositor/compositor_api/qwaylandcompositor_p.h
@@ -81,9 +81,6 @@ public:
QtWayland::DataDeviceManager *dataDeviceManager() const { return data_device_manager; }
void feedRetainedSelectionData(QMimeData *data);
- QWaylandOutput *callCreateOutput(QWaylandOutputSpace *outputSpace,
- QWindow *window)
- { return q_func()->createOutput(outputSpace, window); }
QWaylandPointer *callCreatePointerDevice(QWaylandInputDevice *inputDevice)
{ return q_func()->createPointerDevice(inputDevice); }
QWaylandKeyboard *callCreateKeyboardDevice(QWaylandInputDevice *inputDevice)
diff --git a/src/compositor/compositor_api/qwaylandoutput.cpp b/src/compositor/compositor_api/qwaylandoutput.cpp
index 6a40ad896..363cf4653 100644
--- a/src/compositor/compositor_api/qwaylandoutput.cpp
+++ b/src/compositor/compositor_api/qwaylandoutput.cpp
@@ -38,10 +38,11 @@
#include "qwaylandoutput.h"
#include "qwaylandoutput_p.h"
-#include "qwaylandcompositor.h"
-#include "qwaylandview.h"
+#include <QtCompositor/QWaylandCompositor>
+#include <QtCompositor/QWaylandView>
#include <QtCompositor/private/qwaylandsurface_p.h>
+#include <QtCompositor/private/qwaylandoutputspace_p.h>
#include <QtCore/QCoreApplication>
#include <QtCore/QtMath>
@@ -97,17 +98,17 @@ static QtWaylandServer::wl_output::transform toWlTransform(const QWaylandOutput:
return QtWaylandServer::wl_output::transform_normal;
}
-QWaylandOutputPrivate::QWaylandOutputPrivate(QWaylandCompositor *compositor, QWindow *window)
- : QtWaylandServer::wl_output(compositor->display(), 2)
- , compositor(compositor)
+QWaylandOutputPrivate::QWaylandOutputPrivate()
+ : QtWaylandServer::wl_output()
, outputSpace(Q_NULLPTR)
- , window(window)
+ , window(Q_NULLPTR)
, subpixel(QWaylandOutput::SubpixelUnknown)
, transform(QWaylandOutput::TransformNormal)
, scaleFactor(1)
, sizeFollowsWindow(true)
+ , initialized(false)
{
- mode.size = window ? window->size() : QSize();
+ mode.size = QSize();
mode.refreshRate = 60;
qRegisterMetaType<QWaylandOutput::Mode>("WaylandOutput::Mode");
@@ -117,8 +118,8 @@ QWaylandOutputPrivate::~QWaylandOutputPrivate()
{
Q_Q(QWaylandOutput);
if (outputSpace) {
+ QWaylandOutputSpacePrivate::get(outputSpace)->removeOutput(q);
outputSpace = Q_NULLPTR;
- outputSpace->removeOutput(q);
}
}
@@ -185,19 +186,47 @@ void QWaylandOutputPrivate::removeView(QWaylandView *view, QWaylandSurface *surf
qWarning("%s Could not find view %p for surface %p to remove. Possible invalid state", Q_FUNC_INFO, view, surface);
}
+QWaylandOutput::QWaylandOutput()
+ : QObject(*new QWaylandOutputPrivate())
+{
+}
+
QWaylandOutput::QWaylandOutput(QWaylandOutputSpace *outputSpace, QWindow *window)
- : QObject(*new QWaylandOutputPrivate(outputSpace->compositor(), window))
+ : QObject(*new QWaylandOutputPrivate())
{
- setOutputSpace(outputSpace);
- QObject::connect(window, &QWindow::widthChanged, this, &QWaylandOutput::setWidth);
- QObject::connect(window, &QWindow::heightChanged, this, &QWaylandOutput::setHeight);
- QObject::connect(window, &QObject::destroyed, this, &QWaylandOutput::windowDestroyed);
+ Q_D(QWaylandOutput);
+ d->outputSpace = outputSpace;
+ d->window = window;
+ QWaylandCompositorPrivate::get(outputSpace->compositor())->addPolishObject(this);
}
QWaylandOutput::~QWaylandOutput()
{
}
+void QWaylandOutput::initialize()
+{
+ Q_D(QWaylandOutput);
+
+ Q_ASSERT(!d->initialized);
+ Q_ASSERT(d->outputSpace);
+ Q_ASSERT(d->window);
+ Q_ASSERT(d->outputSpace->compositor());
+ Q_ASSERT(d->outputSpace->compositor()->isCreated());
+
+ d->mode.size = d->window->size();
+
+ QWaylandOutputSpacePrivate::get(d->outputSpace)->addOutput(this);
+
+ QObject::connect(d->window, &QWindow::widthChanged, this, &QWaylandOutput::setWidth);
+ QObject::connect(d->window, &QWindow::heightChanged, this, &QWaylandOutput::setHeight);
+ QObject::connect(d->window, &QObject::destroyed, this, &QWaylandOutput::handleWindowDestroyed);
+
+ d->init(d->compositor()->display(), 2);
+
+ d->initialized = true;
+}
+
QWaylandOutput *QWaylandOutput::fromResource(wl_resource *resource)
{
return static_cast<QWaylandOutputPrivate *>(QWaylandOutputPrivate::Resource::fromResource(resource)->output_object)->q_func();
@@ -213,31 +242,33 @@ struct ::wl_resource *QWaylandOutput::outputForClient(QWaylandClient *client) co
return Q_NULLPTR;
}
+QWaylandOutputSpace *QWaylandOutput::outputSpace() const
+{
+ return d_func()->outputSpace;
+}
+
void QWaylandOutput::setOutputSpace(QWaylandOutputSpace *outputSpace)
{
- Q_ASSERT(outputSpace);
Q_D(QWaylandOutput);
+
if (d->outputSpace == outputSpace)
return;
- if (d->outputSpace) {
- d->outputSpace->removeOutput(this);
+ if (d->initialized) {
+ qWarning("Setting QWaylandOutputSpace %p on QWaylandOutput %p is not supported after QWaylandOutput has been initialized\n", outputSpace, this);
+ return;
}
-
- d->outputSpace = outputSpace;
-
- if (outputSpace) {
- outputSpace->addOutput(this);
+ if (d->outputSpace && d->outputSpace->compositor() != outputSpace->compositor()) {
+ qWarning("Possible initialization error. Moving QWaylandOutput %p between compositor instances.\n", this);
}
+ if (!d->outputSpace) {
+ QWaylandCompositorPrivate::get(outputSpace->compositor())->addPolishObject(this);
+ }
+ d->outputSpace = outputSpace;
emit outputSpaceChanged();
}
-QWaylandOutputSpace *QWaylandOutput::outputSpace() const
-{
- return d_func()->outputSpace;
-}
-
void QWaylandOutput::update()
{
QRect rect(QPoint(0, 0), window()->size());
@@ -248,7 +279,7 @@ void QWaylandOutput::update()
QWaylandCompositor *QWaylandOutput::compositor() const
{
- return d_func()->compositor;
+ return d_func()->compositor();
}
QString QWaylandOutput::manufacturer() const
@@ -481,6 +512,19 @@ QWindow *QWaylandOutput::window() const
return d_func()->window;
}
+void QWaylandOutput::setWindow(QWindow *window)
+{
+ Q_D(QWaylandOutput);
+ if (d->window == window)
+ return;
+ if (d->initialized) {
+ qWarning("Setting QWindow %p on QWaylandOutput %p is not supported after QWaylandOutput has been initialized\n", window, this);
+ return;
+ }
+ d->window = window;
+ emit windowChanged();
+}
+
void QWaylandOutput::frameStarted()
{
Q_D(QWaylandOutput);
@@ -504,7 +548,7 @@ void QWaylandOutput::sendFrameCallbacks()
surfacemapper.surface->sendFrameCallbacks();
}
}
- wl_display_flush_clients(d->compositor->display());
+ wl_display_flush_clients(d->compositor()->display());
}
void QWaylandOutput::surfaceEnter(QWaylandSurface *surface)
@@ -569,9 +613,18 @@ QPointF QWaylandOutput::mapToOutputSpace(const QPointF &point)
return point + d_func()->position;
}
-void QWaylandOutput::windowDestroyed()
+void QWaylandOutput::handleWindowDestroyed()
+{
+ Q_D(QWaylandOutput);
+ d->window = Q_NULLPTR;
+ emit windowDestroyed();
+}
+
+bool QWaylandOutput::event(QEvent *event)
{
- delete this;
+ if (event->type() == QEvent::Polish)
+ initialize();
+ return QObject::event(event);
}
QT_END_NAMESPACE
diff --git a/src/compositor/compositor_api/qwaylandoutput.h b/src/compositor/compositor_api/qwaylandoutput.h
index dcf06c02b..63ef384b7 100644
--- a/src/compositor/compositor_api/qwaylandoutput.h
+++ b/src/compositor/compositor_api/qwaylandoutput.h
@@ -61,6 +61,8 @@ class Q_COMPOSITOR_EXPORT QWaylandOutput : public QObject, public QWaylandExtens
{
Q_OBJECT
Q_DECLARE_PRIVATE(QWaylandOutput)
+ Q_PROPERTY(QWindow *window READ window WRITE setWindow NOTIFY windowChanged)
+ Q_PROPERTY(QWaylandOutputSpace *outputSpace READ outputSpace WRITE setOutputSpace NOTIFY outputSpaceChanged)
Q_PROPERTY(QString manufacturer READ manufacturer WRITE setManufacturer NOTIFY manufacturerChanged)
Q_PROPERTY(QString model READ model WRITE setModel NOTIFY modelChanged)
Q_PROPERTY(QPoint position READ position WRITE setPosition NOTIFY positionChanged)
@@ -72,9 +74,7 @@ class Q_COMPOSITOR_EXPORT QWaylandOutput : public QObject, public QWaylandExtens
Q_PROPERTY(QWaylandOutput::Transform transform READ transform WRITE setTransform NOTIFY transformChanged)
Q_PROPERTY(int scaleFactor READ scaleFactor WRITE setScaleFactor NOTIFY scaleFactorChanged)
Q_PROPERTY(QWaylandCompositor *compositor READ compositor CONSTANT)
- Q_PROPERTY(QWindow *window READ window CONSTANT)
Q_PROPERTY(bool sizeFollowsWindow READ sizeFollowsWindow WRITE setSizeFollowsWindow NOTIFY sizeFollowsWindowChanged)
- Q_PROPERTY(QWaylandOutputSpace *outputSpace READ outputSpace WRITE setOutputSpace NOTIFY outputSpaceChanged)
Q_ENUMS(Subpixel Transform)
public:
@@ -104,18 +104,21 @@ public:
int refreshRate;
};
+ QWaylandOutput();
QWaylandOutput(QWaylandOutputSpace *outputSpace, QWindow *window);
~QWaylandOutput();
static QWaylandOutput *fromResource(wl_resource *resource);
+ //### rename to resourceForClient
struct ::wl_resource *outputForClient(QWaylandClient *client) const;
QWaylandCompositor *compositor() const;
+
QWindow *window() const;
+ void setWindow(QWindow *window);
- void setOutputSpace(QWaylandOutputSpace *outputSpace);
QWaylandOutputSpace *outputSpace() const;
-
+ void setOutputSpace(QWaylandOutputSpace *outputSpace);
QString manufacturer() const;
void setManufacturer(const QString &manufacturer);
@@ -169,6 +172,8 @@ public:
Q_INVOKABLE QPointF mapToOutputSpace(const QPointF &point);
Q_SIGNALS:
+ void outputSpaceChanged();
+ void windowChanged();
void positionChanged();
void geometryChanged();
void modeChanged();
@@ -179,13 +184,17 @@ Q_SIGNALS:
void transformChanged();
void sizeFollowsWindowChanged();
void physicalSizeFollowsSizeChanged();
- void outputSpaceChanged();
void manufacturerChanged();
void modelChanged();
+ void windowDestroyed();
private Q_SLOTS:
- void windowDestroyed();
+ void handleWindowDestroyed();
+
+protected:
+ bool event(QEvent *event) Q_DECL_OVERRIDE;
+ virtual void initialize();
};
Q_DECLARE_METATYPE(QWaylandOutput::Mode)
diff --git a/src/compositor/compositor_api/qwaylandoutput_p.h b/src/compositor/compositor_api/qwaylandoutput_p.h
index 990849e5e..67e963814 100644
--- a/src/compositor/compositor_api/qwaylandoutput_p.h
+++ b/src/compositor/compositor_api/qwaylandoutput_p.h
@@ -85,7 +85,7 @@ struct QWaylandSurfaceViewMapper
class Q_COMPOSITOR_EXPORT QWaylandOutputPrivate : public QObjectPrivate, public QtWaylandServer::wl_output
{
public:
- QWaylandOutputPrivate(QWaylandCompositor *compositor, QWindow *window);
+ QWaylandOutputPrivate();
~QWaylandOutputPrivate();
static QWaylandOutputPrivate *get(QWaylandOutput *output) { return output->d_func(); }
@@ -94,12 +94,12 @@ public:
void removeView(QWaylandView *view, QWaylandSurface *surface);
void sendGeometryInfo();
+ QWaylandCompositor *compositor() const { return outputSpace->compositor(); }
protected:
void output_bind_resource(Resource *resource) Q_DECL_OVERRIDE;
private:
- QWaylandCompositor *compositor;
QWaylandOutputSpace *outputSpace;
QWindow *window;
QString manufacturer;
@@ -113,6 +113,7 @@ private:
QWaylandOutput::Transform transform;
int scaleFactor;
bool sizeFollowsWindow;
+ bool initialized;
Q_DECLARE_PUBLIC(QWaylandOutput)
Q_DISABLE_COPY(QWaylandOutputPrivate)
diff --git a/src/compositor/compositor_api/qwaylandoutputspace.cpp b/src/compositor/compositor_api/qwaylandoutputspace.cpp
index 0e9473ac7..46e09f97a 100644
--- a/src/compositor/compositor_api/qwaylandoutputspace.cpp
+++ b/src/compositor/compositor_api/qwaylandoutputspace.cpp
@@ -84,39 +84,14 @@ QWaylandOutputSpace::GeometryConstraint QWaylandOutputSpace::geometryConstraint(
return d->geometryConstraint;
}
-QWaylandOutput *QWaylandOutputSpace::addOutputWindow(QWindow *outputWindow)
-{
- Q_D(QWaylandOutputSpace);
- return d->createAndAddOutput(outputWindow, false);
-}
-
-QWaylandOutput *QWaylandOutputSpace::addPrimaryOutputWindow(QWindow *outputWindow)
-{
- Q_D(QWaylandOutputSpace);
- return d->createAndAddOutput(outputWindow, true);
-}
-
-void QWaylandOutputSpace::addOutput(QWaylandOutput *output)
-{
- Q_D(QWaylandOutputSpace);
- d->addOutput(output, false);
-}
-
-void QWaylandOutputSpace::addPrimaryOutput(QWaylandOutput *output)
-{
- Q_D(QWaylandOutputSpace);
- d->addOutput(output, true);
-}
-
-void QWaylandOutputSpace::removeOutput(QWaylandOutput *output)
+QWaylandOutput *QWaylandOutputSpace::output(QWindow *window) const
{
- Q_ASSERT(output);
- Q_D(QWaylandOutputSpace);
- if ( d->outputs.removeOne(output)) {
- output->setOutputSpace(Q_NULLPTR);
- d->adjustGeometry();
- outputsChanged();
+ Q_D(const QWaylandOutputSpace);
+ foreach (QWaylandOutput *output, d->outputs) {
+ if (output->window() == window)
+ return output;
}
+ return Q_NULLPTR;
}
void QWaylandOutputSpace::setPrimaryOutput(QWaylandOutput *output)
@@ -131,16 +106,6 @@ void QWaylandOutputSpace::setPrimaryOutput(QWaylandOutput *output)
}
}
-QWaylandOutput *QWaylandOutputSpace::output(QWindow *window) const
-{
- Q_D(const QWaylandOutputSpace);
- foreach (QWaylandOutput *output, d->outputs) {
- if (output->window() == window)
- return output;
- }
- return Q_NULLPTR;
-}
-
QWaylandOutput *QWaylandOutputSpace::primaryOutput() const
{
Q_D(const QWaylandOutputSpace);
diff --git a/src/compositor/compositor_api/qwaylandoutputspace.h b/src/compositor/compositor_api/qwaylandoutputspace.h
index 9b6767a5d..b123274f3 100644
--- a/src/compositor/compositor_api/qwaylandoutputspace.h
+++ b/src/compositor/compositor_api/qwaylandoutputspace.h
@@ -39,7 +39,7 @@
#include <QtCore/QObject>
-#include "qwaylandoutput.h"
+#include <QtCompositor/QWaylandOutput>
QT_BEGIN_NAMESPACE
@@ -51,6 +51,7 @@ class Q_COMPOSITOR_EXPORT QWaylandOutputSpace : public QObject
Q_DECLARE_PRIVATE(QWaylandOutputSpace)
Q_ENUMS(GeometryConstraint)
+
Q_PROPERTY(GeometryConstraint geometryConstraint READ geometryConstraint WRITE setGeometryConstraint NOTIFY geometryConstraintChanged)
Q_PROPERTY(QRect geometry READ geometry WRITE setGeometry NOTIFY geometryChanged)
Q_PROPERTY(QWaylandOutput *primaryOutput READ primaryOutput WRITE setPrimaryOutput NOTIFY primaryOutputChanged)
@@ -71,12 +72,6 @@ public:
void setGeometryConstraint(GeometryConstraint geometryConstraint);
GeometryConstraint geometryConstraint() const;
- Q_INVOKABLE QWaylandOutput *addOutputWindow(QWindow *outputWindow);
- Q_INVOKABLE QWaylandOutput *addPrimaryOutputWindow(QWindow *outputWindow);
- Q_INVOKABLE void addOutput(QWaylandOutput *output);
- Q_INVOKABLE void addPrimaryOutput(QWaylandOutput *output);
- Q_INVOKABLE void removeOutput(QWaylandOutput *output);
-
Q_INVOKABLE QWaylandOutput *output(QWindow *window) const;
QWaylandOutput *primaryOutput() const;
diff --git a/src/compositor/compositor_api/qwaylandoutputspace_p.h b/src/compositor/compositor_api/qwaylandoutputspace_p.h
index ab7ef847f..0589ac800 100644
--- a/src/compositor/compositor_api/qwaylandoutputspace_p.h
+++ b/src/compositor/compositor_api/qwaylandoutputspace_p.h
@@ -76,31 +76,28 @@ public:
geometry = completeRect;
}
- QWaylandOutput *createAndAddOutput(QWindow *window,
- bool primary)
+ void addOutput(QWaylandOutput *output)
{
Q_Q(QWaylandOutputSpace);
- QWaylandOutput *output = QWaylandCompositorPrivate::get(compositor)->callCreateOutput(q, window);
- addOutput(output, primary);
- return output;
+ Q_ASSERT(output);
+ Q_ASSERT(!outputs.contains(output));
+
+ outputs.append(output);
+
+ adjustGeometry();
+
+ q->outputsChanged();
}
- void addOutput(QWaylandOutput *output, bool primary)
+ void removeOutput(QWaylandOutput *output)
{
Q_Q(QWaylandOutputSpace);
Q_ASSERT(output);
- if (outputs.contains(output))
- return;
+ bool removed = outputs.removeOne(output);
+ Q_ASSERT(removed);
- if (primary)
- outputs.prepend(output);
- else
- outputs.append(output);
adjustGeometry();
-
- output->setOutputSpace(q);
-
q->outputsChanged();
}
diff --git a/src/compositor/compositor_api/qwaylandquickcompositor.cpp b/src/compositor/compositor_api/qwaylandquickcompositor.cpp
index 7d9893a15..860e59fcb 100644
--- a/src/compositor/compositor_api/qwaylandquickcompositor.cpp
+++ b/src/compositor/compositor_api/qwaylandquickcompositor.cpp
@@ -84,20 +84,6 @@ void QWaylandQuickCompositor::setInitializeLegazyQmlNames(bool init)
m_initializeLegazyQmlNames = init;
}
-QWaylandOutput *QWaylandQuickCompositor::createOutput(QWaylandOutputSpace *outputSpace,
- QWindow *window)
-{
- QQmlEngine::setObjectOwnership(window, QQmlEngine::CppOwnership);
-
- QQuickWindow *quickWindow = qobject_cast<QQuickWindow *>(window);
- if (!quickWindow)
- qFatal("%s: couldn't cast QWindow to QQuickWindow. All output windows must "
- "be QQuickWindow derivates when using QWaylandQuickCompositor", Q_FUNC_INFO);
- QWaylandQuickOutput *output = new QWaylandQuickOutput(outputSpace, quickWindow);
- QQmlEngine::setObjectOwnership(output, QQmlEngine::CppOwnership);
- return output;
-}
-
QWaylandSurface *QWaylandQuickCompositor::createSurface(QWaylandClient *client, quint32 id, int version)
{
return new QWaylandQuickSurface(client, id, version, this);
diff --git a/src/compositor/compositor_api/qwaylandquickcompositor.h b/src/compositor/compositor_api/qwaylandquickcompositor.h
index 65c138a03..3952b2ffe 100644
--- a/src/compositor/compositor_api/qwaylandquickcompositor.h
+++ b/src/compositor/compositor_api/qwaylandquickcompositor.h
@@ -59,8 +59,6 @@ public:
bool initializeLegazyQmlNames() const;
void setInitializeLegazyQmlNames(bool init);
- QWaylandOutput *createOutput(QWaylandOutputSpace *outputSpace,
- QWindow *window) Q_DECL_OVERRIDE;
QWaylandSurface *createSurface(QWaylandClient *client, quint32 id, int version) Q_DECL_OVERRIDE;
protected:
diff --git a/src/compositor/compositor_api/qwaylandquickoutput.cpp b/src/compositor/compositor_api/qwaylandquickoutput.cpp
index 463901572..a32689225 100644
--- a/src/compositor/compositor_api/qwaylandquickoutput.cpp
+++ b/src/compositor/compositor_api/qwaylandquickoutput.cpp
@@ -40,28 +40,42 @@
QT_BEGIN_NAMESPACE
-QWaylandQuickOutput::QWaylandQuickOutput(QWaylandOutputSpace *outputSpace, QQuickWindow *window)
+QWaylandQuickOutput::QWaylandQuickOutput()
+ : QWaylandOutput()
+ , m_updateScheduled(false)
+ , m_automaticFrameCallback(true)
+{
+}
+
+QWaylandQuickOutput::QWaylandQuickOutput(QWaylandOutputSpace *outputSpace, QWindow *window)
: QWaylandOutput(outputSpace, window)
, m_updateScheduled(false)
, m_automaticFrameCallback(true)
{
- connect(window, &QQuickWindow::beforeSynchronizing,
+}
+
+void QWaylandQuickOutput::initialize()
+{
+ QWaylandOutput::initialize();
+
+ QQuickWindow *quickWindow = qobject_cast<QQuickWindow *>(window());
+ if (!quickWindow) {
+ qWarning("Initialization error: Could not locate QQuickWindow on initializing QWaylandQucikOutput %p.\n", this);
+ return;
+ }
+ connect(quickWindow, &QQuickWindow::beforeSynchronizing,
this, &QWaylandQuickOutput::updateStarted,
Qt::DirectConnection);
- connect(window, &QQuickWindow::beforeRendering,
+ connect(quickWindow, &QQuickWindow::beforeRendering,
this, &QWaylandQuickOutput::doFrameCallbacks);
}
-QQuickWindow *QWaylandQuickOutput::quickWindow() const
-{
- return static_cast<QQuickWindow *>(window());
-}
-
void QWaylandQuickOutput::update()
{
if (!m_updateScheduled) {
- quickWindow()->update();
+ //don't qobject_cast since we have verified the type in initialize
+ static_cast<QQuickWindow *>(window())->update();
m_updateScheduled = true;
}
}
@@ -83,6 +97,10 @@ void QWaylandQuickOutput::setAutomaticFrameCallback(bool automatic)
void QWaylandQuickOutput::updateStarted()
{
m_updateScheduled = false;
+
+ if (!compositor())
+ return;
+
frameStarted();
compositor()->cleanupGraphicsResources();
}
diff --git a/src/compositor/compositor_api/qwaylandquickoutput.h b/src/compositor/compositor_api/qwaylandquickoutput.h
index d7e37bbe1..05cb42ed5 100644
--- a/src/compositor/compositor_api/qwaylandquickoutput.h
+++ b/src/compositor/compositor_api/qwaylandquickoutput.h
@@ -51,9 +51,8 @@ class Q_COMPOSITOR_EXPORT QWaylandQuickOutput : public QWaylandOutput
Q_OBJECT
Q_PROPERTY(bool automaticFrameCallback READ automaticFrameCallback WRITE setAutomaticFrameCallback NOTIFY automaticFrameCallbackChanged)
public:
- QWaylandQuickOutput(QWaylandOutputSpace *outputSpace, QQuickWindow *window);
-
- QQuickWindow *quickWindow() const;
+ QWaylandQuickOutput();
+ QWaylandQuickOutput(QWaylandOutputSpace *outputSpace, QWindow *window);
void update() Q_DECL_OVERRIDE;
@@ -66,6 +65,9 @@ public Q_SLOTS:
Q_SIGNALS:
void automaticFrameCallbackChanged();
+protected:
+ void initialize() Q_DECL_OVERRIDE;
+
private:
void doFrameCallbacks();