From a9d5b8459618bc803a1f85993d81e22ba99ea6af Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Thu, 4 Feb 2021 16:20:24 +0200 Subject: [PATCH] scene: Refactor damage teardown in X11SurfaceItem This introduces the markedAsZombie signal, which is emitted when the window is about to become deleted. The X11SurfaceItem uses this signal to determine when the damage must be destroyed. --- src/abstract_client.cpp | 1 + src/surfaceitem_x11.cpp | 2 ++ src/toplevel.h | 1 + src/unmanaged.cpp | 10 +--------- src/unmanaged.h | 2 -- src/x11client.cpp | 5 ----- 6 files changed, 5 insertions(+), 16 deletions(-) diff --git a/src/abstract_client.cpp b/src/abstract_client.cpp index 564bde09bc..aed7e17e15 100644 --- a/src/abstract_client.cpp +++ b/src/abstract_client.cpp @@ -240,6 +240,7 @@ void AbstractClient::markAsZombie() Q_ASSERT(!m_zombie); m_zombie = true; addWorkspaceRepaint(visibleGeometry()); + emit markedAsZombie(); } Layer AbstractClient::layer() const diff --git a/src/surfaceitem_x11.cpp b/src/surfaceitem_x11.cpp index 99c1c9395e..04f6f07cb1 100644 --- a/src/surfaceitem_x11.cpp +++ b/src/surfaceitem_x11.cpp @@ -16,6 +16,8 @@ SurfaceItemX11::SurfaceItemX11(Scene::Window *window, Item *parent) connect(toplevel, &Toplevel::bufferGeometryChanged, this, &SurfaceItemX11::handleBufferGeometryChanged); + connect(toplevel, &Toplevel::markedAsZombie, + this, &SurfaceItemX11::destroyDamage); connect(toplevel, &Toplevel::geometryShapeChanged, this, &SurfaceItemX11::discardQuads); diff --git a/src/toplevel.h b/src/toplevel.h index 2c15150fe4..d8d815942e 100644 --- a/src/toplevel.h +++ b/src/toplevel.h @@ -575,6 +575,7 @@ public: } Q_SIGNALS: + void markedAsZombie(); void opacityChanged(KWin::Toplevel* toplevel, qreal oldOpacity); void damaged(KWin::Toplevel* toplevel, const QRegion& damage); void inputTransformationChanged(); diff --git a/src/unmanaged.cpp b/src/unmanaged.cpp index aecddd2fb8..e767980356 100644 --- a/src/unmanaged.cpp +++ b/src/unmanaged.cpp @@ -128,6 +128,7 @@ bool Unmanaged::track(xcb_window_t w) void Unmanaged::release(ReleaseReason releaseReason) { addWorkspaceRepaint(visibleGeometry()); + emit markedAsZombie(); Deleted* del = nullptr; if (releaseReason != ReleaseReason::KWinShutsDown) { del = Deleted::create(this); @@ -214,15 +215,6 @@ QWindow *Unmanaged::findInternalWindow() const return nullptr; } -void Unmanaged::finishCompositing(ReleaseReason releaseReason) -{ - SurfaceItemX11 *item = qobject_cast(surfaceItem()); - if (item) { - item->destroyDamage(); - } - Toplevel::finishCompositing(releaseReason); -} - void Unmanaged::damageNotifyEvent() { Q_ASSERT(kwinApp()->operationMode() == Application::OperationModeX11); diff --git a/src/unmanaged.h b/src/unmanaged.h index 7861408a2c..8ad4a99834 100644 --- a/src/unmanaged.h +++ b/src/unmanaged.h @@ -38,8 +38,6 @@ public: NET::WindowType windowType(bool direct = false, int supported_types = 0) const override; bool isOutline() const override; - void finishCompositing(ReleaseReason releaseReason = ReleaseReason::Release) override; - public Q_SLOTS: void release(ReleaseReason releaseReason = ReleaseReason::Release); diff --git a/src/x11client.cpp b/src/x11client.cpp index 22aa9858cc..da6f34441e 100644 --- a/src/x11client.cpp +++ b/src/x11client.cpp @@ -1367,11 +1367,6 @@ bool X11Client::setupCompositing() void X11Client::finishCompositing(ReleaseReason releaseReason) { - SurfaceItemX11 *item = qobject_cast(surfaceItem()); - if (item) { - item->destroyDamage(); - } - Toplevel::finishCompositing(releaseReason); updateVisibility(); // for safety in case KWin is just resizing the window