diff --git a/windowsview/ukui-window-switch-wlcom/ThumbnailItem.cpp b/windowsview/ukui-window-switch-wlcom/ThumbnailItem.cpp index 0abdac928561b3cdeae0370a6927c30ef1fde629..ca91061454fec96f0927af5abc486e744573e4c4 100644 --- a/windowsview/ukui-window-switch-wlcom/ThumbnailItem.cpp +++ b/windowsview/ukui-window-switch-wlcom/ThumbnailItem.cpp @@ -135,6 +135,13 @@ QSGNode *ThumbnailItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) const auto br = boundingRect().toRect(); textureNode->setRect(br); + if (!m_connectedWindow) { + m_connectedWindow = true; + connect(window(), &QQuickWindow::afterRendering, this, &ThumbnailItem::onAfterRendering, + Qt::DirectConnection); + } + m_renderPending = true; + return textureNode; } @@ -155,6 +162,21 @@ ThumbnailItem::ThumbnailItem(QQuickItem *parent) : QQuickItem(parent), pri(new P } } +void ThumbnailItem::onAfterRendering() +{ + if (m_renderPending) { + m_renderPending = false; + QMetaObject::invokeMethod(this, "onRenderCompleted", Qt::QueuedConnection); + } +} + +void ThumbnailItem::onRenderCompleted() +{ + if (m_thumbnail) { + m_thumbnail->release(true); + } +} + ThumbnailItem::~ThumbnailItem() { if(m_active && !m_thumbnailIsDeleted) { diff --git a/windowsview/ukui-window-switch-wlcom/ThumbnailItem.h b/windowsview/ukui-window-switch-wlcom/ThumbnailItem.h index f158f8712d0121faf1879afc2976f18abf68dc9b..1788f12c38611abcbf5b5e3a48173e4bf517f9a3 100644 --- a/windowsview/ukui-window-switch-wlcom/ThumbnailItem.h +++ b/windowsview/ukui-window-switch-wlcom/ThumbnailItem.h @@ -59,6 +59,8 @@ class ThumbnailItem : public QQuickItem private Q_SLOTS: void BufferImportDmabuf(); void thumbnailIsDeleted(); + void onAfterRendering(); + void onRenderCompleted(); private: void active(bool active); @@ -72,6 +74,8 @@ class ThumbnailItem : public QQuickItem bool m_thumbnailIsDeleted = false; QString m_currentUuid; wl_display *m_display = nullptr; + bool m_renderPending = false; + bool m_connectedWindow = false; }; #endif // ThumbnailItem_H diff --git a/windowsview/ukui-window-switch-wlcom/context.h b/windowsview/ukui-window-switch-wlcom/context.h index 6929d469cd39682632c416e70eec7882f0e28129..ba980e5ab143c436b89daf61ea4d36a7310af438 100644 --- a/windowsview/ukui-window-switch-wlcom/context.h +++ b/windowsview/ukui-window-switch-wlcom/context.h @@ -230,6 +230,7 @@ class Thumbnail : public QObject ~Thumbnail(); void setup(kywc_context *ctx, Thumbnail::Type type, QString uuid, QString output_uuid); + void release(bool wants_buffer); void destory(); int32_t fd() const; diff --git a/windowsview/ukui-window-switch-wlcom/thumbnail.cpp b/windowsview/ukui-window-switch-wlcom/thumbnail.cpp index 7830084ed91adda39dd7546c6e77dadd290fb6d1..1867b90f32cdd9bce9ab4379ba8f65f7c4ada3e1 100644 --- a/windowsview/ukui-window-switch-wlcom/thumbnail.cpp +++ b/windowsview/ukui-window-switch-wlcom/thumbnail.cpp @@ -45,6 +45,8 @@ class Thumbnail::Private Thumbnail *t; static bool bufferHandle(kywc_thumbnail *thumbnail, const struct kywc_thumbnail_buffer *buffer, void *data); + static void bufferUpdateHandle(kywc_thumbnail *thumbnail, + const struct kywc_thumbnail_buffer *buffer, void *data); static void destroyHandle(kywc_thumbnail *thumbnail, void *data); static struct kywc_thumbnail_interface thumbnail_impl; }; @@ -53,8 +55,8 @@ Thumbnail::Private::Private(Thumbnail *thumbnail) : t(thumbnail) {} Thumbnail::Private::~Private() {} -bool Thumbnail::Private::bufferHandle(kywc_thumbnail *thumbnail, - const struct kywc_thumbnail_buffer *buffer, void *data) +void Thumbnail::Private::bufferUpdateHandle(kywc_thumbnail *thumbnail, + const struct kywc_thumbnail_buffer *buffer, void *data) { Thumbnail *thum = (Thumbnail *)data; @@ -90,11 +92,13 @@ bool Thumbnail::Private::bufferHandle(kywc_thumbnail *thumbnail, thum->pri->modifier = buffer->modifier; emit thum->bufferUpdate(); +} - if (buffer->flags & KYWC_THUMBNAIL_BUFFER_IS_DMABUF) { - return true; - } else - return false; +bool Thumbnail::Private::bufferHandle(kywc_thumbnail *thumbnail, + const struct kywc_thumbnail_buffer *buffer, void *data) +{ + bufferUpdateHandle(thumbnail, buffer, data); + return true; } void Thumbnail::Private::destroyHandle(kywc_thumbnail *thumbnail, void *data) @@ -104,7 +108,7 @@ void Thumbnail::Private::destroyHandle(kywc_thumbnail *thumbnail, void *data) } struct kywc_thumbnail_interface Thumbnail::Private::thumbnail_impl { - bufferHandle, destroyHandle, + bufferHandle, destroyHandle,bufferUpdateHandle, }; void Thumbnail::Private::setup(kywc_context *ctx, Thumbnail::Type type, QString uuid, @@ -182,6 +186,13 @@ Thumbnail::BufferFlags Thumbnail::flags() const return pri->flags; } +void Thumbnail::release(bool wants_buffer) +{ + if (pri->k_thumbnail) { + kywc_thumbnail_release(pri->k_thumbnail, wants_buffer); + } +} + void Thumbnail::destory() { if(pri->k_thumbnail) {