From f892ffb0e7689e1b7edeb09c375bf977ccd04ec3 Mon Sep 17 00:00:00 2001 From: Robin Harold Burchell Date: Fri, 11 Sep 2009 21:03:24 +0000 Subject: [PATCH] Remove flicker when changing effect plugins by not fully reloading compositing plugins anymore. Replaces one hack with another hack (due to having to support multiple kwin instances), but provides a much better user experience. Big thanks to mgraesslin for comments, review, and fixes. BUG: 183107 svn path=/trunk/KDE/kdebase/workspace/; revision=1022489 --- kcmkwin/kwincompositing/main.cpp | 60 ++++++++++++-------------------- kcmkwin/kwincompositing/main.h | 1 + 2 files changed, 23 insertions(+), 38 deletions(-) diff --git a/kcmkwin/kwincompositing/main.cpp b/kcmkwin/kwincompositing/main.cpp index 0563ddec93..a0d64e7c97 100644 --- a/kcmkwin/kwincompositing/main.cpp +++ b/kcmkwin/kwincompositing/main.cpp @@ -246,6 +246,7 @@ void KWinCompositingConfig::showConfirmDialog( bool reinitCompositing ) { // compositing is enabled now setupCompositingState( kwinInterface->compositingActive() ); + checkLoadedEffects(); } } if( revert ) @@ -654,45 +655,18 @@ void KWinCompositingConfig::save() } } -void KWinCompositingConfig::configChanged(bool reinitCompositing) +void KWinCompositingConfig::checkLoadedEffects() { - // Send signal to kwin - mKWinConfig->sync(); - // Send signal to all kwin instances - QDBusMessage message = QDBusMessage::createSignal("/KWin", "org.kde.KWin", - //reinitCompositing ? "reinitCompositing" : "reloadConfig"); - "reinitCompositing"); - QDBusConnection::sessionBus().send(message); - - //------------- - // If we added or removed shadows we need to reload decorations as well - // We have to do this separately so the settings are in sync - // HACK: This should really just reload decorations, not do a full reconfigure - - // HACK: We send two messages to it's correctly synced. Code that was reverted in r894182 was better - message = QDBusMessage::createSignal("/KWin", "org.kde.KWin", - //reinitCompositing ? "reinitCompositing" : "reloadConfig"); - "reloadConfig"); - QDBusConnection::sessionBus().send(message); - - KConfigGroup effectConfig; - - effectConfig = KConfigGroup( mTmpConfig, "Compositing" ); - bool enabledBefore = effectConfig.readEntry( "Enabled", mDefaultPrefs.enableCompositing() ); - effectConfig = KConfigGroup( mKWinConfig, "Compositing" ); - bool enabledAfter = effectConfig.readEntry( "Enabled", mDefaultPrefs.enableCompositing() ); - - effectConfig = KConfigGroup( mTmpConfig, "Plugins" ); - bool shadowBefore = effectEnabled( "shadow", effectConfig ); - effectConfig = KConfigGroup( mKWinConfig, "Plugins" ); - bool shadowAfter = effectEnabled( "shadow", effectConfig ); - // check for effects not supported by Backend or hardware // such effects are enabled but not returned by DBus method loadedEffects - message = QDBusMessage::createMethodCall( "org.kde.kwin", "/KWin", "org.kde.KWin", "loadedEffects" ); + QDBusMessage message = QDBusMessage::createMethodCall( "org.kde.kwin", "/KWin", "org.kde.KWin", "loadedEffects" ); QDBusMessage reply = QDBusConnection::sessionBus().call( message ); + KConfigGroup effectConfig = KConfigGroup( mKWinConfig, "Compositing" ); + bool enabledAfter = effectConfig.readEntry( "Enabled", mDefaultPrefs.enableCompositing() ); + if( reply.type() == QDBusMessage::ReplyMessage && enabledAfter && !getenv( "KDE_FAILSAFE" )) { + effectConfig = KConfigGroup( mKWinConfig, "Plugins" ); QStringList loadedEffects = reply.arguments()[0].toStringList(); QStringList effects = effectConfig.keyList(); QStringList disabledEffects = QStringList(); @@ -725,12 +699,22 @@ void KWinCompositingConfig::configChanged(bool reinitCompositing) KNotification::event( "effectsnotsupported", message, QPixmap(), NULL, KNotification::CloseOnTimeout, KComponentData( "kwin" ) ); } } + } - if( enabledBefore != enabledAfter || shadowBefore != shadowAfter ) - { - message = QDBusMessage::createMethodCall( "org.kde.kwin", "/KWin", "org.kde.KWin", "reconfigure" ); - QDBusConnection::sessionBus().send( message ); - } +void KWinCompositingConfig::configChanged(bool reinitCompositing) + { + // Send signal to kwin + mKWinConfig->sync(); + // Send signal to all kwin instances + QDBusMessage message = QDBusMessage::createSignal("/KWin", "org.kde.KWin", + reinitCompositing ? "reinitCompositing" : "reloadConfig"); + QDBusConnection::sessionBus().send(message); + + // HACK: We can't just do this here, due to the asynchronous nature of signals. + // We also can't change reinitCompositing into a message (which would allow + // callWithCallbac() to do this neater) due to multiple kwin instances. + if( !m_showConfirmDialog ) + QTimer::singleShot(1000, this, SLOT(checkLoadedEffects())); } diff --git a/kcmkwin/kwincompositing/main.h b/kcmkwin/kwincompositing/main.h index 93f69f9e48..7536fb20ec 100644 --- a/kcmkwin/kwincompositing/main.h +++ b/kcmkwin/kwincompositing/main.h @@ -71,6 +71,7 @@ class KWinCompositingConfig : public KCModule void saveEffectsTab(); bool saveAdvancedTab(); + void checkLoadedEffects(); void configChanged(bool reinitCompositing); void initEffectSelector(); void setupCompositingState( bool active, bool enabled = true );