diff options
Diffstat (limited to '')
| -rw-r--r-- | src/LuaRuntime.cpp | 13 | ||||
| -rw-r--r-- | src/LuaRuntime.hpp | 3 | ||||
| -rw-r--r-- | src/WindowActionRouter.cpp | 26 | ||||
| -rw-r--r-- | src/WindowActionRouter.hpp | 8 | ||||
| -rw-r--r-- | src/WindowMediator.cpp | 6 | ||||
| -rw-r--r-- | src/WindowMediator.hpp | 2 | ||||
| -rw-r--r-- | src/utils.hpp | 6 | ||||
| -rw-r--r-- | src/widgets/BrowserApp.cpp | 3 | ||||
| -rw-r--r-- | src/widgets/BrowserWindow.hpp | 8 | ||||
| -rw-r--r-- | src/widgets/WebViewStack.cpp | 2 | ||||
| -rw-r--r-- | src/widgets/WebViewStack.hpp | 2 |
11 files changed, 51 insertions, 28 deletions
diff --git a/src/LuaRuntime.cpp b/src/LuaRuntime.cpp index 0ef7ef8..2e711cb 100644 --- a/src/LuaRuntime.cpp +++ b/src/LuaRuntime.cpp @@ -1,3 +1,4 @@ +#include "WindowActionRouter.hpp" #include <QtCore> #include <lua.hpp> extern "C" { @@ -74,6 +75,7 @@ void LuaRuntime::init_web_lib() { // web luaL_Reg web[] = { + /// @deprecated {"open", &LuaRuntime::lua_open_url}, {nullptr, nullptr}, }; @@ -169,15 +171,15 @@ int LuaRuntime::lua_keymap_set(lua_State *state) { } int LuaRuntime::lua_tab_current(lua_State *state) { - auto *runtime = LuaRuntime::instance(); - auto tab_id = runtime->fetch_current_tab_id(); + auto *router = WindowActionRouter::instance(); + auto tab_id = router->fetch_current_tab_id(); lua_pushinteger(state, tab_id); return 1; } int LuaRuntime::lua_tab_list(lua_State *state) { - auto *runtime = LuaRuntime::instance(); - auto tabs = runtime->fetch_webview_data_list(); + auto *router = WindowActionRouter::instance(); + auto tabs = router->fetch_webview_data_list(); lua_newtable(state); int index = 1; // 1-indexed @@ -196,7 +198,8 @@ int LuaRuntime::lua_tab_list(lua_State *state) { lua_pushstring(state, tab.title.toStdString().c_str()); lua_settable(state, -3); - lua_rawseti(state, -2, index++); + lua_rawseti(state, -2, index); + index++; } return 1; diff --git a/src/LuaRuntime.hpp b/src/LuaRuntime.hpp index ade8ed3..4d69760 100644 --- a/src/LuaRuntime.hpp +++ b/src/LuaRuntime.hpp @@ -36,9 +36,6 @@ public: QVariant get_lua_value(int idx, QVariant default_value = 0); DEFINE_GETTER(get_state, state) - DEFINE_FETCHER(qsizetype(), current_tab_id) - DEFINE_FETCHER(QList<WebViewData>(), webview_data_list) - signals: void evaluation_completed(QVariant value); void evaluation_failed(QString value); diff --git a/src/WindowActionRouter.cpp b/src/WindowActionRouter.cpp index e530455..264c75e 100644 --- a/src/WindowActionRouter.cpp +++ b/src/WindowActionRouter.cpp @@ -69,7 +69,33 @@ WindowActionRouter::WindowActionRouter() { void WindowActionRouter::add_window(BrowserWindow *window) { window_map.insert({last_id, window}); + window->set_id(last_id); last_id++; } const WindowMap &WindowActionRouter::windows() { return window_map; } + +WebViewId WindowActionRouter::fetch_current_tab_id(WindowId win_id) { + for (auto &pair : window_map) { + auto *win = pair.second; + auto is_current_window = + win_id == win->get_id() || (win_id == 0 && win->isActiveWindow()); + if (is_current_window) { + return win->mediator()->current_webview_id(); + } + } + return 0; +} + +QList<WebViewData> +WindowActionRouter::fetch_webview_data_list(WindowId win_id) { + for (auto &pair : window_map) { + auto *win = pair.second; + auto is_current_window = + win_id == win->get_id() || (win_id == 0 && win->isActiveWindow()); + if (is_current_window) { + return win->mediator()->get_webview_list(); + } + } + return {}; +} diff --git a/src/WindowActionRouter.hpp b/src/WindowActionRouter.hpp index b6cd731..83c4137 100644 --- a/src/WindowActionRouter.hpp +++ b/src/WindowActionRouter.hpp @@ -1,13 +1,10 @@ #pragma once -#include "widgets/BrowserWindow.hpp" #include <QWidget> #include <QtCore> #include <cstdint> -#include <unordered_map> -using WindowId = uint64_t; -using WindowMap = std::unordered_map<uint64_t, BrowserWindow *>; +#include "widgets/BrowserWindow.hpp" class WindowActionRouter : public QWidget { Q_OBJECT @@ -21,6 +18,9 @@ public: void add_window(BrowserWindow *window); const WindowMap &windows(); + WebViewId fetch_current_tab_id(WindowId win_id = 0); + QList<WebViewData> fetch_webview_data_list(WindowId win_id = 0); + protected: WindowActionRouter(); diff --git a/src/WindowMediator.cpp b/src/WindowMediator.cpp index 8c49e94..7d6859b 100644 --- a/src/WindowMediator.cpp +++ b/src/WindowMediator.cpp @@ -27,12 +27,6 @@ WindowMediator::WindowMediator(WebViewStack *webview_stack, &WebViewStack::close); connect(this, &WindowMediator::webview_selected, webview_stack, &WebViewStack::focus_webview); - - // TODO: Think of how to handle this for multi-window - lua_runtime->set_current_tab_id_fetcher( - [this]() { return this->webview_stack->current_webview_id(); }); - lua_runtime->set_webview_data_list_fetcher( - [this]() { return this->webview_stack->get_webview_list(); }); } void WindowMediator::add_keymap(const QString &mode_string, diff --git a/src/WindowMediator.hpp b/src/WindowMediator.hpp index f04763c..1a65fd7 100644 --- a/src/WindowMediator.hpp +++ b/src/WindowMediator.hpp @@ -18,6 +18,8 @@ public: DELEGATE(keymap_evaluator, evaluate, evaluate_keymap) DELEGATE(webview_stack, has_webview, has_webview) + DELEGATE(webview_stack, current_webview_id, current_webview_id) + DELEGATE(webview_stack, get_webview_list, get_webview_list) signals: void history_back_requested(WebViewId webview_id, qsizetype history_index); diff --git a/src/utils.hpp b/src/utils.hpp index e3de4dc..d5d4fc5 100644 --- a/src/utils.hpp +++ b/src/utils.hpp @@ -10,9 +10,3 @@ #define DEFINE_GETTER(METHOD, EXPR) \ decltype(auto) METHOD() { return EXPR; } - -#define DEFINE_FETCHER(TYPE, NAME) \ - void set_##NAME##_fetcher(const std::function<TYPE> &fetcher) { \ - fetch_##NAME = fetcher; \ - } \ - std::function<TYPE> fetch_##NAME; diff --git a/src/widgets/BrowserApp.cpp b/src/widgets/BrowserApp.cpp index 3cd06b4..9a4e1cf 100644 --- a/src/widgets/BrowserApp.cpp +++ b/src/widgets/BrowserApp.cpp @@ -16,9 +16,8 @@ BrowserApp::BrowserApp() { BrowserWindow *BrowserApp::create_window() { auto *win = new BrowserWindow((const Configuration &)configuration); + WindowActionRouter::instance()->add_window(win); win->setWindowTitle("null-browser"); - auto *router = WindowActionRouter::instance(); - router->add_window(win); win->show(); return win; } diff --git a/src/widgets/BrowserWindow.hpp b/src/widgets/BrowserWindow.hpp index 6036ec1..364aa12 100644 --- a/src/widgets/BrowserWindow.hpp +++ b/src/widgets/BrowserWindow.hpp @@ -6,15 +6,23 @@ #include "WindowMediator.hpp" #include "utils.hpp" +using WindowId = uint64_t; + class BrowserWindow : public QMainWindow { public: BrowserWindow(const Configuration &configuration); DEFINE_GETTER(mediator, input_mediator) + DEFINE_GETTER(get_id, win_id) + DEFINE_SETTER(set_id, win_id) bool on_window_key_event(QKeyEvent *event); private: WindowMediator *input_mediator; const Configuration &configuration; + + WindowId win_id = -1; }; + +using WindowMap = std::unordered_map<uint64_t, BrowserWindow *>; diff --git a/src/widgets/WebViewStack.cpp b/src/widgets/WebViewStack.cpp index 6265855..5ec6364 100644 --- a/src/widgets/WebViewStack.cpp +++ b/src/widgets/WebViewStack.cpp @@ -8,6 +8,8 @@ #include "widgets/WebViewStack.hpp" +static WebViewId next_webview_id = 1; + WebViewStack::WebViewStack(const Configuration *configuration, QWebEngineProfile *profile, QWidget *parent) : QWidget(parent), configuration(configuration), profile(profile) { diff --git a/src/widgets/WebViewStack.hpp b/src/widgets/WebViewStack.hpp index 03581e8..40c2184 100644 --- a/src/widgets/WebViewStack.hpp +++ b/src/widgets/WebViewStack.hpp @@ -23,8 +23,6 @@ struct WebViewData { QString title; }; -static WebViewId next_webview_id = 1; - class WebViewStack : public QWidget { Q_OBJECT |
