diff options
author | Jørgen Lind <jorgen.lind@theqtcompany.com> | 2015-09-04 14:35:19 +0200 |
---|---|---|
committer | Jørgen Lind <jorgen.lind@theqtcompany.com> | 2015-09-04 16:12:47 +0200 |
commit | 6358b0ede93c6633802126bf8bf0a44860e66917 (patch) | |
tree | 17c8a90565b3aa4f0d3c0cb36a642c0da53bf229 /src/compositor/compositor_api/qwaylandsurface.cpp | |
parent | b666aa58d7a168fe4ddb694caba099343421aa65 (diff) |
Make it possible to connect to a createSurface signal
Remove the QWaylandSurface factory function from QWaylandCompositor.
Add a default constructor to QWaylandSurface and a initialize function.
Add som housekeeping code in debug builds that ensures the user calls
initialize.
Add a fallback factory function on the compositor if the user is fine
with getting the default implementation of QWaylandSurface or
QWaylandQuickSurface
Change-Id: Ib9289c323b6723f0d1119a484cf9e0c26c95b549
Diffstat (limited to 'src/compositor/compositor_api/qwaylandsurface.cpp')
-rw-r--r-- | src/compositor/compositor_api/qwaylandsurface.cpp | 67 |
1 files changed, 59 insertions, 8 deletions
diff --git a/src/compositor/compositor_api/qwaylandsurface.cpp b/src/compositor/compositor_api/qwaylandsurface.cpp index 37d07515c..58312de56 100644 --- a/src/compositor/compositor_api/qwaylandsurface.cpp +++ b/src/compositor/compositor_api/qwaylandsurface.cpp @@ -113,22 +113,28 @@ static QRegion infiniteRegion() { QPoint(std::numeric_limits<int>::max(), std::numeric_limits<int>::max()))); } -QWaylandSurfacePrivate::QWaylandSurfacePrivate(QWaylandClient *client, quint32 id, int version, QWaylandCompositor *compositor) - : QtWaylandServer::wl_surface(client->client(), id, version) - , compositor(compositor) +QList<QWaylandSurfacePrivate *> QWaylandSurfacePrivate::uninitializedSurfaces; + +QWaylandSurfacePrivate::QWaylandSurfacePrivate() + : QtWaylandServer::wl_surface() + , compositor(Q_NULLPTR) , refCount(1) - , client(client) + , client(Q_NULLPTR) , buffer(0) , inputPanelSurface(0) , inputRegion(infiniteRegion()) , isCursorSurface(false) , destroyed(false) , mapped(false) + , isInitialized(false) , contentOrientation(Qt::PrimaryOrientation) { pending.buffer = 0; pending.newlyAttached = false; pending.inputRegion = infiniteRegion(); +#ifndef QT_NO_DEBUG + addUninitializedSurface(this); +#endif } QWaylandSurfacePrivate::~QWaylandSurfacePrivate() @@ -173,6 +179,27 @@ void QWaylandSurfacePrivate::notifyViewsAboutDestruction() } } +#ifndef QT_NO_DEBUG +void QWaylandSurfacePrivate::addUninitializedSurface(QWaylandSurfacePrivate *surface) +{ + Q_ASSERT(!surface->isInitialized); + Q_ASSERT(!uninitializedSurfaces.contains(surface)); + uninitializedSurfaces.append(surface); +} + +void QWaylandSurfacePrivate::removeUninitializedSurface(QWaylandSurfacePrivate *surface) +{ + Q_ASSERT(surface->isInitialized); + bool removed = uninitializedSurfaces.removeOne(surface); + Q_ASSERT(removed); +} + +bool QWaylandSurfacePrivate::hasUninitializedSurface() +{ + return uninitializedSurfaces.size(); +} +#endif + void QWaylandSurfacePrivate::surface_destroy_resource(Resource *) { Q_Q(QWaylandSurface); @@ -319,13 +346,19 @@ QtWayland::SurfaceBuffer *QWaylandSurfacePrivate::createSurfaceBuffer(struct ::w return newBuffer; } -QWaylandSurface::QWaylandSurface(QWaylandClient *client, quint32 id, int version, QWaylandCompositor *compositor) - : QObject(*new QWaylandSurfacePrivate(client, id, version, compositor)) +QWaylandSurface::QWaylandSurface() + : QObject(*new QWaylandSurfacePrivate()) { } -QWaylandSurface::QWaylandSurface(QWaylandSurfacePrivate *dptr) - : QObject(*dptr) +QWaylandSurface::QWaylandSurface(QWaylandCompositor *compositor, QWaylandClient *client, uint id, int version) + : QObject(*new QWaylandSurfacePrivate()) +{ + initialize(compositor, client, id, version); +} + +QWaylandSurface::QWaylandSurface(QWaylandSurfacePrivate &dptr) + : QObject(dptr) { } @@ -340,6 +373,24 @@ QWaylandSurface::~QWaylandSurface() } } +void QWaylandSurface::initialize(QWaylandCompositor *compositor, QWaylandClient *client, uint id, int version) +{ + Q_D(QWaylandSurface); + d->compositor = compositor; + d->client = client; + d->init(client->client(), id, version); + d->isInitialized = true; +#ifndef QT_NO_DEBUG + QWaylandSurfacePrivate::removeUninitializedSurface(d); +#endif +} + +bool QWaylandSurface::isInitialized() const +{ + Q_D(const QWaylandSurface); + return d->isInitialized; +} + QWaylandClient *QWaylandSurface::client() const { Q_D(const QWaylandSurface); |