From 65b71872aad027a129cd9682cc9c299997b2060c Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Sat, 21 Nov 2020 17:49:28 +0200 Subject: Probe several locations for configuration file --- src/browser.cpp | 4 +++- src/settings.h.in | 63 ++++++++++++++++++++++++++++++++++++++++++++----------- src/version.h.in | 8 +++++++ 3 files changed, 62 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/browser.cpp b/src/browser.cpp index d225cbe..b05c620 100644 --- a/src/browser.cpp +++ b/src/browser.cpp @@ -66,7 +66,9 @@ void Browser::aboutPlugins() void Browser::loadConfiguration(const QString &path) { auto ctx = init_conf(path.toStdString()); - spdlog::info("Using configuration [{}]: {}", ctx.path, ctx.ptr->make_global() ? "okay" : "failed"); + spdlog::info("Using configuration [{}]: {}", + (ctx.path ? ctx.path->c_str() : "none"), + ctx.ptr->make_global() ? "okay" : "failed"); m_conf = std::move(ctx.ptr); if(const auto _translation = m_conf->value("browser.translation")) { diff --git a/src/settings.h.in b/src/settings.h.in index 605288e..51b2bd0 100644 --- a/src/settings.h.in +++ b/src/settings.h.in @@ -1,13 +1,25 @@ +/* + * This file is part of smolbote. It's copyrighted by the contributors recorded + * in the version control history of the file, available from its original + * location: https://neueland.iserlohn-fortress.net/cgit/smolbote + * + * SPDX-License-Identifier: GPL-3.0 + */ + #pragma once -#include #include #include +#include +#include +#include +#include inline auto init_conf(const std::string &path) { + namespace fs = std::filesystem; struct { - std::string path; + std::optional path; std::unique_ptr ptr; } conf; @@ -15,17 +27,44 @@ inline auto init_conf(const std::string &path) @__DEFAULT_CFG__ }); - conf.path = path.empty() ? conf.ptr->value("poi.cfg.path").value() : path; - if(conf.path.front() == '~') { - conf.path.replace(0, 1, QStandardPaths::writableLocation(QStandardPaths::HomeLocation).toStdString()); - }; + conf.path = [&]() -> std::optional { + if(!path.empty()) { + return fs::path(path); + } - std::fstream fs; - fs.open(conf.path, std::fstream::in); - if(fs.is_open()) { - conf.ptr->read(fs); - fs.close(); - } + // 1000: invalid; 0: $HOME; 1: $XDG_CONFIG_HOME + std::array, 2> home = { std::nullopt, std::nullopt }; + if(const char* usr = std::getenv("HOME")) + home[0] = fs::path(usr); + if(const char* xdg = std::getenv("XDG_CONFIG_HOME")) + home[1] = fs::path(xdg); + + for(const auto &pair : { + @__CONFIG_PATHS__ + }) { + if(pair.first < 0) { + auto p = fs::path(pair.second); + spdlog::debug("Trying {}", p.c_str()); + if(fs::exists(p)) + return p; + } else if(home[static_cast(pair.first)]) { + auto p = home[static_cast(pair.first)].value() / pair.second; + spdlog::debug("Trying {}", p.c_str()); + if(fs::exists(p)) + return p; + } + } + return std::nullopt; + + }(); + + if(conf.path) { + std::fstream file(conf.path.value(), std::fstream::in); + if(file.is_open()) { + conf.ptr->read(file); + file.close(); + } + } return conf; } diff --git a/src/version.h.in b/src/version.h.in index 44f10d9..231fb7c 100644 --- a/src/version.h.in +++ b/src/version.h.in @@ -1,3 +1,11 @@ +/* + * This file is part of smolbote. It's copyrighted by the contributors recorded + * in the version control history of the file, available from its original + * location: https://neueland.iserlohn-fortress.net/cgit/smolbote + * + * SPDX-License-Identifier: GPL-3.0 + */ + #ifndef SMOLBOTE_VERSION_H #define SMOLBOTE_VERSION_H -- cgit v1.2.1