roundabout,
created on Monday, 30 June 2025, 18:46:12 (1751309172),
received on Monday, 30 June 2025, 18:46:14 (1751309174)
Author identity: vlad <vlad.muntoiu@gmail.com>
c817c355395ed9d9829b1fdbc2749fc2cb3b9275
panthera-www.cc
@@ -127,6 +127,18 @@ std::vector<WebKitWebView*> collect_webviews(Gtk::Widget const &root) {
return result; } bool has_webview(Gtk::Widget const &root) { if(WEBKIT_IS_WEB_VIEW(G_OBJECT(root.gobj()))) { return true; } for(auto *child = root.get_first_child(); child; child = child->get_next_sibling()) { if(has_webview(*child)) { return true; } } return false; } class HistoryViewer : public gPanthera::DockablePane { protected: std::shared_ptr<HistoryManager> history_manager;
@@ -339,6 +351,9 @@ private:
reload_action->set_enabled(true); url_bar->set_sensitive(true); go_button->set_sensitive(true); if(controlled_page) { g_object_notify(G_OBJECT(controlled_page->get_child()->get_first_child()->gobj()), "uri"); }} void disable_controls() {
@@ -350,7 +365,7 @@ private:
go_button->set_sensitive(false); } sigc::connection moving_connection, moved_connection;sigc::connection moving_connection, moved_connection, closing_connection, closed_connection;public: friend class PantheraWww;
@@ -412,8 +427,7 @@ public:
for(auto view : webviews) { webkit_web_view_try_close(view); } webviews = collect_webviews(*window);if(webviews.empty()) {if(!has_webview(*window)) {// All documents have been closed safely, the window can be closed return false; }
@@ -645,17 +659,30 @@ public:
for(auto view : webviews) { webkit_web_view_try_close(view); } webviews = collect_webviews(*this);if(webviews.empty()) {if(!has_webview(*this)) {// All documents have been closed safely, the window can be closed return false; } return true; }, false); closing_connection = panthera->content_manager->signal_page_closing.connect([this](gPanthera::ContentPage *page) { if(page->get_root() != this) { return; } disable_controls(); }); closed_connection = panthera->content_manager->signal_page_closed.connect([this](gPanthera::ContentPage *page) { if(has_webview(*this)) { enable_controls(); } });} ~PantheraWindow() override { moving_connection.disconnect(); moved_connection.disconnect(); closed_connection.disconnect(); closing_connection.disconnect();} };
@@ -710,7 +737,9 @@ void PantheraWww::notify_focused_callback(GObject *object, GParamSpec *pspec, gp
if(auto page = dynamic_cast<gPanthera::ContentPage*>(Glib::wrap(parent))) { if(g_strcmp0(pspec->name, "uri") == 0) { if(auto main_window = dynamic_cast<PantheraWindow*>(page->get_root())) { main_window->url_bar->set_text(webkit_web_view_get_uri(WEBKIT_WEB_VIEW(object)));if(webkit_web_view_get_uri(WEBKIT_WEB_VIEW(object))) { main_window->url_bar->set_text(webkit_web_view_get_uri(WEBKIT_WEB_VIEW(object))); }} } else if(g_strcmp0(pspec->name, "title") == 0) { if(auto window = dynamic_cast<Gtk::Window*>(page->get_root())) {
@@ -780,6 +809,7 @@ void PantheraWww::close_callback(WebKitWebView *source, gpointer user_data) {
page->content_manager->set_last_operated_page(nullptr); } page->redock(nullptr); self->content_manager->signal_page_closed.emit(page);} } }