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
icc-effect-5.14.5
Robin Harold Burchell 2009-09-11 21:03:24 +00:00
parent 35453d1e5b
commit f892ffb0e7
2 changed files with 23 additions and 38 deletions

View File

@ -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()));
}

View File

@ -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 );