From 370d2a35229e4ba27e9917325cf5d5f96d469e20 Mon Sep 17 00:00:00 2001 From: sundagao Date: Sat, 7 Feb 2026 21:32:28 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix(thumbnail):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E9=A2=84=E8=A7=88=E5=9B=BE=E5=B4=A9=E6=BA=83=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 同步 wlcom 代码 Bug: #493293 From: kylin Severity: Low/Moderate/Important/Critical Changelog-Bug: #493293 【多任务视图】多任务视图无法打开 Change-Id: Ie3f3ebcd3c5cba056a3ded1e85df14dd937b6d4b --- .../ThumbnailItem.cpp | 20 +++++++++++++++ .../ukui-window-switch-wlcom/ThumbnailItem.h | 4 +++ .../ukui-window-switch-wlcom/context.h | 1 + .../ukui-window-switch-wlcom/thumbnail.cpp | 25 +++++++++++++------ 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/windowsview/ukui-window-switch-wlcom/ThumbnailItem.cpp b/windowsview/ukui-window-switch-wlcom/ThumbnailItem.cpp index 0abdac928..50d06ea64 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,19 @@ 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() +{ + 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 f158f8712..1788f12c3 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 6929d469c..ba980e5ab 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 7830084ed..1867b90f3 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) { -- Gitee From 5f73377a913304fc37cc03771985f092eefee2ea Mon Sep 17 00:00:00 2001 From: sundagao Date: Mon, 9 Feb 2026 09:42:52 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix(thumbnail):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E9=A2=84=E8=A7=88=E5=9B=BE=E5=B4=A9=E6=BA=83=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 解决 m_thumbnail 未判空导致得崩溃问题 Bug: #493293 From: kylin Severity: Critical Changelog-Bug: #493293 【多任务视图】多任务视图无法打开 Change-Id: Ide17a622a3c6ae5627988f8697b4fa52b0b3f177 --- windowsview/ukui-window-switch-wlcom/ThumbnailItem.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/windowsview/ukui-window-switch-wlcom/ThumbnailItem.cpp b/windowsview/ukui-window-switch-wlcom/ThumbnailItem.cpp index 50d06ea64..ca9106145 100644 --- a/windowsview/ukui-window-switch-wlcom/ThumbnailItem.cpp +++ b/windowsview/ukui-window-switch-wlcom/ThumbnailItem.cpp @@ -172,7 +172,9 @@ void ThumbnailItem::onAfterRendering() void ThumbnailItem::onRenderCompleted() { - m_thumbnail->release(true); + if (m_thumbnail) { + m_thumbnail->release(true); + } } ThumbnailItem::~ThumbnailItem() -- Gitee