diff --git a/apps/launcher/maindialog.cpp b/apps/launcher/maindialog.cpp
index 4012a1fbd..a6ac3d78d 100644
--- a/apps/launcher/maindialog.cpp
+++ b/apps/launcher/maindialog.cpp
@@ -443,6 +443,32 @@ bool Launcher::MainDialog::setupGameSettings()
QString userPath = QString::fromStdString(mCfgMgr.getUserPath().string());
QString globalPath = QString::fromStdString(mCfgMgr.getGlobalPath().string());
+ // Load the user config file first, separately
+ // So we can write it properly, uncontaminated
+ QString path = userPath + QLatin1String("openmw.cfg");
+ QFile file(path);
+
+ qDebug() << "Loading config file:" << qPrintable(path);
+
+ if (file.exists()) {
+ if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ QMessageBox msgBox;
+ msgBox.setWindowTitle(tr("Error opening OpenMW configuration file"));
+ msgBox.setIcon(QMessageBox::Critical);
+ msgBox.setStandardButtons(QMessageBox::Ok);
+ msgBox.setText(QObject::tr("
Could not open %0 for reading
\
+ Please make sure you have the right permissions \
+ and try again.
").arg(file.fileName()));
+ msgBox.exec();
+ return false;
+ }
+ QTextStream stream(&file);
+ stream.setCodec(QTextCodec::codecForName("UTF-8"));
+
+ mGameSettings.readUserFile(stream);
+ }
+
+ // Now the rest
QStringList paths;
paths.append(userPath + QString("openmw.cfg"));
paths.append(QString("openmw.cfg"));
diff --git a/apps/launcher/settings/gamesettings.cpp b/apps/launcher/settings/gamesettings.cpp
index 41113c35a..e7e5cf1ea 100644
--- a/apps/launcher/settings/gamesettings.cpp
+++ b/apps/launcher/settings/gamesettings.cpp
@@ -90,6 +90,16 @@ QStringList Launcher::GameSettings::values(const QString &key, const QStringList
}
bool Launcher::GameSettings::readFile(QTextStream &stream)
+{
+ return readFile(stream, mSettings);
+}
+
+bool Launcher::GameSettings::readUserFile(QTextStream &stream)
+{
+ return readFile(stream, mUserSettings);
+}
+
+bool Launcher::GameSettings::readFile(QTextStream &stream, QMap &settings)
{
QMap cache;
QRegExp keyRe("^([^=]+)\\s*=\\s*(.+)$");
@@ -107,10 +117,10 @@ bool Launcher::GameSettings::readFile(QTextStream &stream)
// Don't remove existing data entries
if (key != QLatin1String("data"))
- mSettings.remove(key);
+ settings.remove(key);
QStringList values = cache.values(key);
- values.append(mSettings.values(key));
+ values.append(settings.values(key));
if (!values.contains(value)) {
cache.insertMulti(key, value);
@@ -118,23 +128,24 @@ bool Launcher::GameSettings::readFile(QTextStream &stream)
}
}
- if (mSettings.isEmpty()) {
- mSettings = cache; // This is the first time we read a file
+ if (settings.isEmpty()) {
+ settings = cache; // This is the first time we read a file
validatePaths();
return true;
}
// Merge the changed keys with those which didn't
- mSettings.unite(cache);
+ settings.unite(cache);
validatePaths();
return true;
}
+
bool Launcher::GameSettings::writeFile(QTextStream &stream)
{
// Iterate in reverse order to preserve insertion order
- QMapIterator i(mSettings);
+ QMapIterator i(mUserSettings);
i.toBack();
while (i.hasPrevious()) {
@@ -162,7 +173,7 @@ bool Launcher::GameSettings::writeFile(QTextStream &stream)
}
- QStringList content = mSettings.values(QString("content"));
+ QStringList content = mUserSettings.values(QString("content"));
for (int i = content.count(); i--;) {
stream << "content=" << content.at(i) << "\n";
}
@@ -172,14 +183,14 @@ bool Launcher::GameSettings::writeFile(QTextStream &stream)
bool Launcher::GameSettings::hasMaster()
{
- bool result = false;
- QStringList content = mSettings.values(QString("content"));
- for (int i = 0; i < content.count(); ++i) {
- if (content.at(i).contains(".omwgame") || content.at(i).contains(".esm")) {
- result = true;
- break;
+ bool result = false;
+ QStringList content = mSettings.values(QString("content"));
+ for (int i = 0; i < content.count(); ++i) {
+ if (content.at(i).contains(".omwgame") || content.at(i).contains(".esm")) {
+ result = true;
+ break;
+ }
}
- }
- return result;
+ return result;
}
diff --git a/apps/launcher/settings/gamesettings.hpp b/apps/launcher/settings/gamesettings.hpp
index 60236200a..df8215074 100644
--- a/apps/launcher/settings/gamesettings.hpp
+++ b/apps/launcher/settings/gamesettings.hpp
@@ -31,6 +31,7 @@ namespace Launcher
inline void setValue(const QString &key, const QString &value)
{
mSettings.insert(key, value);
+ mUserSettings.insert(key, value);
}
inline void setMultiValue(const QString &key, const QString &value)
@@ -38,11 +39,16 @@ namespace Launcher
QStringList values = mSettings.values(key);
if (!values.contains(value))
mSettings.insertMulti(key, value);
+
+ values = mUserSettings.values(key);
+ if (!values.contains(value))
+ mUserSettings.insertMulti(key, value);
}
inline void remove(const QString &key)
{
mSettings.remove(key);
+ mUserSettings.remove(key);
}
inline QStringList getDataDirs() { return mDataDirs; }
@@ -52,7 +58,11 @@ namespace Launcher
bool hasMaster();
QStringList values(const QString &key, const QStringList &defaultValues = QStringList());
+
bool readFile(QTextStream &stream);
+ bool readFile(QTextStream &stream, QMap &settings);
+ bool readUserFile(QTextStream &stream);
+
bool writeFile(QTextStream &stream);
private:
@@ -60,6 +70,7 @@ namespace Launcher
void validatePaths();
QMap mSettings;
+ QMap mUserSettings;
QStringList mDataDirs;
QString mDataLocal;