diff options
author | DUI-Team Symbio <dui-team@fi.symbio.com> | 2010-06-15 12:24:26 +0300 |
---|---|---|
committer | Tomas Junnonen <tomas.junnonen@nokia.com> | 2010-06-16 18:36:37 +0300 |
commit | 8bdd965944b3041815404be8e801400fa546c5fe (patch) | |
tree | 76e78ece2995ef6db75c80cba53b9dbdd47f3e05 /mthemedaemon | |
parent | 74bbc7bad561ee180e97677de3a583318bbf8dc4 (diff) |
Fixes: NB#173416 - setting gconf value for /meegotouch/theme/name only works once
RevBy: Tomas Junnonen
Details: If an invalid theme gconf value is inputted the mthemedaemon does not forcefully change
it to valid one, but silently falls back to use the default theme. Implemented functionality for
changing theme even though previous theme change is still in process. The new theme is applied
after the previous change is completed.
Diffstat (limited to 'mthemedaemon')
-rw-r--r-- | mthemedaemon/mthemedaemonserver.cpp | 54 | ||||
-rw-r--r-- | mthemedaemon/mthemedaemonserver.h | 2 |
2 files changed, 40 insertions, 16 deletions
diff --git a/mthemedaemon/mthemedaemonserver.cpp b/mthemedaemon/mthemedaemonserver.cpp index efcbed5e..0aa647de 100644 --- a/mthemedaemon/mthemedaemonserver.cpp +++ b/mthemedaemon/mthemedaemonserver.cpp @@ -30,12 +30,12 @@ using namespace M::MThemeDaemonProtocol; MThemeDaemonServer::MThemeDaemonServer() : currentTheme("/meegotouch/theme/name"), - currentLocale("/meegotouch/i18n/language") + currentLocale("/meegotouch/i18n/language"), + defaultTheme("devel"), + delayedThemeChange(false) { - const QString defaultTheme("devel"); - // 1) make sure that gconf has some value for the current theme - if (currentTheme.value().isNull()) + if (currentTheme.value().isNull() || currentTheme.value().toString().isEmpty() ) currentTheme.set(defaultTheme); // 2) activate the current theme @@ -45,7 +45,6 @@ MThemeDaemonServer::MThemeDaemonServer() : if (!daemon.activateTheme(defaultTheme, currentLocale.value().toString(), QList<MThemeDaemonClient *>(), pixmapsToReload, pixmapsToDeleteWhenThemeChangeHasCompleted)) { qFatal("MThemeDaemonServer - Could not find themes, aborting!"); } - currentTheme.set(defaultTheme); } Q_ASSERT(pixmapsToReload.isEmpty()); Q_ASSERT(pixmapsToDeleteWhenThemeChangeHasCompleted.isEmpty()); @@ -64,8 +63,8 @@ MThemeDaemonServer::MThemeDaemonServer() : } // 5) make sure we have a cache directory for the current theme - if(!cacheDir.exists(currentTheme.value().toString())) { - if(!cacheDir.mkdir(currentTheme.value().toString())) { + if(!cacheDir.exists(daemon.currentTheme())) { + if(!cacheDir.mkdir(daemon.currentTheme())) { qFatal("MThemeDaemonServer - Could not create cache directory for current theme. No write permissions to %s", qPrintable(cacheDir.absolutePath())); } @@ -137,9 +136,16 @@ void MThemeDaemonServer::clientDisconnected() pi.remove(); } - clientsThatHaveNotYetAppliedThemeChange.removeOne(client); - + // remove the client from themechange list and delete the client data + bool removed = clientsThatHaveNotYetAppliedThemeChange.removeOne(client); delete client; + + // check if the delayed theme change has been request and whether we can complete it now + if( removed && clientsThatHaveNotYetAppliedThemeChange.isEmpty() && delayedThemeChange ) { + mWarning("MThemeDaemonServer") << "Start delayed theme change."; + delayedThemeChange = false; + themeChanged(); + } } socket->deleteLater(); } @@ -244,14 +250,24 @@ void MThemeDaemonServer::themeChanged() if (daemon.currentTheme() == currentTheme.value().toString()) return; + //if previous theme change is not finished yet we need wait it to complete before changing to new one if(!clientsThatHaveNotYetAppliedThemeChange.isEmpty()) { mWarning("MThemeDaemonServer") << "Will not change theme while another theme change is still ongoing"; - currentTheme.set(daemon.currentTheme()); + delayedThemeChange = true; return; } QHash<MThemeDaemonClient *, QList<PixmapIdentifier> > pixmapsToReload; - if (daemon.activateTheme(currentTheme.value().toString(), currentLocale.value().toString(), registeredClients.values(), pixmapsToReload, pixmapsToDeleteWhenThemeChangeHasCompleted)) { + + bool changeOk = daemon.activateTheme(currentTheme.value().toString(), currentLocale.value().toString(), registeredClients.values(), pixmapsToReload, pixmapsToDeleteWhenThemeChangeHasCompleted); + if(!changeOk) { + mWarning("MThemeDaemonServer") << "Could not change theme to" << currentTheme.value().toString() << ". Falling back to default theme " << defaultTheme; + if( daemon.currentTheme() == defaultTheme ) + return; + changeOk = daemon.activateTheme(defaultTheme, currentLocale.value().toString(), registeredClients.values(), pixmapsToReload, pixmapsToDeleteWhenThemeChangeHasCompleted); + } + + if (changeOk) { // theme change succeeded, let's inform all clients + add the pixmaps to load-list Packet themeChangedPacket(Packet::ThemeChangedPacket, 0, new ThemeChangeInfo(daemon.themeInheritanceChain(), daemon.themeLibraryNames())); @@ -277,8 +293,8 @@ void MThemeDaemonServer::themeChanged() // make sure we have a cache directory for the current theme QDir cacheDir(MThemeDaemon::systemThemeCacheDirectory()); - if(!cacheDir.exists(currentTheme.value().toString())) { - if(!cacheDir.mkdir(currentTheme.value().toString())) { + if(!cacheDir.exists(daemon.currentTheme())) { + if(!cacheDir.mkdir(daemon.currentTheme())) { qFatal("MThemeDaemonServer - Could not create cache directory for current theme. No write permissions to %s", qPrintable(cacheDir.absolutePath())); } @@ -288,9 +304,8 @@ void MThemeDaemonServer::themeChanged() processQueueTimer.start(); } else { - // theme change failed, so change the theme back also in gconf. - mWarning("MThemeDaemonServer") << "Could not change theme to" << currentTheme.value().toString(); - currentTheme.set(daemon.currentTheme()); + // could not change to default theme, something seriously wrong now nothing we can do + qFatal("MThemeDaemonServer - Could not fall back to default theme."); } } @@ -416,6 +431,13 @@ void MThemeDaemonServer::themeChangeApplied(MThemeDaemonClient *client, foreach(MThemeDaemonClient * c, registeredClients.values()) { c->stream() << themeChangeFinishedPacket; } + + //if delayed theme change was requested, change it now + if( delayedThemeChange ) { + mWarning("MThemeDaemonServer") << "Start delayed theme change."; + delayedThemeChange = false; + themeChanged(); + } } } diff --git a/mthemedaemon/mthemedaemonserver.h b/mthemedaemon/mthemedaemonserver.h index fdec55fa..7fa2983e 100644 --- a/mthemedaemon/mthemedaemonserver.h +++ b/mthemedaemon/mthemedaemonserver.h @@ -86,6 +86,8 @@ private: MGConfItem currentTheme; MGConfItem currentLocale; + QString defaultTheme; + bool delayedThemeChange; QQueue<QueueItem> loadPixmapsQueue; QQueue<QueueItem> releasePixmapsQueue; |