diff options
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")); |