From b708a93c1e7d87b6f39d0a6680d5d3ef3c999c41 Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Thu, 29 Aug 2024 17:07:29 +0300 Subject: [PATCH] scene: Add an assert to debug crash in BlurEffect::prePaintWindow() This checks whether a WindowItem is destroyed in the middle of a painting cycle. This is meant as short-term means to debug the issue. --- src/scene/workspacescene.cpp | 11 +++++++++++ src/scene/workspacescene.h | 1 + 2 files changed, 12 insertions(+) diff --git a/src/scene/workspacescene.cpp b/src/scene/workspacescene.cpp index aad9fa0e96..475b35a4ac 100644 --- a/src/scene/workspacescene.cpp +++ b/src/scene/workspacescene.cpp @@ -102,6 +102,14 @@ WorkspaceScene::WorkspaceScene(std::unique_ptr renderer) connect(waylandServer()->seat(), &SeatInterface::dragStarted, this, &WorkspaceScene::createDndIconItem); connect(waylandServer()->seat(), &SeatInterface::dragEnded, this, &WorkspaceScene::destroyDndIconItem); } + + connect(m_containerItem.get(), &Item::childAdded, this, [this](Item *item) { + connect(item, &Item::destroyed, this, [this]() { + if (m_painting) { + qFatal("Destroyed an item while painting"); + } + }); + }); } WorkspaceScene::~WorkspaceScene() @@ -255,6 +263,7 @@ void WorkspaceScene::frame(SceneDelegate *delegate, OutputFrame *frame) QRegion WorkspaceScene::prePaint(SceneDelegate *delegate) { + m_painting = true; createStackingOrder(); painted_delegate = delegate; @@ -384,6 +393,8 @@ void WorkspaceScene::preparePaintSimpleScreen() void WorkspaceScene::postPaint() { + m_painting = false; + for (WindowItem *w : std::as_const(stacking_order)) { effects->postPaintWindow(w->effectWindow()); } diff --git a/src/scene/workspacescene.h b/src/scene/workspacescene.h index 43a13630aa..7b195aa032 100644 --- a/src/scene/workspacescene.h +++ b/src/scene/workspacescene.h @@ -134,6 +134,7 @@ private: std::unique_ptr m_containerItem; std::unique_ptr m_overlayItem; std::unique_ptr m_dndIcon; + bool m_painting = false; }; } // namespace