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.
This commit is contained in:
Vlad Zahorodnii 2021-02-04 16:20:24 +02:00
parent 47113e09b8
commit a9d5b84596
6 changed files with 5 additions and 16 deletions

View file

@ -240,6 +240,7 @@ void AbstractClient::markAsZombie()
Q_ASSERT(!m_zombie);
m_zombie = true;
addWorkspaceRepaint(visibleGeometry());
emit markedAsZombie();
}
Layer AbstractClient::layer() const

View file

@ -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);

View file

@ -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();

View file

@ -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<SurfaceItemX11 *>(surfaceItem());
if (item) {
item->destroyDamage();
}
Toplevel::finishCompositing(releaseReason);
}
void Unmanaged::damageNotifyEvent()
{
Q_ASSERT(kwinApp()->operationMode() == Application::OperationModeX11);

View file

@ -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);

View file

@ -1367,11 +1367,6 @@ bool X11Client::setupCompositing()
void X11Client::finishCompositing(ReleaseReason releaseReason)
{
SurfaceItemX11 *item = qobject_cast<SurfaceItemX11 *>(surfaceItem());
if (item) {
item->destroyDamage();
}
Toplevel::finishCompositing(releaseReason);
updateVisibility();
// for safety in case KWin is just resizing the window