From 337261bbf7f86c68f540e9cc7f1511fe2bd65bd0 Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Tue, 16 Nov 2021 15:01:22 +0200 Subject: [PATCH] effects/slidingpopups: Remove slide manager global with a delay --- src/effects/slidingpopups/slidingpopups.cpp | 22 ++++++++++++++++++++- src/effects/slidingpopups/slidingpopups.h | 6 +++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/effects/slidingpopups/slidingpopups.cpp b/src/effects/slidingpopups/slidingpopups.cpp index 15e76b6d44..b19726cef7 100644 --- a/src/effects/slidingpopups/slidingpopups.cpp +++ b/src/effects/slidingpopups/slidingpopups.cpp @@ -13,6 +13,7 @@ #include #include +#include #include #include @@ -25,12 +26,27 @@ Q_DECLARE_METATYPE(KWindowEffects::SlideFromLocation) namespace KWin { +KWaylandServer::SlideManagerInterface *SlidingPopupsEffect::s_slideManager = nullptr; +QTimer *SlidingPopupsEffect::s_slideManagerRemoveTimer = nullptr; + SlidingPopupsEffect::SlidingPopupsEffect() { initConfig(); + KWaylandServer::Display *display = effects->waylandDisplay(); if (display) { - m_slideManager.reset(new KWaylandServer::SlideManagerInterface(display)); + if (!s_slideManagerRemoveTimer) { + s_slideManagerRemoveTimer = new QTimer(qApp); + s_slideManagerRemoveTimer->setSingleShot(true); + s_slideManagerRemoveTimer->callOnTimeout([]() { + s_slideManager->remove(); + s_slideManager = nullptr; + }); + } + s_slideManagerRemoveTimer->stop(); + if (!s_slideManager) { + s_slideManager = new KWaylandServer::SlideManagerInterface(display, s_slideManagerRemoveTimer); + } } m_slideLength = QFontMetrics(qApp->font()).height() * 8; @@ -62,6 +78,10 @@ SlidingPopupsEffect::SlidingPopupsEffect() SlidingPopupsEffect::~SlidingPopupsEffect() { + // When compositing is restarted, avoid removing the manager immediately. + if (s_slideManager) { + s_slideManagerRemoveTimer->start(1000); + } } bool SlidingPopupsEffect::supported() diff --git a/src/effects/slidingpopups/slidingpopups.h b/src/effects/slidingpopups/slidingpopups.h index a34c7da908..12db409157 100644 --- a/src/effects/slidingpopups/slidingpopups.h +++ b/src/effects/slidingpopups/slidingpopups.h @@ -15,7 +15,6 @@ #include #include -#include namespace KWin { @@ -62,8 +61,9 @@ private: void setupInternalWindowSlide(EffectWindow *w); void setupSlideData(EffectWindow *w); - KWaylandServer::ScopedGlobalPointer m_slideManager; - long m_atom; + static KWaylandServer::SlideManagerInterface *s_slideManager; + static QTimer *s_slideManagerRemoveTimer; + long m_atom = 0; int m_slideLength; std::chrono::milliseconds m_slideInDuration;