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