From 2f1e73741da625c173156102457d5442b27cd953 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Sun, 20 Apr 2025 19:20:33 +0530 Subject: Add configuration directory loading + --config-dir cli arg --- src/Configuration.hpp | 12 ++++++++++++ src/LuaRuntime.cpp | 26 +++++++++++++++----------- src/LuaRuntime.hpp | 3 ++- src/main.cpp | 8 +++++++- src/widgets/BrowserApp.cpp | 17 ++++++++++++++--- src/widgets/BrowserApp.hpp | 5 +++-- 6 files changed, 53 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/Configuration.hpp b/src/Configuration.hpp index 3b491b2..1f861fa 100644 --- a/src/Configuration.hpp +++ b/src/Configuration.hpp @@ -1,5 +1,6 @@ #pragma once +#include "utils.hpp" #include #include #include @@ -13,7 +14,9 @@ private: {"close_window_when_no_views", true}, {"user_agent", QWebEngineProfile::defaultProfile()->httpUserAgent()}, {"downloads_dir", QWebEngineProfile::defaultProfile()->downloadPath()}, + {"app_data_dir", QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation)}, }; + QDir config_dir = QDir(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation)); public: using QObject::QObject; @@ -24,6 +27,9 @@ public: } QVariant get_config(const QString &name, QVariant default_value = "") const { + if (name == "config_dir") // readonly + return config_dir.path(); + if (!config_map.contains(name)) return default_value; @@ -37,6 +43,12 @@ public: QString user_agent() const { return get_config("user_agent").toString(); } QString downloads_dir() const { return get_config("downloads_dir").toString(); } + DEFINE_GETTER(get_config_dir, config_dir) + DEFINE_SETTER(set_config_dir, config_dir) + + QString get_config_lua_init_file() const { return config_dir.filePath("init.lua"); } + QString get_config_lua_dir() const { return config_dir.filePath("lua"); } + private: void on_update(const QString &name, const QVariant &value) { if (name == "user_agent") diff --git a/src/LuaRuntime.cpp b/src/LuaRuntime.cpp index cb5a69a..b4c39a2 100644 --- a/src/LuaRuntime.cpp +++ b/src/LuaRuntime.cpp @@ -15,7 +15,7 @@ LuaRuntime::LuaRuntime() { state = luaL_newstate(); luaL_openlibs(state); - init_lua_package_path(); + init_builtins_package_path(); init_web_api(); } @@ -57,16 +57,9 @@ void LuaRuntime::init_web_api() { }); } -void LuaRuntime::init_lua_package_path() { - auto lua_path = QString(PROJECT_LUA_PATH); - preserve_top(state, { - lua_getglobal(state, "package"); - lua_getfield(state, -1, "path"); - auto pkg_path = QString(lua_tostring(state, -1)) + ";" + lua_path; - lua_pop(state, 1); - lua_pushstring(state, pkg_path.toStdString().c_str()); - lua_setfield(state, -2, "path"); - }); +void LuaRuntime::init_builtins_package_path() { + auto builtins_lua_path = QString(PROJECT_LUA_PATH); + append_package_path(builtins_lua_path); } void LuaRuntime::evaluate(const QString &code) { @@ -84,6 +77,17 @@ void LuaRuntime::evaluate(const QString &code) { }); } +void LuaRuntime::append_package_path(const QString &path) { + preserve_top(state, { + lua_getglobal(state, "package"); + lua_getfield(state, -1, "path"); + auto pkg_path = QString(lua_tostring(state, -1)) + ";" + path; + lua_pop(state, 1); + lua_pushstring(state, pkg_path.toStdString().c_str()); + lua_setfield(state, -2, "path"); + }); +} + void LuaRuntime::load_file_sync(const QString &path) { preserve_top(state, { if (luaL_dofile(state, path.toStdString().c_str()) != LUA_OK) { diff --git a/src/LuaRuntime.hpp b/src/LuaRuntime.hpp index d7ec1ae..abefd86 100644 --- a/src/LuaRuntime.hpp +++ b/src/LuaRuntime.hpp @@ -34,6 +34,7 @@ public: void evaluate(const QString &code); void load_file_sync(const QString &path); + void append_package_path(const QString &path); void stop_event_loop(); void start_event_loop(); @@ -61,7 +62,7 @@ signals: protected: LuaRuntime(); ~LuaRuntime() override; - void init_lua_package_path(); + void init_builtins_package_path(); void init_web_api(); private: diff --git a/src/main.cpp b/src/main.cpp index dc51342..dc67c8a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,6 +12,7 @@ QCommandLineParser *create_cli_parser() { parser->addPositionalArgument("url", "URL(s) to open", "[url]"); parser->addOptions({ {{"e", "expr"}, "Lua expression to execute", "lua"}, + {{"c", "config-dir"}, "Config directory for null browser", "dir"}, }); return parser; @@ -27,10 +28,15 @@ int main(int argc, char *argv[]) { auto urls = parser->positionalArguments(); auto lua_expr = parser->value("expr"); + auto config_dir = parser->value("config-dir"); + + Configuration configuration; + if (!config_dir.isEmpty()) + configuration.set_config_dir(config_dir); InstanceManager instance_manager; if (instance_manager.is_server()) { - auto *browser = new BrowserApp; + auto *browser = new BrowserApp(configuration); browser->create_window(urls); auto &lua = LuaRuntime::instance(); diff --git a/src/widgets/BrowserApp.cpp b/src/widgets/BrowserApp.cpp index 502d930..1362941 100644 --- a/src/widgets/BrowserApp.cpp +++ b/src/widgets/BrowserApp.cpp @@ -1,3 +1,4 @@ +#include #include #include @@ -6,7 +7,7 @@ #include "widgets/BrowserApp.hpp" #include "widgets/BrowserWindow.hpp" -BrowserApp::BrowserApp() { +BrowserApp::BrowserApp(Configuration &configuration) : configuration(configuration) { auto &lua = LuaRuntime::instance(); lua.start_event_loop(); @@ -17,8 +18,18 @@ BrowserApp::BrowserApp() { // Global event filter qApp->installEventFilter(this); - // NOTE: TMP - lua.load_file_sync("./config.lua"); + qDebug() << "Config dir:" << configuration.get_config_dir().path(); + + // Load lua directory into package path + lua.append_package_path(configuration.get_config_lua_dir()); + + // Load init.lua + auto lua_init_file = configuration.get_config_lua_init_file(); + if (QFile::exists(lua_init_file)) { + lua.load_file_sync(lua_init_file); + } else { + qWarning() << "Unable to find init.lua:" << lua_init_file; + } // Initializes profile for (auto *profile : profiles) { diff --git a/src/widgets/BrowserApp.hpp b/src/widgets/BrowserApp.hpp index 90d1ae7..c659763 100644 --- a/src/widgets/BrowserApp.hpp +++ b/src/widgets/BrowserApp.hpp @@ -1,5 +1,6 @@ #pragma once +#include "Configuration.hpp" #include "widgets/BrowserWindow.hpp" #include @@ -7,7 +8,7 @@ class BrowserApp : public QObject { Q_OBJECT public: - BrowserApp(); + BrowserApp(Configuration &configuration); BrowserWindow *create_window(const QStringList &urls = {}); @@ -15,7 +16,7 @@ protected: bool eventFilter(QObject *target, QEvent *event) override; private: - Configuration configuration; + Configuration &configuration; QWebEngineProfile default_profile{"default"}; QList profiles{&default_profile}; }; -- cgit v1.3.1