aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TODO.org21
-rw-r--r--src/App.cpp72
-rw-r--r--src/App.hpp28
-rw-r--r--src/InstanceManager.cpp30
-rw-r--r--src/InstanceManager.hpp36
-rw-r--r--src/main.cpp64
6 files changed, 161 insertions, 90 deletions
diff --git a/TODO.org b/TODO.org
index d51d23c..0a6b89f 100644
--- a/TODO.org
+++ b/TODO.org
@@ -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;
}