aboutsummaryrefslogtreecommitdiff
path: root/mthemedaemon
diff options
context:
space:
mode:
authorDUI-Team Symbio <dui-team@fi.symbio.com>2010-06-15 12:24:26 +0300
committerTomas Junnonen <tomas.junnonen@nokia.com>2010-06-16 18:36:37 +0300
commit8bdd965944b3041815404be8e801400fa546c5fe (patch)
tree76e78ece2995ef6db75c80cba53b9dbdd47f3e05 /mthemedaemon
parent74bbc7bad561ee180e97677de3a583318bbf8dc4 (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.cpp54
-rw-r--r--mthemedaemon/mthemedaemonserver.h2
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;