/* * 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/smolbote.hg * * SPDX-License-Identifier: GPL-3.0 */ #include "configuration.h" #include #include #include #include #include namespace po = boost::program_options; inline std::string defaultUserConfigLocation() { // try to locate an existing config QString path = QStandardPaths::locate(QStandardPaths::ConfigLocation, "smolbote/smolbote.cfg"); // it's possible there is no config, so set the path properly if(path.isEmpty()) path = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + "/smolbote/smolbote.cfg"; return path.toStdString(); } constexpr const char *defaultSocketPath() { #if defined(Q_OS_UNIX) // could be a path such as "/tmp/foo" return "/tmp/smolbote.socket"; #elif defined(Q_OS_WIN32) // could be a pipe path such as "\\.\pipe\foo" return "\\\\.\\pipe\\smolbote_socket"; #endif } Configuration::Configuration(QObject *parent) : QObject(parent) { m_homePath = QStandardPaths::writableLocation(QStandardPaths::HomeLocation).toStdString(); commandLine_desc.add_options() ("help,h", "Display this help.") ("version,v", "Display version information.") ("build", "Display build branch and commit.") ("config,c", po::value()->default_value(defaultUserConfigLocation()), "Set the configuration file.") ("socket,s", po::value()->default_value(defaultSocketPath()), "Local server socket") ("session", po::value(), "Load session data from the specified path.") ("args", po::value>(), "arguments") ; arguments_desc.add("args", -1); configuration_desc.add_options() ("browser.stylesheet", po::value()) ("browser.session", po::value()) // main window ui ("mainwindow.height", po::value()->default_value(720)) ("mainwindow.width", po::value()->default_value(1280)) ("mainwindow.maximized", po::value()->default_value(true)) ("mainwindow.title", po::value()->default_value("smolbote")) // main window shortcuts ("mainwindow.shortcuts.newGroup", po::value()->default_value("Ctrl+G")) ("mainwindow.shortcuts.newWindow", po::value()->default_value("Ctrl+N")) ("mainwindow.shortcuts.about", po::value()->default_value("F1")) ("mainwindow.shortcuts.quit", po::value()->default_value("Ctrl+Q")) ("mainwindow.shortcuts.search", po::value()->default_value("F3")) ("mainwindow.shortcuts.tileWindows", po::value()->default_value("F9")) ("mainwindow.shortcuts.cascadeWindows", po::value()->default_value("F10")) // navigation ("navigation.movable", po::value()->default_value(false)) ("navigation.shortcuts.back", po::value()->default_value("Ctrl+Left")) ("navigation.shortcuts.backMenu", po::value()->default_value("Ctrl+Down")) ("navigation.shortcuts.forward", po::value()->default_value("Ctrl+Right")) ("navigation.shortcuts.forwardMenu", po::value()->default_value("Ctrl+Up")) ("navigation.shortcuts.refresh", po::value()->default_value("F5")) ("navigation.shortcuts.reload", po::value()->default_value("Ctrl+F5")) ("navigation.shortcuts.home", po::value()->default_value("Ctrl+Home")) // address bar ("addressbar.shortcuts.focus", po::value()->default_value("F4")) ("addressbar.shortcuts.menu", po::value()->default_value("F2")) // window ("window.shortcuts.new", po::value()->default_value("Ctrl+T")) ("window.shortcuts.close", po::value()->default_value("Ctrl+X")) ("window.shortcuts.left", po::value()->default_value("Ctrl+O")) ("window.shortcuts.right", po::value()->default_value("Ctrl+P")) ("window.shortcuts.fullscreen", po::value()->default_value("F11")) // Filter settings ("filter.path", po::value()->default_value("~/.config/smolbote/hosts.d")) ("filter.cookies.block.all", po::value()->default_value(false)) ("filter.cookies.block.thirdParty", po::value()->default_value(true)) ("filter.cookies.path", po::value()->default_value("~/.config/smolbote/cookies.d")) // Plugin settings ("plugins.path", po::value()->default_value("~/.config/smolbote/plugins.d")) // Profile settings // default profile name the browser should use; "" is off-the-record ("profile.default", po::value()->default_value("")) ("profile.path", po::value()->default_value("~/.config/smolbote/profiles.d")) ("profile.search", po::value()->default_value("https://duckduckgo.com/?q=%1&ia=web")) ("profile.homepage", po::value()->default_value("about:blank")) ("profile.newtab", po::value()->default_value("about:blank")) // Bookmark settings ("bookmarks.path", po::value()->default_value("~/.config/smolbote/bookmarks.xbel")) ("bookmarks.shortcut", po::value()->default_value("Ctrl+B")) // Downloads settings ("downloads.path", po::value()->default_value("~/Downloads")) ("downloads.shortcut", po::value()->default_value("Ctrl+D")) ; } bool Configuration::parse(const std::string &path) { std::ifstream f(path, std::ifstream::in); // parse_config_file(file, options_description, allow_unregistered) po::store(po::parse_config_file(f, configuration_desc, true), vm); return true; } bool Configuration::parse(int argc, char **argv) { try { auto cmd = po::command_line_parser(argc, argv); po::options_description desc; desc.add(commandLine_desc).add(configuration_desc); cmd.options(desc); cmd.positional(arguments_desc); po::store(cmd.run(), vm); } catch(const po::error &e) { qWarning("Error parsing command line: %s", e.what()); return false; } return true; } QHash Configuration::section(const std::string &prefix) const { QHash v; for(auto &s : configuration_desc.options()) { if(boost::starts_with(s->long_name(), prefix)) { v[s->long_name().c_str()] = QString::fromStdString(value(s->long_name().c_str()).value()); } } return v; }