diff options
Diffstat (limited to 'src/compositor/compositor_api')
8 files changed, 66 insertions, 31 deletions
diff --git a/src/compositor/compositor_api/qwaylandbufferref.h b/src/compositor/compositor_api/qwaylandbufferref.h index 213474fab..103a1b388 100644 --- a/src/compositor/compositor_api/qwaylandbufferref.h +++ b/src/compositor/compositor_api/qwaylandbufferref.h @@ -65,7 +65,8 @@ public: #ifdef QT_COMPOSITOR_WAYLAND_GL /** * There must be a GL context bound when calling this function. - * It is responsibility of the caller to call destroyTexture() later. + * The texture will be automatically destroyed when the last QWaylandBufferRef + * referring to the same underlying buffer will be destroyed or reset. */ GLuint createTexture(); void destroyTexture(); diff --git a/src/compositor/compositor_api/qwaylandcompositor.cpp b/src/compositor/compositor_api/qwaylandcompositor.cpp index 28e8f9d4a..04d1c4aed 100644 --- a/src/compositor/compositor_api/qwaylandcompositor.cpp +++ b/src/compositor/compositor_api/qwaylandcompositor.cpp @@ -140,6 +140,7 @@ QList<QWaylandSurface *> QWaylandCompositor::surfaces() const { QList<QtWayland::Surface *> surfaces = m_compositor->surfaces(); QList<QWaylandSurface *> surfs; + surfs.reserve(surfaces.count()); foreach (QtWayland::Surface *s, surfaces) surfs << s->waylandSurface(); return surfs; diff --git a/src/compositor/compositor_api/qwaylandcompositor.h b/src/compositor/compositor_api/qwaylandcompositor.h index fe48db06d..1817fa07d 100644 --- a/src/compositor/compositor_api/qwaylandcompositor.h +++ b/src/compositor/compositor_api/qwaylandcompositor.h @@ -75,15 +75,14 @@ class Q_COMPOSITOR_EXPORT QWaylandCompositor public: enum ExtensionFlag { WindowManagerExtension = 0x01, - OutputExtension = 0x02, - SurfaceExtension = 0x04, - QtKeyExtension = 0x08, - TouchExtension = 0x10, - SubSurfaceExtension = 0x20, - TextInputExtension = 0x40, - HardwareIntegrationExtension = 0x80, - - DefaultExtensions = WindowManagerExtension | OutputExtension | SurfaceExtension | QtKeyExtension | TouchExtension | HardwareIntegrationExtension + SurfaceExtension = 0x02, + QtKeyExtension = 0x04, + TouchExtension = 0x08, + SubSurfaceExtension = 0x10, + TextInputExtension = 0x20, + HardwareIntegrationExtension = 0x40, + + DefaultExtensions = WindowManagerExtension | SurfaceExtension | QtKeyExtension | TouchExtension | HardwareIntegrationExtension }; Q_DECLARE_FLAGS(ExtensionFlags, ExtensionFlag) diff --git a/src/compositor/compositor_api/qwaylandquicksurface.cpp b/src/compositor/compositor_api/qwaylandquicksurface.cpp index ef78c8849..c8edcb6bc 100644 --- a/src/compositor/compositor_api/qwaylandquicksurface.cpp +++ b/src/compositor/compositor_api/qwaylandquicksurface.cpp @@ -73,19 +73,12 @@ public: void createTexture() { - if (bufferRef) - bufferRef.destroyTexture(); bufferRef = nextBuffer; + delete texture; + texture = 0; QQuickWindow *window = static_cast<QQuickWindow *>(surface->mainOutput()->window()); - - // If the next buffer is NULL do not delete the current texture. If the client called - // attach(0) the surface is going to be unmapped anyway, if instead the client attached - // a valid buffer but died before we got here we want to keep the old buffer around - // in case some destroy animation is run. - if (bufferRef) { - delete texture; - + if (nextBuffer) { if (bufferRef.isShm()) { texture = window->createTextureFromImage(bufferRef.image()); } else { @@ -101,6 +94,12 @@ public: update = false; } + void unmap() Q_DECL_OVERRIDE + { + nextBuffer = QWaylandBufferRef(); + update = true; + } + void invalidateTexture() { if (bufferRef) @@ -141,9 +140,6 @@ public: void surface_commit(Resource *resource) Q_DECL_OVERRIDE { - if (m_pending.newlyAttached) { - buffer->update = true; - } QWaylandSurfacePrivate::surface_commit(resource); Q_FOREACH (QtWayland::Output *output, outputs()) diff --git a/src/compositor/compositor_api/qwaylandsurface.cpp b/src/compositor/compositor_api/qwaylandsurface.cpp index e5ecb15b4..a8dc41fd5 100644 --- a/src/compositor/compositor_api/qwaylandsurface.cpp +++ b/src/compositor/compositor_api/qwaylandsurface.cpp @@ -71,7 +71,7 @@ QWaylandSurfacePrivate::QWaylandSurfacePrivate(wl_client *wlClient, quint32 id, , closing(false) , refCount(1) , client(QWaylandClient::fromWlClient(wlClient)) - , windowType(QWaylandSurface::WindowType::None) + , windowType(QWaylandSurface::None) {} @@ -322,7 +322,9 @@ QList<QWaylandOutput *> QWaylandSurface::outputs() const Q_D(const QWaylandSurface); QList<QWaylandOutput *> list; - Q_FOREACH (QtWayland::Output *output, d->outputs()) + const QList<QtWayland::Output *> outputs = d->outputs(); + list.reserve(outputs.count()); + Q_FOREACH (QtWayland::Output *output, outputs) list.append(output->waylandOutput()); return list; } @@ -509,4 +511,30 @@ void QWaylandSurfacePrivate::setType(QWaylandSurface::WindowType type) } } +class QWaylandUnmapLockPrivate +{ +public: + QWaylandSurface *surface; +}; + +/*! + Constructs a QWaylandUnmapLock object. + + The lock will act on the \a surface parameter, and will prevent the surface to + be unmapped, retaining the last valid buffer when the client attachs a NULL buffer. + The lock will be automatically released when deleted. +*/ +QWaylandUnmapLock::QWaylandUnmapLock(QWaylandSurface *surface) + : d(new QWaylandUnmapLockPrivate) +{ + d->surface = surface; + surface->handle()->addUnmapLock(this); +} + +QWaylandUnmapLock::~QWaylandUnmapLock() +{ + d->surface->handle()->removeUnmapLock(this); + delete d; +} + QT_END_NAMESPACE diff --git a/src/compositor/compositor_api/qwaylandsurface.h b/src/compositor/compositor_api/qwaylandsurface.h index 653d74c1b..db1e1fb44 100644 --- a/src/compositor/compositor_api/qwaylandsurface.h +++ b/src/compositor/compositor_api/qwaylandsurface.h @@ -77,6 +77,7 @@ public: protected: virtual void attach(const QWaylandBufferRef &ref) = 0; + virtual void unmap() = 0; friend class QtWayland::Surface; }; @@ -261,6 +262,17 @@ Q_SIGNALS: friend class QtWayland::Surface; }; +class QWaylandUnmapLockPrivate; +class Q_COMPOSITOR_EXPORT QWaylandUnmapLock +{ +public: + QWaylandUnmapLock(QWaylandSurface *surface); + ~QWaylandUnmapLock(); + +private: + QWaylandUnmapLockPrivate *const d; +}; + QT_END_NAMESPACE #endif // QWAYLANDSURFACE_H diff --git a/src/compositor/compositor_api/qwaylandsurfaceinterface.cpp b/src/compositor/compositor_api/qwaylandsurfaceinterface.cpp index 355777377..cddd231dd 100644 --- a/src/compositor/compositor_api/qwaylandsurfaceinterface.cpp +++ b/src/compositor/compositor_api/qwaylandsurfaceinterface.cpp @@ -110,7 +110,7 @@ int QWaylandSurfaceOp::type() const QWaylandSurfaceSetVisibilityOp::QWaylandSurfaceSetVisibilityOp(QWindow::Visibility visibility) - : QWaylandSurfaceOp(Type::SetVisibility) + : QWaylandSurfaceOp(QWaylandSurfaceOp::SetVisibility) , m_visibility(visibility) { } @@ -121,7 +121,7 @@ QWindow::Visibility QWaylandSurfaceSetVisibilityOp::visibility() const } QWaylandSurfaceResizeOp::QWaylandSurfaceResizeOp(const QSize &size) - : QWaylandSurfaceOp(Type::Resize) + : QWaylandSurfaceOp(QWaylandSurfaceOp::Resize) , m_size(size) { } @@ -132,7 +132,7 @@ QSize QWaylandSurfaceResizeOp::size() const } QWaylandSurfacePingOp::QWaylandSurfacePingOp(uint32_t serial) - : QWaylandSurfaceOp(Type::Ping) + : QWaylandSurfaceOp(QWaylandSurfaceOp::Ping) , m_serial(serial) { } diff --git a/src/compositor/compositor_api/qwaylandsurfaceitem.cpp b/src/compositor/compositor_api/qwaylandsurfaceitem.cpp index 93cfaf008..0c48df382 100644 --- a/src/compositor/compositor_api/qwaylandsurfaceitem.cpp +++ b/src/compositor/compositor_api/qwaylandsurfaceitem.cpp @@ -364,9 +364,7 @@ void QWaylandSurfaceItem::updateTexture(bool changed) if (!m_provider) m_provider = new QWaylandSurfaceTextureProvider(); - bool mapped = surface() && surface()->isMapped(); - if (mapped) - m_provider->t = static_cast<QWaylandQuickSurface *>(surface())->texture(); + m_provider->t = static_cast<QWaylandQuickSurface *>(surface())->texture(); m_provider->smooth = smooth(); if (m_newTexture || changed) emit m_provider->textureChanged(); |