summaryrefslogtreecommitdiffstats
path: root/src/compositor/compositor_api/qwaylandcompositor.cpp
diff options
context:
space:
mode:
authorJørgen Lind <jorgen.lind@theqtcompany.com>2015-09-04 14:35:19 +0200
committerJørgen Lind <jorgen.lind@theqtcompany.com>2015-09-04 16:12:47 +0200
commit6358b0ede93c6633802126bf8bf0a44860e66917 (patch)
tree17c8a90565b3aa4f0d3c0cb36a642c0da53bf229 /src/compositor/compositor_api/qwaylandcompositor.cpp
parentb666aa58d7a168fe4ddb694caba099343421aa65 (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.cpp40
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);