summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/wayland/pure-qml/qml/Screen.qml51
-rw-r--r--examples/wayland/pure-qml/qml/main.qml9
-rw-r--r--examples/wayland/qml-compositor/main.cpp4
-rw-r--r--examples/wayland/qwindow-compositor/qwindowcompositor.cpp2
-rw-r--r--examples/wayland/server-buffer/compositor/main.cpp4
-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
-rw-r--r--src/imports/compositor/qwaylandquickcompositorplugin.cpp4
19 files changed, 194 insertions, 180 deletions
diff --git a/examples/wayland/pure-qml/qml/Screen.qml b/examples/wayland/pure-qml/qml/Screen.qml
index 1faaa2cce..61e044cbf 100644
--- a/examples/wayland/pure-qml/qml/Screen.qml
+++ b/examples/wayland/pure-qml/qml/Screen.qml
@@ -42,35 +42,38 @@ import QtQuick 2.0
import QtQuick.Window 2.2
import QtWayland.Compositor 1.0
-Window {
- id: screen
- property alias surfacesArea: background
+WaylandOutput {
+ id: output
+ property alias surfaceArea: background
+ window: Window {
+ id: screen
- property QtObject compositor
+ property QtObject output
- width: 1024
- height: 760
- visible: true
+ width: 1024
+ height: 760
+ visible: true
- WaylandMouseTracker {
- id: mouseTracker
- anchors.fill: parent
-
- enableWSCursor: true
- Image {
- id: background
+ WaylandMouseTracker {
+ id: mouseTracker
anchors.fill: parent
- fillMode: Image.Tile
- source: "qrc:/images/background.jpg"
- smooth: true
- }
- WaylandCursorItem {
- id: cursor
- inputEventsEnabled: false
- x: mouseTracker.mouseX - hotspotX
- y: mouseTracker.mouseY - hotspotY
- inputDevice: output.compositor.defaultInputDevice
+ enableWSCursor: true
+ Image {
+ id: background
+ anchors.fill: parent
+ fillMode: Image.Tile
+ source: "qrc:/images/background.jpg"
+ smooth: true
+ }
+ WaylandCursorItem {
+ id: cursor
+ inputEventsEnabled: false
+ x: mouseTracker.mouseX - hotspotX
+ y: mouseTracker.mouseY - hotspotY
+
+ inputDevice: output.compositor.defaultInputDevice
+ }
}
}
}
diff --git a/examples/wayland/pure-qml/qml/main.qml b/examples/wayland/pure-qml/qml/main.qml
index 66382c479..61b88574d 100644
--- a/examples/wayland/pure-qml/qml/main.qml
+++ b/examples/wayland/pure-qml/qml/main.qml
@@ -66,7 +66,7 @@ WaylandCompositor {
}
onCreateShellSurface: {
- var item = chromeComponent.createObject(primarySurfacesArea, { "surface": surface } );
+ var item = chromeComponent.createObject(primaryOutput.surfaceArea, { "surface": surface } );
var shellSurface = shellSurfaceComponent.createObject();
shellSurface.initialize(defaultShell, surface, item.view, client, id);
}
@@ -78,14 +78,11 @@ WaylandCompositor {
]
function addScreen() {
- var screen = screenComponent.createObject(0, { "compositor" : compositor } );
- primarySurfacesArea = screen.surfacesArea;
- var output = compositor.primaryOutputSpace.addOutputWindow(screen);
- output.automaticFrameCallback = true;
+ var screen = screenComponent.createObject(0, { "outputSpace" : primaryOutputSpace } );
}
Component.onCompleted: {
- addScreen();
+ addScreen(WaylandOutput.PrimaryOutput);
}
}
diff --git a/examples/wayland/qml-compositor/main.cpp b/examples/wayland/qml-compositor/main.cpp
index 861a0be4c..a3bd6671f 100644
--- a/examples/wayland/qml-compositor/main.cpp
+++ b/examples/wayland/qml-compositor/main.cpp
@@ -43,7 +43,7 @@
#include "qwaylandquicksurface.h"
#include <QtCompositor/qwaylandquickitem.h>
-#include <QtCompositor/qwaylandoutput.h>
+#include <QtCompositor/QWaylandQuickOutput>
#include <QtCompositor/qwaylandoutputspace.h>
#include <QGuiApplication>
@@ -72,7 +72,7 @@ public:
setResizeMode(QQuickView::SizeRootObjectToView);
setColor(Qt::black);
winId();
- m_output = m_compositor.primaryOutputSpace()->addOutputWindow(this);
+ m_output = new QWaylandQuickOutput(m_compositor.primaryOutputSpace(), this);
connect(this, SIGNAL(afterRendering()), this, SLOT(sendCallbacks()));
connect(&m_compositor, &QWaylandCompositor::surfaceCreated, this, &QmlCompositor::onSurfaceCreated);
diff --git a/examples/wayland/qwindow-compositor/qwindowcompositor.cpp b/examples/wayland/qwindow-compositor/qwindowcompositor.cpp
index 8c97f1d55..7522e3cdb 100644
--- a/examples/wayland/qwindow-compositor/qwindowcompositor.cpp
+++ b/examples/wayland/qwindow-compositor/qwindowcompositor.cpp
@@ -147,7 +147,7 @@ void QWindowCompositor::create()
{
QWaylandCompositor::create();
- primaryOutputSpace()->addOutputWindow(m_window);
+ new QWaylandOutput(primaryOutputSpace(), m_window);
m_renderScheduler.setSingleShot(true);
connect(&m_renderScheduler, &QTimer::timeout, this, &QWindowCompositor::render);
diff --git a/examples/wayland/server-buffer/compositor/main.cpp b/examples/wayland/server-buffer/compositor/main.cpp
index d6e09dca4..36a9ca9c9 100644
--- a/examples/wayland/server-buffer/compositor/main.cpp
+++ b/examples/wayland/server-buffer/compositor/main.cpp
@@ -56,7 +56,7 @@
#include <QQuickView>
#include "qwayland-server-share-buffer.h"
-#include <QtCompositor/qwaylandoutput.h>
+#include <QtCompositor/QWaylandQuickOutput>
#include <QtCompositor/QWaylandCompositor>
#include <QtCompositor/QWaylandQuickItem>
#include <QtCompositor/private/qwaylandcompositor_p.h>
@@ -86,7 +86,7 @@ public:
m_view.setResizeMode(QQuickView::SizeRootObjectToView);
m_view.setColor(Qt::black);
m_view.create();
- m_output = primaryOutputSpace()->addOutputWindow(&m_view);
+ m_output = new QWaylandQuickOutput(primaryOutputSpace(), &m_view);
connect(&m_view, &QQuickView::afterRendering, this, &QmlCompositor::sendCallbacks);
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();
diff --git a/src/imports/compositor/qwaylandquickcompositorplugin.cpp b/src/imports/compositor/qwaylandquickcompositorplugin.cpp
index 4ab8385b1..7532001a9 100644
--- a/src/imports/compositor/qwaylandquickcompositorplugin.cpp
+++ b/src/imports/compositor/qwaylandquickcompositorplugin.cpp
@@ -43,7 +43,7 @@
#include <QtCompositor/QWaylandQuickItem>
#include <QtCompositor/QWaylandQuickSurface>
#include <QtCompositor/QWaylandClient>
-#include <QtCompositor/QWaylandOutput>
+#include <QtCompositor/QWaylandQuickOutput>
#include <QtCompositor/QWaylandOutputSpace>
#include <QtCompositor/QWaylandExtension>
#include <QtCompositor/QWaylandQuickExtension>
@@ -124,11 +124,11 @@ public:
qmlRegisterType<QWaylandQuickCompositorQuickExtension>(uri, 1, 0, "WaylandCompositor");
qmlRegisterType<QWaylandQuickItem>(uri, 1, 0, "WaylandQuickItem");
qmlRegisterType<QWaylandMouseTracker>(uri, 1, 0, "WaylandMouseTracker");
+ qmlRegisterType<QWaylandQuickOutput>(uri, 1, 0, "WaylandOutput");
qmlRegisterUncreatableType<QWaylandExtension>(uri, 1, 0, "WaylandExtension", QObject::tr("Cannot create instance of WaylandExtension"));
qmlRegisterUncreatableType<QWaylandSurface>(uri, 1, 0, "WaylandSurface", QObject::tr("Cannot create instance of WaylandQuickSurface"));
qmlRegisterUncreatableType<QWaylandClient>(uri, 1, 0, "WaylandClient", QObject::tr("Cannot create instance of WaylandClient"));
- qmlRegisterUncreatableType<QWaylandOutput>(uri, 1, 0, "WaylandOutput", QObject::tr("Cannot create instance of WaylandOutput"));
qmlRegisterUncreatableType<QWaylandOutputSpace>(uri, 1, 0, "WaylandOutputSpace", QObject::tr("Cannot create instance of WaylandOutputSpace"));
qmlRegisterUncreatableType<QWaylandView>(uri, 1, 0, "WaylandView", QObject::tr("Cannot create instance of WaylandView, it can be retrieved by accessor on WaylandQuickItem"));
qmlRegisterUncreatableType<QWaylandInputDevice>(uri, 1, 0, "WaylandInputDevice", QObject::tr("Cannot create instance of WaylandInputDevice"));