From 2ae3cf4f4b96319410230799cd6210173aeb2651 Mon Sep 17 00:00:00 2001 From: falkTX Date: Sat, 16 Sep 2023 17:53:46 +0200 Subject: [PATCH] Proper handling of XDG_DOCUMENTS_DIR Fixes #553 Signed-off-by: falkTX --- src/CardinalCommon.cpp | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/src/CardinalCommon.cpp b/src/CardinalCommon.cpp index b49c7fe..a08549e 100644 --- a/src/CardinalCommon.cpp +++ b/src/CardinalCommon.cpp @@ -63,6 +63,10 @@ # include #endif +#ifdef ARCH_LIN +# include +#endif + #ifdef HAVE_LIBLO # include #endif @@ -496,9 +500,38 @@ Initializer::Initializer(const CardinalBasePlugin* const plugin, const CardinalB #elif defined(ARCH_WIN) asset::userDir = system::join(getSpecialPath(kSpecialPathMyDocuments), "Cardinal"); #else - if (const char* const xdgEnv = getenv("XDG_DOCUMENTS_DIR")) - asset::userDir = system::join(xdgEnv, "Cardinal"); - else + std::string xdgConfigDir; + if (const char* const xdgEnv = getenv("XDG_CONFIG_HOME")) + xdgConfigDir = xdgEnv; + if (xdgConfigDir.empty()) + xdgConfigDir = system::join(homeDir(), ".config"); + + const std::string xdgDirsConfigPath(system::join(xdgConfigDir, "user-dirs.dirs")); + + if (system::exists(xdgDirsConfigPath)) + { + std::ifstream xdgDirsConfigFile(xdgDirsConfigPath, std::ios::in|std::ios::ate); + std::string xdgDirsConfig(xdgDirsConfigFile.tellg(), 0); + + xdgDirsConfigFile.seekg(0); + xdgDirsConfigFile.read(&xdgDirsConfig[0], xdgDirsConfig.size()); + + if (const char* const xdgDocsDir = std::strstr(xdgDirsConfig.c_str(), "XDG_DOCUMENTS_DIR=\"")) + { + if (const char* const xdgDocsDirNL = std::strstr(xdgDocsDir, "\"\n")) + { + asset::userDir = std::string(xdgDocsDir + 19, xdgDocsDirNL - xdgDocsDir - 19); + + if (string::startsWith(asset::userDir, "$HOME")) + asset::userDir.replace(asset::userDir.begin(), asset::userDir.begin() + 5, homeDir()); + + if (! system::exists(asset::userDir)) + asset::userDir.clear(); + } + } + } + + if (asset::userDir.empty()) asset::userDir = system::join(homeDir(), "Documents", "Cardinal"); #endif