From a859f6915cf6ae5f1426c89bc27d74d03d128191 Mon Sep 17 00:00:00 2001 From: Aaron Seigo Date: Thu, 8 Dec 2011 12:45:23 +0100 Subject: [PATCH] compress changed notification events and share the blur effect watcher between themes --- theme.cpp | 73 +++++++++++++++++++++++++++++++++++-------------------- theme.h | 1 + 2 files changed, 48 insertions(+), 26 deletions(-) diff --git a/theme.cpp b/theme.cpp index 22a522bf1..48cc4f9c0 100644 --- a/theme.cpp +++ b/theme.cpp @@ -85,8 +85,9 @@ public: defaultWallpaperWidth(DEFAULT_WALLPAPER_WIDTH), defaultWallpaperHeight(DEFAULT_WALLPAPER_HEIGHT), pixmapCache(0), + cachesToDiscard(NoCache), locolor(false), - compositingActive(KWindowSystem::compositingActive()), + compositingActive(KWindowSystem::self()->compositingActive()), blurActive(false), isDefault(false), useGlobal(true), @@ -97,26 +98,32 @@ public: ThemeConfig config; cacheTheme = config.cacheTheme(); + saveTimer = new QTimer(q); + saveTimer->setSingleShot(true); + saveTimer->setInterval(600); + QObject::connect(saveTimer, SIGNAL(timeout()), q, SLOT(scheduledCacheUpdate())); + + updateNotificationTimer = new QTimer(q); + updateNotificationTimer->setSingleShot(true); + updateNotificationTimer->setInterval(500); + QObject::connect(updateNotificationTimer, SIGNAL(timeout()), q, SLOT(notifyOfChanged())); + if (QPixmap::defaultDepth() > 8) { QObject::connect(KWindowSystem::self(), SIGNAL(compositingChanged(bool)), q, SLOT(compositingChanged(bool))); #ifdef Q_WS_X11 - //watch for blur effect property changes as well - effectWatcher = new EffectWatcher("_KDE_NET_WM_BLUR_BEHIND_REGION"); - QObject::connect(effectWatcher, SIGNAL(effectChanged(bool)), q, SLOT(blurBehindChanged(bool))); + //watch for blur effect property changes as well + if (!s_blurEffectWatcher) { + s_blurEffectWatcher = new EffectWatcher("_KDE_NET_WM_BLUR_BEHIND_REGION"); + } + + QObject::connect(s_blurEffectWatcher, SIGNAL(effectChanged(bool)), q, SLOT(blurBehindChanged(bool))); #endif } - - saveTimer = new QTimer(q); - saveTimer->setSingleShot(true); - QObject::connect(saveTimer, SIGNAL(timeout()), q, SLOT(scheduledCacheUpdate())); } ~ThemePrivate() { delete pixmapCache; -#ifdef Q_WS_X11 - delete effectWatcher; -#endif } KConfigGroup &config() @@ -143,6 +150,8 @@ public: void compositingChanged(bool active); void discardCache(CacheTypes caches); void scheduledCacheUpdate(); + void scheduleThemeChangeNotification(CacheTypes caches); + void notifyOfChanged(); void colorsChanged(); void blurBehindChanged(bool blur); bool useCache(); @@ -158,6 +167,7 @@ public: static const char *systemColorsTheme; static const char *themeRcFile; static PackageStructure::Ptr packageStructure; + static EffectWatcher *s_blurEffectWatcher; Theme *q; QString themeName; @@ -182,11 +192,10 @@ public: QHash cachedStyleSheets; QHash discoveries; QTimer *saveTimer; + QTimer *updateNotificationTimer; int toolTipDelay; + CacheTypes cachesToDiscard; -#ifdef Q_WS_X11 - EffectWatcher *effectWatcher; -#endif bool locolor : 1; bool compositingActive : 1; bool blurActive : 1; @@ -203,6 +212,7 @@ const char *ThemePrivate::themeRcFile = "plasmarc"; // the system colors theme is used to cache unthemed svgs with colorization needs // these svgs do not follow the theme's colors, but rather the system colors const char *ThemePrivate::systemColorsTheme = "internal-system-colors"; +EffectWatcher *ThemePrivate::s_blurEffectWatcher = 0; bool ThemePrivate::useCache() { @@ -270,8 +280,8 @@ void ThemePrivate::compositingChanged(bool active) #ifdef Q_WS_X11 if (compositingActive != active) { compositingActive = active; - discardCache(PixmapCache | SvgElementsCache); - emit q->themeChanged(); + //kDebug() << QTime::currentTime(); + scheduleThemeChangeNotification(PixmapCache | SvgElementsCache); } #endif } @@ -324,17 +334,31 @@ void ThemePrivate::scheduledCacheUpdate() void ThemePrivate::colorsChanged() { - discardCache(PixmapCache); colorScheme = KColorScheme(QPalette::Active, KColorScheme::Window, colors); buttonColorScheme = KColorScheme(QPalette::Active, KColorScheme::Button, colors); viewColorScheme = KColorScheme(QPalette::Active, KColorScheme::View, colors); - emit q->themeChanged(); + scheduleThemeChangeNotification(PixmapCache); } void ThemePrivate::blurBehindChanged(bool blur) { - blurActive = blur; - discardCache(PixmapCache | SvgElementsCache); + if (blurActive != blur) { + blurActive = blur; + scheduleThemeChangeNotification(PixmapCache | SvgElementsCache); + } +} + +void ThemePrivate::scheduleThemeChangeNotification(CacheTypes caches) +{ + cachesToDiscard |= caches; + updateNotificationTimer->start(); +} + +void ThemePrivate::notifyOfChanged() +{ + //kDebug() << cachesToDiscard; + discardCache(cachesToDiscard); + cachesToDiscard = NoCache; emit q->themeChanged(); } @@ -512,7 +536,6 @@ void Theme::settingsChanged() d->setThemeName(cg.readEntry("name", ThemePrivate::defaultTheme), false); cg = KConfigGroup(cg.config(), "PlasmaToolTips"); d->toolTipDelay = cg.readEntry("Delay", qreal(0.7)); - kDebug() << "delay for tooltips is ...." << d->toolTipDelay << "**************"; } void Theme::setThemeName(const QString &themeName) @@ -674,9 +697,7 @@ void ThemePrivate::setThemeName(const QString &tempThemeName, bool writeSettings cg.sync(); } - discardCache(SvgElementsCache); - - emit q->themeChanged(); + scheduleThemeChangeNotification(SvgElementsCache); } QString Theme::themeName() const @@ -689,7 +710,7 @@ QString Theme::imagePath(const QString &name) const // look for a compressed svg file in the theme if (name.contains("../") || name.isEmpty()) { // we don't support relative paths - kDebug() << "Theme says: bad image path " << name; + //kDebug() << "Theme says: bad image path " << name; return QString(); } @@ -962,7 +983,7 @@ void Theme::insertIntoCache(const QString& key, const QPixmap& pix, const QStrin d->keysToCache.insert(key, id); d->idsToCache.insert(id, key); - d->saveTimer->start(600); + d->saveTimer->start(); } } diff --git a/theme.h b/theme.h index 18b1c140b..2d0291196 100644 --- a/theme.h +++ b/theme.h @@ -409,6 +409,7 @@ class PLASMA_EXPORT Theme : public QObject Q_PRIVATE_SLOT(d, void settingsFileChanged(const QString &)) Q_PRIVATE_SLOT(d, void scheduledCacheUpdate()) Q_PRIVATE_SLOT(d, void onAppExitCleanup()) + Q_PRIVATE_SLOT(d, void notifyOfChanged()) }; } // Plasma namespace