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/qwaylandcompositor.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/qwaylandcompositor.cpp')
-rw-r--r-- | src/compositor/compositor_api/qwaylandcompositor.cpp | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/src/compositor/compositor_api/qwaylandcompositor.cpp b/src/compositor/compositor_api/qwaylandcompositor.cpp index b9be85335..c3c3a3179 100644 --- a/src/compositor/compositor_api/qwaylandcompositor.cpp +++ b/src/compositor/compositor_api/qwaylandcompositor.cpp @@ -241,11 +241,34 @@ void QWaylandCompositorPrivate::addPolishObject(QObject *object) } } +/*! + \fn void QWaylandCompositor::createSurface(QWaylandClient *client, uint id, int version) + + This signal is emitted when a client has created a wl_surface object on the + server side. The slot connecting to this signal has to create and initialize + a QWaylandSurface instance in the scope of the slot. Connections to this + signal has to be of Qt::DirectConnection connection type. + +*/ + void QWaylandCompositorPrivate::compositor_create_surface(Resource *resource, uint32_t id) { Q_Q(QWaylandCompositor); QWaylandClient *client = QWaylandClient::fromWlClient(q, resource->client()); - QWaylandSurface *surface = q->createSurface(client, id, resource->version()); + emit q->createSurface(client, id, resource->version()); +#ifndef QT_NO_DEBUG + Q_ASSERT_X(!QWaylandSurfacePrivate::hasUninitializedSurface(), "QWaylandCompositor", QStringLiteral("Found uninitialized QWaylandSurface after emitting QWaylandCompositor::createSurface for id %1. All surfaces has to be initialized immediately after creation. See QWaylandSurface::initialize.").arg(id).toLocal8Bit().constData()); +#endif + struct wl_resource *surfResource = wl_client_get_object(client->client(), id); + + QWaylandSurface *surface; + if (surfResource) { + surface = QWaylandSurface::fromResource(surfResource); + } else { + surface = q->createDefaultSurfaceType(); + surface->initialize(q, client, id, resource->version()); + } + Q_ASSERT(surface); all_surfaces.append(surface); emit q->surfaceCreated(surface); } @@ -472,11 +495,6 @@ uint QWaylandCompositor::currentTimeMsecs() const return d->timer.elapsed(); } -QWaylandSurface *QWaylandCompositor::createSurface(QWaylandClient *client, quint32 id, int version) -{ - return new QWaylandSurface(client, id, version, this); -} - void QWaylandCompositor::cleanupGraphicsResources() { Q_D(QWaylandCompositor); @@ -494,6 +512,16 @@ void QWaylandCompositor::processWaylandEvents() } +/*! + \internal + Used to create a fallback QWaylandSurface when no surface was + created by emitting the QWaylandCompositor::createSurface signal. +*/ +QWaylandSurface *QWaylandCompositor::createDefaultSurfaceType() +{ + return new QWaylandSurface(); +} + QWaylandInputDevice *QWaylandCompositor::createInputDevice() { return new QWaylandInputDevice(this); |