diff -r 2533f186089d config.mk --- a/config.mk Thu Mar 31 12:52:35 2011 +0200 +++ b/config.mk Wed Apr 06 16:05:23 2011 +0200 @@ -7,8 +7,8 @@ PREFIX = /usr/local MANPREFIX = ${PREFIX}/share/man -GTKINC=$(shell pkg-config --cflags gtk+-2.0 webkit-1.0) -GTKLIB=$(shell pkg-config --libs gtk+-2.0 webkit-1.0) +GTKINC=$(shell pkg-config --cflags gtk+-2.0 gconf-2.0 webkit-1.0) +GTKLIB=$(shell pkg-config --libs gtk+-2.0 gconf-2.0 webkit-1.0) # includes and libs diff -r 2533f186089d surf.c --- a/surf.c Thu Mar 31 12:52:35 2011 +0200 +++ b/surf.c Wed Apr 06 16:05:23 2011 +0200 @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -71,6 +72,7 @@ static WebKitWebView *createwindow(WebKitWebView *v, WebKitWebFrame *f, Client *c); static gboolean decidedownload(WebKitWebView *v, WebKitWebFrame *f, WebKitNetworkRequest *r, gchar *m, WebKitWebPolicyDecision *p, Client *c); static gboolean decidewindow(WebKitWebView *v, WebKitWebFrame *f, WebKitNetworkRequest *r, WebKitWebNavigationAction *n, WebKitWebPolicyDecision *p, Client *c); +static gboolean decidenavigation(WebKitWebView *v, WebKitWebFrame *f, WebKitNetworkRequest *r, WebKitWebNavigationAction *n, WebKitWebPolicyDecision *d, Client *c); static void destroyclient(Client *c); static void destroywin(GtkWidget* w, Client *c); static void die(char *str); @@ -207,6 +209,31 @@ return FALSE; } +gboolean +decidenavigation(WebKitWebView *v, WebKitWebFrame *f, WebKitNetworkRequest *r, WebKitWebNavigationAction *n, WebKitWebPolicyDecision *d, Client *c) +{ + gboolean retval = FALSE; + const gchar *uri = webkit_network_request_get_uri(r); + gchar *scheme = g_uri_parse_scheme(uri); + if(scheme && (g_ascii_strcasecmp(scheme, "http") != 0) && (g_ascii_strcasecmp(scheme, "https") != 0)) { + gchar *key = g_strdup_printf("/desktop/gnome/url-handlers/%s/command", scheme); + GConfClient *settings = gconf_client_get_default(); + gchar *browser = gconf_client_get_string(settings, key, NULL); + if(browser) { + gchar *command = g_strdup_printf(browser, uri); + if(g_spawn_command_line_async(command, NULL) != FALSE) { + webkit_web_policy_decision_ignore(d); + retval = TRUE; + } + g_free(command); + g_free(browser); + } + g_free(key); + g_free(scheme); + } + return retval; +} + void destroyclient(Client *c) { Client *p; @@ -460,6 +487,7 @@ g_signal_connect(G_OBJECT(c->view), "create-web-view", G_CALLBACK(createwindow), c); g_signal_connect(G_OBJECT(c->view), "new-window-policy-decision-requested", G_CALLBACK(decidewindow), c); g_signal_connect(G_OBJECT(c->view), "mime-type-policy-decision-requested", G_CALLBACK(decidedownload), c); + g_signal_connect(G_OBJECT(c->view), "navigation-policy-decision-requested", G_CALLBACK(decidenavigation), c); g_signal_connect(G_OBJECT(c->view), "window-object-cleared", G_CALLBACK(windowobjectcleared), c); g_signal_connect(G_OBJECT(c->view), "notify::load-status", G_CALLBACK(loadstatuschange), c); g_signal_connect(G_OBJECT(c->view), "notify::progress", G_CALLBACK(progresschange), c);