roundabout,
created on Saturday, 17 May 2025, 09:28:12 (1747474092),
received on Saturday, 17 May 2025, 09:28:18 (1747474098)
Author identity: vlad <vlad.muntoiu@gmail.com>
5e201b0d550edeb85c387f11667b1ef9ebd473d4
panthera-www.cc
@@ -97,7 +97,28 @@ protected:
webkit_web_view_go_forward(webview); } void on_new_tab(gPanthera::ContentStack *stack) {static gboolean on_decide_policy(WebKitWebView *source, WebKitPolicyDecision *decision, WebKitPolicyDecisionType type, gpointer user_data) { // Middle-click opens in a new window if(auto self = static_cast<PantheraWww*>(user_data)) { std::cout << type << '\n'; if(type == WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION) { auto action = webkit_navigation_policy_decision_get_navigation_action(WEBKIT_NAVIGATION_POLICY_DECISION(decision)); if(webkit_navigation_action_get_mouse_button(action) == 2) { Glib::ustring url = Glib::ustring(webkit_uri_request_get_uri(webkit_navigation_action_get_request(action))); self->on_new_tab(nullptr, url, false); webkit_policy_decision_ignore(decision); return true; } } else if(type == WEBKIT_POLICY_DECISION_TYPE_NEW_WINDOW_ACTION) { auto action = webkit_navigation_policy_decision_get_navigation_action(WEBKIT_NAVIGATION_POLICY_DECISION(decision)); self->on_new_tab(nullptr, webkit_uri_request_get_uri(webkit_navigation_action_get_request(action)), false, true); return true; } } return false; } void on_new_tab(gPanthera::ContentStack *stack, const Glib::ustring &url = "about:blank", bool focus = true, bool new_window = false) {if(!stack) { // Find the current area stack = content_manager->get_last_operated_page()->get_stack();
@@ -111,7 +132,8 @@ protected:
auto page_tab = new Gtk::Label("Untitled"); auto page = Gtk::make_managed<gPanthera::ContentPage>(content_manager, stack, page_content, page_tab); g_signal_connect(webview, "notify", G_CALLBACK(notify_callback), page->gobj()); webkit_web_view_load_uri(webview, "about:blank");g_signal_connect(webview, "decide-policy", G_CALLBACK(on_decide_policy), this); webkit_web_view_load_uri(webview, url.data());auto cookie_manager = webkit_network_session_get_cookie_manager(webkit_web_view_get_network_session(webview)); webkit_cookie_manager_set_persistent_storage(cookie_manager, cookie_file.c_str(), WEBKIT_COOKIE_PERSISTENT_STORAGE_TEXT); webkit_cookie_manager_set_accept_policy(cookie_manager, WEBKIT_COOKIE_POLICY_ACCEPT_ALWAYS);
@@ -126,8 +148,13 @@ protected:
gtk_widget_add_controller(GTK_WIDGET(webview), click_controller_forward); stack->add_page(*page); stack->set_visible_child(*page);content_manager->set_last_operated_page(page);if(focus) { stack->set_visible_child(*page); content_manager->set_last_operated_page(page); } if(new_window) { bool result = stack->signal_detach.emit(page); }} void on_startup() override {
@@ -253,7 +280,9 @@ protected:
*control_signal_handler = page->signal_control_status_changed.connect([this, page, control_signal_handler, url_update_handler](bool controlled) { if(!controlled) { control_signal_handler->disconnect(); g_signal_handler_disconnect(page->get_child()->get_first_child()->gobj(), url_update_handler);if(page->get_child() && page->get_child()->get_first_child() && WEBKIT_IS_WEB_VIEW(page->get_child()->get_first_child()->gobj())) { g_signal_handler_disconnect(page->get_child()->get_first_child()->gobj(), url_update_handler); }} }); });
@@ -416,4 +445,4 @@ int main(int argc, char *argv[]) {
gPanthera::init(); auto app = PantheraWww::create(); return app->run(argc, argv); }}