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);
}
}
}