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;