diff options
Diffstat (limited to '')
| -rw-r--r-- | TODO.org | 21 | ||||
| -rw-r--r-- | src/App.cpp | 72 | ||||
| -rw-r--r-- | src/App.hpp | 28 | ||||
| -rw-r--r-- | src/InstanceManager.cpp | 30 | ||||
| -rw-r--r-- | src/InstanceManager.hpp | 36 | ||||
| -rw-r--r-- | src/main.cpp | 64 |
6 files changed, 161 insertions, 90 deletions
@@ -1,12 +1,13 @@ ** Usable - [-] Tests for api -- [ ] Permission list/allow/deny lua api - [ ] Fullscreen -- [ ] Zoom in/out - [ ] Run JS in page (web.view.eval_js()) +- [ ] f-key navigation +- [ ] Zoom in/out - [ ] Use table for all internals api options? -- [ ] Create window with new profile -- [ ] User data/profiles management +- [ ] Permission management (list/allow/deny) lua api +- [ ] Generate docs for api +- [ ] Decorations api (just for statusline) ** Bugs - [ ] INVESTIGATE: Check why urlchanged doesnt fire for first url open sometimes @@ -14,20 +15,22 @@ - [ ] API's don't validate types. (type conversion segfaults) ** Next -- [ ] Configuration validation -- [ ] web.win.* apis (list, current_id) -- [ ] Allow toggling devtools - [ ] Tests for window - [ ] More tests for stack - [ ] Tests for router -- [ ] Set search text as the user is typing (dmenu -r) +- [ ] Read page contents via lua +- [ ] User data/profiles management +- [ ] Create window with new profile +- [ ] Configuration validation +- [ ] web.win.* apis (list, current_id) +- [ ] Allow toggling devtools +- [X] Set search text as the user is typing (dmenu -r) - [ ] Log stdout, errors and results from lua somewhere - [ ] Conflict in keymap (keymap already exists) - [ ] Allow pattern filtering for event listeners - [ ] Allow tab_id, win_id filtering for event listeners - [ ] Handle resource cleanup + signal disconnecting - [ ] Private window (in-memory profile) -- [ ] Read page contents via lua ** Later - [ ] Bookmarking diff --git a/src/App.cpp b/src/App.cpp new file mode 100644 index 0000000..7ce8932 --- /dev/null +++ b/src/App.cpp @@ -0,0 +1,72 @@ +#include "InstanceManager.hpp" +#include "LuaRuntime.hpp" +#include "widgets/BrowserApp.hpp" + +#include "App.hpp" + +App::App() { + configure_cli_parser(); + QApplication::setApplicationName("null-browser"); + QApplication::setApplicationVersion("0.0.0"); +} + +void App::run() { + cli_parser.process(*qApp); + instance_manager.initialize(); + + auto config_dir = get_cli_config_dir(); + if (!config_dir.isEmpty()) + configuration.set_config_dir(config_dir); + + if (instance_manager.is_server()) { + init_server(); + } else { + qInfo() << "Using current instance"; + init_client(); + } +} + +void App::configure_cli_parser() { + cli_parser.setApplicationDescription("null-browser"); + cli_parser.addHelpOption(); + cli_parser.addVersionOption(); + cli_parser.addPositionalArgument("url", "URL(s) to open", "[url]"); + cli_parser.addOptions({ + {{"e", "expr"}, "Lua expression to execute", "lua"}, + {{"C", "config-dir"}, "Config directory for null browser", "dir"}, + }); +} + +void App::init_server() { + auto urls = get_cli_urls(); + auto lua_expr = get_cli_lua_expr(); + + auto *browser = new BrowserApp(configuration); + browser->create_window(urls); + + auto &lua = LuaRuntime::instance(); + QObject::connect(&instance_manager, &InstanceManager::lua_eval_requested, &lua, + &LuaRuntime::evaluate); + QObject::connect(&instance_manager, &InstanceManager::urls_open_requested, browser, + &BrowserApp::create_window); + + if (!lua_expr.isEmpty()) + lua.evaluate(lua_expr); +} + +void App::init_client() { + auto urls = get_cli_urls(); + auto lua_expr = get_cli_lua_expr(); + + if (!urls.isEmpty() || lua_expr.isEmpty()) { + UrlServerMsg msg(urls); + instance_manager.write_message(msg); + } + + if (!lua_expr.isEmpty()) { + LuaExprServerMsg msg(lua_expr); + instance_manager.write_message(msg); + } + + instance_manager.close(); +} diff --git a/src/App.hpp b/src/App.hpp new file mode 100644 index 0000000..493a96c --- /dev/null +++ b/src/App.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include <QApplication> +#include <qcommandlineparser.h> + +#include "Configuration.hpp" +#include "InstanceManager.hpp" +#include "utils.hpp" + +class App { +public: + App(); + void run(); + DELEGATE((&instance_manager), is_server, is_server) + +private: + InstanceManager instance_manager; + Configuration configuration; + QCommandLineParser cli_parser; + + void configure_cli_parser(); + void init_server(); + void init_client(); + + QString get_cli_config_dir() { return cli_parser.value("config-dir"); } + QString get_cli_lua_expr() { return cli_parser.value("expr"); } + QList<QString> get_cli_urls() { return cli_parser.positionalArguments(); } +}; diff --git a/src/InstanceManager.cpp b/src/InstanceManager.cpp index 3f961ec..ec7d6e1 100644 --- a/src/InstanceManager.cpp +++ b/src/InstanceManager.cpp @@ -5,31 +5,13 @@ #include "InstanceManager.hpp" -InstanceManager::InstanceManager() { +void InstanceManager::initialize() { bool connected = try_server_connection(); if (!connected) { server_init(); } } -void InstanceManager::write_open_urls_to_socket(const QStringList &urls) { - if (socket == nullptr) - return; - - auto message = urls.join(" ").toStdString(); - socket->write(message.c_str()); - socket->write("\n"); -} - -void InstanceManager::write_lua_expr_to_socket(const QString &lua_expr) { - if (socket == nullptr) - return; - - auto message = ("lua " + lua_expr).toStdString(); - socket->write(message.c_str()); - socket->write("\n"); -} - void InstanceManager::server_init() { server = new QLocalServer(this); is_server_mode = true; @@ -43,7 +25,15 @@ void InstanceManager::server_init() { } } -void InstanceManager::send_message() { +void InstanceManager::write_message(ServerMsg &msg) { + if (socket == nullptr) + return; + + msg.write_to_socket(socket); + socket->waitForBytesWritten(); +} + +void InstanceManager::close() { socket->waitForBytesWritten(); socket->close(); } diff --git a/src/InstanceManager.hpp b/src/InstanceManager.hpp index 0ef6e08..47d4932 100644 --- a/src/InstanceManager.hpp +++ b/src/InstanceManager.hpp @@ -6,15 +6,21 @@ #include "utils.hpp" +class ServerMsg { +public: + virtual void write_to_socket(QIODevice *socket) = 0; +}; + class InstanceManager : public QObject { Q_OBJECT public: - InstanceManager(); + InstanceManager() = default; ~InstanceManager() override; - void write_open_urls_to_socket(const QStringList &urls); - void write_lua_expr_to_socket(const QString &lua_expr); - void send_message(); + + void initialize(); + void write_message(ServerMsg &msg); + void close(); DEFINE_GETTER(is_server, is_server_mode) @@ -37,3 +43,25 @@ private: // TODO: On windows, \\.\pipe\null-browser const char *socket_path = "/tmp/null-browser-socket.sock"; }; + +class LuaExprServerMsg : public ServerMsg { +public: + const QString &expr; + LuaExprServerMsg(auto expr) : expr(expr) {} + + void write_to_socket(QIODevice *socket) override { + socket->write(("lua " + expr).toStdString().c_str()); + socket->write("\n"); + } +}; + +class UrlServerMsg : public ServerMsg { +public: + const QStringList &urls; + UrlServerMsg(auto urls) : urls(urls) {} + + void write_to_socket(QIODevice *socket) override { + socket->write(urls.join(" ").toStdString().c_str()); + socket->write("\n"); + } +}; diff --git a/src/main.cpp b/src/main.cpp index ee94ad3..fbe1fbd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,64 +1,14 @@ #include <QApplication> -#include "InstanceManager.hpp" -#include "LuaRuntime.hpp" -#include "widgets/BrowserApp.hpp" - -QCommandLineParser *create_cli_parser() { - auto *parser = new QCommandLineParser(); - parser->setApplicationDescription("null-browser"); - parser->addHelpOption(); - parser->addVersionOption(); - 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; -} +#include "App.hpp" int main(int argc, char *argv[]) { - const QApplication app(argc, argv); - QApplication::setApplicationName("null-browser"); - QApplication::setApplicationVersion("0.0.0"); - - auto *parser = create_cli_parser(); - parser->process(app); - - 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(configuration); - browser->create_window(urls); - - auto &lua = LuaRuntime::instance(); - QObject::connect(&instance_manager, &InstanceManager::lua_eval_requested, &lua, - &LuaRuntime::evaluate); - QObject::connect(&instance_manager, &InstanceManager::urls_open_requested, browser, - &BrowserApp::create_window); - - if (!lua_expr.isEmpty()) - lua.evaluate(lua_expr); - } else { - qInfo() << "Using current instance"; - - if (!urls.isEmpty() || lua_expr.isEmpty()) - instance_manager.write_open_urls_to_socket(urls); - - if (!lua_expr.isEmpty()) - instance_manager.write_lua_expr_to_socket(lua_expr); + const QApplication qt_app(argc, argv); - instance_manager.send_message(); - return 0; - } + App app; + app.run(); - return QApplication::exec(); + if (app.is_server()) + return QApplication::exec(); + return 0; } |
