diff --git a/doomsday/client/src/clientapp.cpp b/doomsday/client/src/clientapp.cpp index 5a75049b8c..76b08c09e0 100644 --- a/doomsday/client/src/clientapp.cpp +++ b/doomsday/client/src/clientapp.cpp @@ -326,10 +326,8 @@ ClientApp::ClientApp(int &argc, char **argv) QNetworkProxyFactory::setUseSystemConfiguration(true); // Metadata. - setOrganizationDomain ("dengine.net"); - setOrganizationName ("Deng Team"); - setApplicationName ("Doomsday Engine"); - setApplicationVersion (DOOMSDAY_VERSION_BASE); + setMetadata("Deng Team", "dengine.net", "Doomsday Engine", DOOMSDAY_VERSION_BASE); + setUnixHomeFolderName(".doomsday"); setTerminateFunc(handleLegacyCoreTerminate); diff --git a/doomsday/client/src/unix/dd_uinit.cpp b/doomsday/client/src/unix/dd_uinit.cpp index 26131cbbc6..5dd1a381db 100644 --- a/doomsday/client/src/unix/dd_uinit.cpp +++ b/doomsday/client/src/unix/dd_uinit.cpp @@ -25,6 +25,7 @@ #include #include +#include #ifdef UNIX # include "library.h" @@ -63,7 +64,8 @@ static void determineGlobalPaths(application_t* app) { filename_t homePath; directory_t* temp; - dd_snprintf(homePath, FILENAME_T_MAXLEN, "%s/.doomsday/runtime/", getenv("HOME")); + dd_snprintf(homePath, FILENAME_T_MAXLEN, "%s/%s/runtime/", getenv("HOME"), + DENG2_APP->unixHomeFolderName().toLatin1().constData()); temp = Dir_New(homePath); Dir_mkpath(Dir_Path(temp)); app->usingHomeDir = Dir_SetCurrent(Dir_Path(temp)); diff --git a/doomsday/libdeng2/include/de/core/app.h b/doomsday/libdeng2/include/de/core/app.h index 604bfa65b9..1d32e342a7 100644 --- a/doomsday/libdeng2/include/de/core/app.h +++ b/doomsday/libdeng2/include/de/core/app.h @@ -95,6 +95,31 @@ class DENG2_PUBLIC App : DENG2_OBSERVES(Clock, TimeChange) virtual ~App(); + /** + * Defines metadata about the application. + * + * @param appName Name of the application, as presented to humans. + * @param appVersion Version of the application. + * @param orgName Name of the author/organization. + * @param orgDomain Network domain of the author/organization. + */ + virtual void setMetadata(String const &orgName, String const &orgDomain, + String const &appName, String const &appVersion) = 0; + + /** + * Sets the Unix-style home folder name. For instance, ".doomsday" could be used. + * + * @param name Name of the (usually hidden) user-specific home data folder. + */ + void setUnixHomeFolderName(String const &name); + + String unixHomeFolderName() const; + + /** + * Returns the home folder name without the possible dot in the beginning. + */ + String unixEtcFolderName() const; + /** * Sets a callback to be called when an uncaught exception occurs. */ diff --git a/doomsday/libdeng2/include/de/core/textapp.h b/doomsday/libdeng2/include/de/core/textapp.h index c2e908badf..920971158f 100644 --- a/doomsday/libdeng2/include/de/core/textapp.h +++ b/doomsday/libdeng2/include/de/core/textapp.h @@ -46,6 +46,9 @@ class DENG2_PUBLIC TextApp : public QCoreApplication, public App, public: TextApp(int &argc, char **argv); + void setMetadata(String const &orgName, String const &orgDomain, + String const &appName, String const &appVersion); + bool notify(QObject *receiver, QEvent *event); int execLoop(); diff --git a/doomsday/libdeng2/src/core/app.cpp b/doomsday/libdeng2/src/core/app.cpp index bc6539611c..3893c4e86e 100644 --- a/doomsday/libdeng2/src/core/app.cpp +++ b/doomsday/libdeng2/src/core/app.cpp @@ -57,6 +57,7 @@ DENG2_PIMPL(App) /// Path of the application executable. NativePath appPath; + String unixHomeFolder; NativePath cachedBasePath; NativePath cachedPluginBinaryPath; @@ -103,8 +104,13 @@ DENG2_PIMPL(App) GameChangeScriptAudience scriptAudienceForGameChange; Instance(Public *a, QStringList args) - : Base(a), cmdLine(args), persistentData(0), config(0), - currentGame(0), terminateFunc(0) + : Base(a) + , cmdLine(args) + , unixHomeFolder(".doomsday") + , persistentData(0) + , config(0) + , currentGame(0) + , terminateFunc(0) { singletonApp = a; mainThread = QThread::currentThread(); @@ -263,6 +269,25 @@ App::~App() singletonApp = 0; } +void App::setUnixHomeFolderName(String const &name) +{ + d->unixHomeFolder = name; +} + +String App::unixHomeFolderName() const +{ + return d->unixHomeFolder; +} + +String App::unixEtcFolderName() const +{ + if(d->unixHomeFolder.startsWith(".")) + { + return d->unixHomeFolder.mid(1); + } + return d->unixHomeFolder; +} + void App::setTerminateFunc(void (*func)(char const *)) { d->terminateFunc = func; @@ -358,7 +383,7 @@ NativePath App::nativeHomePath() nativeHome = nativeHome / "runtime"; #else // UNIX NativePath nativeHome = QDir::homePath(); - nativeHome = nativeHome / ".doomsday/runtime"; + nativeHome = nativeHome / d->unixHomeFolder / "runtime"; #endif return (d->cachedHomePath = nativeHome); } diff --git a/doomsday/libdeng2/src/core/textapp.cpp b/doomsday/libdeng2/src/core/textapp.cpp index 094094f6b9..943ec7236a 100644 --- a/doomsday/libdeng2/src/core/textapp.cpp +++ b/doomsday/libdeng2/src/core/textapp.cpp @@ -42,6 +42,15 @@ TextApp::TextApp(int &argc, char **argv) d(new Instance(this)) {} +void TextApp::setMetadata(String const &orgName, String const &orgDomain, + String const &appName, String const &appVersion) +{ + setOrganizationName (orgName); + setOrganizationDomain(orgDomain); + setApplicationName (appName); + setApplicationVersion(appVersion); +} + bool TextApp::notify(QObject *receiver, QEvent *event) { try @@ -83,7 +92,7 @@ Loop &TextApp::loop() NativePath TextApp::appDataPath() const { - return NativePath(QDir::homePath()) / ".doomsday"; + return NativePath(QDir::homePath()) / unixHomeFolderName(); } void TextApp::loopIteration() diff --git a/doomsday/libdeng2/src/core/unixinfo.cpp b/doomsday/libdeng2/src/core/unixinfo.cpp index 18b1201959..28905632b1 100644 --- a/doomsday/libdeng2/src/core/unixinfo.cpp +++ b/doomsday/libdeng2/src/core/unixinfo.cpp @@ -21,6 +21,7 @@ #include "de/UnixInfo" #include "de/Info" +#include "de/App" #include namespace de { @@ -34,14 +35,14 @@ class Infos public: Infos(String fileName) : etcInfo(0), userInfo(0) { - String fn = "/etc/doomsday/" + fileName; + String fn = String("/etc") / App::app().unixEtcFolderName() / fileName; if(QFile::exists(fn)) { etcInfo = new Info; etcInfo->parseNativeFile(fn); } - fn = QDir::homePath() + "/.doomsday/" + fileName; + fn = String(QDir::homePath()) / App::app().unixHomeFolderName() / fileName; if(QFile::exists(fn)) { userInfo = new Info; diff --git a/doomsday/libgui/include/de/gui/guiapp.h b/doomsday/libgui/include/de/gui/guiapp.h index 74620eb5ad..8e7813010f 100644 --- a/doomsday/libgui/include/de/gui/guiapp.h +++ b/doomsday/libgui/include/de/gui/guiapp.h @@ -53,6 +53,9 @@ class LIBGUI_PUBLIC GuiApp : public QApplication, public App, public: GuiApp(int &argc, char **argv); + void setMetadata(String const &orgName, String const &orgDomain, + String const &appName, String const &appVersion); + bool notify(QObject *receiver, QEvent *event); /** diff --git a/doomsday/libgui/src/guiapp.cpp b/doomsday/libgui/src/guiapp.cpp index 79b897e68a..fe675efec0 100644 --- a/doomsday/libgui/src/guiapp.cpp +++ b/doomsday/libgui/src/guiapp.cpp @@ -44,6 +44,15 @@ GuiApp::GuiApp(int &argc, char **argv) d(new Instance(this)) {} +void GuiApp::setMetadata(String const &orgName, String const &orgDomain, + String const &appName, String const &appVersion) +{ + setOrganizationName (orgName); + setOrganizationDomain(orgDomain); + setApplicationName (appName); + setApplicationVersion(appVersion); +} + bool GuiApp::notify(QObject *receiver, QEvent *event) { try diff --git a/doomsday/server/src/serverapp.cpp b/doomsday/server/src/serverapp.cpp index 58f11ec8b5..c19b05bdc5 100644 --- a/doomsday/server/src/serverapp.cpp +++ b/doomsday/server/src/serverapp.cpp @@ -103,10 +103,8 @@ ServerApp::ServerApp(int &argc, char **argv) QNetworkProxyFactory::setUseSystemConfiguration(true); // Metadata. - setOrganizationDomain ("dengine.net"); - setOrganizationName ("Deng Team"); - setApplicationName ("Doomsday Server"); - setApplicationVersion (DOOMSDAY_VERSION_BASE); + setMetadata("Deng Team", "dengine.net", "Doomsday Server", DOOMSDAY_VERSION_BASE); + setUnixHomeFolderName(".doomsday"); setTerminateFunc(handleAppTerminate);