From a7c396caeb29d465fd7044e2b200a90129627d8a Mon Sep 17 00:00:00 2001 From: Kai Uwe Broulik Date: Thu, 28 Sep 2017 10:18:36 +0200 Subject: [PATCH] [ScreenEdgeEffect] Create glow Svg on demand Keeps it from loading the Svg and all the Plasma stuff (Theme etc) that comes with it on startup. Differential Revision: https://phabricator.kde.org/D8011 --- effects/screenedge/screenedgeeffect.cpp | 18 +++++++++++++++--- effects/screenedge/screenedgeeffect.h | 5 +++-- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/effects/screenedge/screenedgeeffect.cpp b/effects/screenedge/screenedgeeffect.cpp index 09ae2891f0..1b8dea068c 100644 --- a/effects/screenedge/screenedgeeffect.cpp +++ b/effects/screenedge/screenedgeeffect.cpp @@ -37,10 +37,8 @@ namespace KWin { ScreenEdgeEffect::ScreenEdgeEffect() : Effect() - , m_glow(new Plasma::Svg(this)) , m_cleanupTimer(new QTimer(this)) { - m_glow->setImagePath(QStringLiteral("widgets/glowbar")); connect(effects, SIGNAL(screenEdgeApproaching(ElectricBorder,qreal,QRect)), SLOT(edgeApproaching(ElectricBorder,qreal,QRect))); m_cleanupTimer->setInterval(5000); m_cleanupTimer->setSingleShot(true); @@ -59,6 +57,14 @@ ScreenEdgeEffect::~ScreenEdgeEffect() cleanup(); } +void ScreenEdgeEffect::ensureGlowSvg() +{ + if (!m_glow) { + m_glow = new Plasma::Svg(this); + m_glow->setImagePath(QStringLiteral("widgets/glowbar")); + } +} + void ScreenEdgeEffect::cleanup() { for (QHash::iterator it = m_borders.begin(); @@ -263,6 +269,8 @@ Glow *ScreenEdgeEffect::createGlow(ElectricBorder border, qreal factor, const QR template T *ScreenEdgeEffect::createCornerGlow(ElectricBorder border) { + ensureGlowSvg(); + switch (border) { case ElectricTopLeft: return new T(m_glow->pixmap(QStringLiteral("bottomright")).toImage()); @@ -277,8 +285,10 @@ T *ScreenEdgeEffect::createCornerGlow(ElectricBorder border) } } -QSize ScreenEdgeEffect::cornerGlowSize(ElectricBorder border) const +QSize ScreenEdgeEffect::cornerGlowSize(ElectricBorder border) { + ensureGlowSvg(); + switch (border) { case ElectricTopLeft: return m_glow->elementSize(QStringLiteral("bottomright")); @@ -296,6 +306,8 @@ QSize ScreenEdgeEffect::cornerGlowSize(ElectricBorder border) const template T *ScreenEdgeEffect::createEdgeGlow(ElectricBorder border, const QSize &size) { + ensureGlowSvg(); + QPoint pixmapPosition(0, 0); QPixmap l, r, c; switch (border) { diff --git a/effects/screenedge/screenedgeeffect.h b/effects/screenedge/screenedgeeffect.h index 94e7c6d3f6..d940e61916 100644 --- a/effects/screenedge/screenedgeeffect.h +++ b/effects/screenedge/screenedgeeffect.h @@ -48,13 +48,14 @@ private Q_SLOTS: void edgeApproaching(ElectricBorder border, qreal factor, const QRect &geometry); void cleanup(); private: + void ensureGlowSvg(); Glow *createGlow(ElectricBorder border, qreal factor, const QRect &geometry); template T *createCornerGlow(ElectricBorder border); template T *createEdgeGlow(ElectricBorder border, const QSize &size); - QSize cornerGlowSize(ElectricBorder border) const; - Plasma::Svg *m_glow; + QSize cornerGlowSize(ElectricBorder border); + Plasma::Svg *m_glow = nullptr; QHash m_borders; QTimer *m_cleanupTimer; };