aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2025-03-28 23:16:14 +0530
committerAkshay Nair <phenax5@gmail.com>2025-03-28 23:16:14 +0530
commitf7392096d2d84be7143947d386528bf4f487ee83 (patch)
treec1e40ccc50b857aa469e06bba6312dd3ff776397
parent46a7fee95a010f20490d7f66f0c2c82ed936ca5e (diff)
downloadnull-browser-f7392096d2d84be7143947d386528bf4f487ee83.tar.gz
null-browser-f7392096d2d84be7143947d386528bf4f487ee83.zip
Split window management for multi-window
-rw-r--r--src/main.cpp12
-rw-r--r--src/widgets/BrowserApp.cpp44
-rw-r--r--src/widgets/BrowserApp.hpp23
-rw-r--r--src/widgets/MainWindow.cpp34
-rw-r--r--src/widgets/MainWindow.hpp7
5 files changed, 86 insertions, 34 deletions
diff --git a/src/main.cpp b/src/main.cpp
index d676688..9409583 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,17 +1,13 @@
#include <QApplication>
-#include "LuaRuntime.hpp"
-#include "widgets/MainWindow.hpp"
+#include "widgets/BrowserApp.hpp"
int main(int argc, char *argv[]) {
const QApplication app(argc, argv);
- auto *lua = LuaRuntime::instance();
- lua->start_event_loop();
-
- MainWindow main_window;
- main_window.setWindowTitle("null-browser");
- main_window.show();
+ BrowserApp browser;
+ browser.create_window();
+ browser.create_window();
return QApplication::exec();
}
diff --git a/src/widgets/BrowserApp.cpp b/src/widgets/BrowserApp.cpp
new file mode 100644
index 0000000..0a82de0
--- /dev/null
+++ b/src/widgets/BrowserApp.cpp
@@ -0,0 +1,44 @@
+#include <QKeyEvent>
+#include <QtCore>
+
+#include "LuaRuntime.hpp"
+#include "widgets/BrowserApp.hpp"
+#include "widgets/MainWindow.hpp"
+
+BrowserApp::BrowserApp() {
+ auto *lua = LuaRuntime::instance();
+ lua->start_event_loop();
+
+ // Global event filter
+ qApp->installEventFilter(this);
+
+ // NOTE: TMP
+ lua->load_file("./config.lua");
+};
+
+MainWindow *BrowserApp::create_window() {
+ auto *win = new MainWindow((const Configuration &)configuration);
+ win->setWindowTitle("null-browser");
+ windows.insert({last_id, win});
+ last_id++;
+ win->show();
+ return win;
+}
+
+bool BrowserApp::eventFilter(QObject *target, QEvent *event) {
+ if (event->type() != QEvent::KeyPress)
+ return false;
+
+ for (auto &match : windows) {
+ auto *win = match.second;
+
+ if (auto *target_widget = dynamic_cast<QWidget *>(target);
+ win->isAncestorOf(target_widget)) {
+ auto *key_event = static_cast<QKeyEvent *>(event);
+ const bool should_skip = win->on_window_key_event(key_event);
+ return should_skip;
+ }
+ }
+
+ return false;
+}
diff --git a/src/widgets/BrowserApp.hpp b/src/widgets/BrowserApp.hpp
new file mode 100644
index 0000000..e4fcf99
--- /dev/null
+++ b/src/widgets/BrowserApp.hpp
@@ -0,0 +1,23 @@
+#pragma once
+
+#include <unordered_map>
+
+#include "widgets/MainWindow.hpp"
+
+class BrowserApp : public QObject {
+ Q_OBJECT
+
+public:
+ BrowserApp();
+
+ MainWindow *create_window();
+
+protected:
+ bool eventFilter(QObject *target, QEvent *event) override;
+
+private:
+ std::unordered_map<uint64_t, MainWindow *> windows;
+ uint64_t last_id = 1;
+
+ Configuration configuration;
+};
diff --git a/src/widgets/MainWindow.cpp b/src/widgets/MainWindow.cpp
index d66611b..2d17557 100644
--- a/src/widgets/MainWindow.cpp
+++ b/src/widgets/MainWindow.cpp
@@ -9,13 +9,11 @@
#include "widgets/MainWindow.hpp"
#include "widgets/WebViewStack.hpp"
-MainWindow::MainWindow() {
+MainWindow::MainWindow(const Configuration &configuration)
+ : configuration(configuration) {
setStyleSheet("background-color: #000; color: #fff;");
setCentralWidget(new QWidget()); // TODO: manage widget memory
- // Global event filter
- qApp->installEventFilter(this);
-
// Root stacked layout
auto *layout = new QStackedLayout();
layout->setContentsMargins(0, 0, 0, 0);
@@ -25,10 +23,14 @@ MainWindow::MainWindow() {
// Web engine
auto *web_view_stack =
- new WebViewStack((const Configuration *)&configuration,
- new QWebEngineProfile("null-browser"));
+ new WebViewStack(&configuration, new QWebEngineProfile("null-browser"));
layout->addWidget(web_view_stack);
+ auto *keymap_evaluator = new KeymapEvaluator;
+
+ input_mediator = new InputMediator(web_view_stack, LuaRuntime::instance(),
+ keymap_evaluator);
+
// TODO: remoev
web_view_stack->open_url(QUrl("https://duckduckgo.com"), OpenType::OpenUrl);
web_view_stack->open_url(QUrl("https://ediblemonad.dev"),
@@ -36,32 +38,20 @@ MainWindow::MainWindow() {
web_view_stack->open_url(QUrl("https://github.com/trending"),
OpenType::OpenUrlInBgTab);
- auto *keymap_evaluator = new KeymapEvaluator;
-
- input_mediator = new InputMediator(web_view_stack, LuaRuntime::instance(),
- keymap_evaluator);
-
- // NOTE: TMP
- LuaRuntime::instance()->load_file("./config.lua");
-
// TODO: remove
- keymap_evaluator->add_keymap(KeyMode::Normal, "i", [&keymap_evaluator]() {
+ keymap_evaluator->add_keymap(KeyMode::Normal, "i", [keymap_evaluator]() {
keymap_evaluator->set_current_mode(KeyMode::Insert);
});
- keymap_evaluator->add_keymap(KeyMode::Insert, "<esc>", [&keymap_evaluator]() {
+ keymap_evaluator->add_keymap(KeyMode::Insert, "<esc>", [keymap_evaluator]() {
keymap_evaluator->set_current_mode(KeyMode::Normal);
});
keymap_evaluator->add_keymap(KeyMode::Normal, "<c-t>a",
[]() { qDebug() << "Stuff"; });
}
-bool MainWindow::eventFilter(QObject * /*watched*/, QEvent *event) {
- if (event->type() != QEvent::KeyPress)
- return false;
-
- auto *key_event = static_cast<QKeyEvent *>(event);
+bool MainWindow::on_window_key_event(QKeyEvent *event) {
const bool should_skip = input_mediator->evaluate_keymap(
- key_event->modifiers(), (Qt::Key)key_event->key());
+ event->modifiers(), (Qt::Key)event->key());
return should_skip;
}
diff --git a/src/widgets/MainWindow.hpp b/src/widgets/MainWindow.hpp
index 26bd15b..7aaca2b 100644
--- a/src/widgets/MainWindow.hpp
+++ b/src/widgets/MainWindow.hpp
@@ -7,12 +7,11 @@
class MainWindow : public QMainWindow {
public:
- MainWindow();
+ MainWindow(const Configuration &configuration);
-protected:
- bool eventFilter(QObject *object, QEvent *event) override;
+ bool on_window_key_event(QKeyEvent *event);
private:
InputMediator *input_mediator;
- Configuration configuration;
+ const Configuration &configuration;
};