From bbde1438e9c31cc83d8c4835ea97a0eaeae4e192 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Sat, 5 Apr 2025 23:45:55 +0530 Subject: Close window when no tabs left --- src/Configuration.hpp | 2 ++ src/WindowActionRouter.cpp | 18 ++++++++++++++++-- src/WindowActionRouter.hpp | 2 ++ src/WindowMediator.cpp | 14 ++++++-------- src/WindowMediator.hpp | 1 + src/widgets/BrowserWindow.cpp | 3 ++- src/widgets/WebViewStack.cpp | 11 +++++------ src/widgets/WebViewStack.hpp | 1 + 8 files changed, 35 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/Configuration.hpp b/src/Configuration.hpp index 032d12e..837e3e6 100644 --- a/src/Configuration.hpp +++ b/src/Configuration.hpp @@ -9,4 +9,6 @@ public: using QObject::QObject; QUrl new_tab_url = QUrl("https://lite.duckduckgo.com"); + + bool close_window_when_no_tabs = true; }; diff --git a/src/WindowActionRouter.cpp b/src/WindowActionRouter.cpp index c1051ad..d1cd816 100644 --- a/src/WindowActionRouter.cpp +++ b/src/WindowActionRouter.cpp @@ -46,9 +46,21 @@ void WindowActionRouter::add_window(BrowserWindow *window) { auto win_id = last_id; last_id++; - window_map.insert({win_id, window}); window->set_id(win_id); - connect(window, &BrowserWindow::closed, this, [this, win_id]() { window_map.erase(win_id); }); + { + const std::lock_guard lock(window_map_mutex); + window_map.insert({win_id, window}); + } + + connect(window, &BrowserWindow::closed, this, [this, window]() { + window->disconnect(); + LuaRuntime::instance().queue_task([this, window]() { + const std::lock_guard lock(window_map_mutex); + window_map.erase(window->get_id()); + }); + }); + connect(window->mediator(), &WindowMediator::close_window_requested, window, + [window]() { window->close(); }); connect(window->mediator(), &WindowMediator::new_window_requested, this, &WindowActionRouter::new_window_requested); } @@ -63,6 +75,7 @@ void WindowActionRouter::add_keymap(const QString &mode_string, const QString &k } WebViewId WindowActionRouter::fetch_current_tab_id(WindowId win_id) { + const std::lock_guard lock(window_map_mutex); for (auto &pair : window_map) { auto *win = pair.second; auto is_current_window = win_id == win->get_id() || (win_id == 0 && win->isActiveWindow()); @@ -74,6 +87,7 @@ WebViewId WindowActionRouter::fetch_current_tab_id(WindowId win_id) { } QList WindowActionRouter::fetch_webview_data_list(WindowId win_id) { + const std::lock_guard lock(window_map_mutex); for (auto &pair : window_map) { auto *win = pair.second; auto is_current_window = win_id == win->get_id() || (win_id == 0 && win->isActiveWindow()); diff --git a/src/WindowActionRouter.hpp b/src/WindowActionRouter.hpp index c72aaaf..3c82b28 100644 --- a/src/WindowActionRouter.hpp +++ b/src/WindowActionRouter.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "EventQueue.hpp" #include "widgets/BrowserWindow.hpp" @@ -46,6 +47,7 @@ signals: void new_window_requested(const QUrl &url); private: + std::mutex window_map_mutex; WindowMap window_map; uint64_t last_id = 1; Configuration *configuration; diff --git a/src/WindowMediator.cpp b/src/WindowMediator.cpp index 0596d28..942207d 100644 --- a/src/WindowMediator.cpp +++ b/src/WindowMediator.cpp @@ -5,23 +5,21 @@ #include "WindowMediator.hpp" #include "widgets/WebViewStack.hpp" -WindowMediator::WindowMediator(WebViewStack *webview_stack) - : webview_stack(webview_stack) { +WindowMediator::WindowMediator(WebViewStack *webview_stack) : webview_stack(webview_stack) { connect(this, &WindowMediator::history_back_requested, webview_stack, &WebViewStack::webview_history_back); connect(this, &WindowMediator::history_forward_requested, webview_stack, &WebViewStack::webview_history_forward); - connect(this, &WindowMediator::url_opened, webview_stack, - &WebViewStack::open_url); - connect(this, &WindowMediator::webview_closed, webview_stack, - &WebViewStack::close); - connect(this, &WindowMediator::webview_selected, webview_stack, - &WebViewStack::focus_webview); + connect(this, &WindowMediator::url_opened, webview_stack, &WebViewStack::open_url); + connect(this, &WindowMediator::webview_closed, webview_stack, &WebViewStack::close); + connect(this, &WindowMediator::webview_selected, webview_stack, &WebViewStack::focus_webview); // Delegate signal connect(webview_stack, &WebViewStack::new_window_requested, this, &WindowMediator::new_window_requested); + connect(webview_stack, &WebViewStack::close_window_requested, this, + &WindowMediator::close_window_requested); } WindowMediator::~WindowMediator() { diff --git a/src/WindowMediator.hpp b/src/WindowMediator.hpp index e8050e9..ea1dd52 100644 --- a/src/WindowMediator.hpp +++ b/src/WindowMediator.hpp @@ -24,6 +24,7 @@ signals: void webview_closed(WebViewId webview_id); void webview_selected(WebViewId webview_id); void new_window_requested(const QUrl &url); + void close_window_requested(); private: WebViewStack *webview_stack; diff --git a/src/widgets/BrowserWindow.cpp b/src/widgets/BrowserWindow.cpp index aad551d..f1b786b 100644 --- a/src/widgets/BrowserWindow.cpp +++ b/src/widgets/BrowserWindow.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "Configuration.hpp" #include "WindowMediator.hpp" @@ -10,7 +11,7 @@ #include "widgets/WebViewStack.hpp" BrowserWindow::BrowserWindow(const Configuration &configuration, const QStringList &urls) - : configuration(configuration) { + : QMainWindow(nullptr), configuration(configuration) { setCentralWidget(new QWidget()); // Root stacked layout diff --git a/src/widgets/WebViewStack.cpp b/src/widgets/WebViewStack.cpp index ae95ea6..8c432f1 100644 --- a/src/widgets/WebViewStack.cpp +++ b/src/widgets/WebViewStack.cpp @@ -125,13 +125,12 @@ void WebViewStack::close(WebViewId webview_id) { disconnect(webview->page()); webview->deleteLater(); - // TODO: Focus on different webview - // focus_webview(); - - // TODO: Close window on empty if (webview_list.isEmpty()) { - // window()->close(); - create_new_webview(configuration->new_tab_url, true); + if (configuration->close_window_when_no_tabs) { + emit close_window_requested(); + } else { + create_new_webview(configuration->new_tab_url, true); + } } } diff --git a/src/widgets/WebViewStack.hpp b/src/widgets/WebViewStack.hpp index 23b9382..7cc2143 100644 --- a/src/widgets/WebViewStack.hpp +++ b/src/widgets/WebViewStack.hpp @@ -47,6 +47,7 @@ public: signals: void current_webview_title_changed(int index); void new_window_requested(const QUrl &url); + void close_window_requested(); protected: void set_current_url(const QUrl &url); -- cgit v1.3.1