Added scheme_handler callback.
authorTom Adams <tom@holizz.com>
Sun, 19 Jul 2009 18:24:43 +0000 (19:24 +0100)
committerTom Adams <tom@holizz.com>
Sun, 19 Jul 2009 18:32:04 +0000 (19:32 +0100)
Conflicts:

uzbl.c
uzbl.h

README
examples/config/uzbl/config
examples/data/uzbl/scripts/scheme.py [new file with mode: 0755]
uzbl.c
uzbl.h

diff --git a/README b/README
index d73bab1..73b99fd 100644 (file)
--- a/README
+++ b/README
@@ -198,6 +198,7 @@ Some variables have callback functions which will get called after setting the v
   - download_handler
   - cookie_handler
   - new_window: handler to execute to invoke new uzbl window (TODO better name)
+  - scheme_handler: handler to be executed for all URIs not of the http/https/data schema
   - fifo_dir: location to store fifo's
   - socket_dir: location to store sockets
   - http_debug: http debug mode (value 0-3)
index ab2cf7f..04e482b 100644 (file)
@@ -9,6 +9,7 @@ set download_handler = spawn $XDG_DATA_HOME/uzbl/scripts/download.sh
 set cookie_handler   = spawn $XDG_DATA_HOME/uzbl/scripts/cookies.py
 #set new_window      = sh 'echo uri "$8" > $4' # open in same window
 set new_window       = sh 'uzbl -u $8' # equivalent to the default behaviour
+set scheme_handler   = spawn $XDG_DATA_HOME/uzbl/scripts/scheme.py
 set load_start_handler = set status_message = <span foreground="khaki">wait</span>
 set load_commit_handler = set status_message = <span foreground="green">recv</span>
 set load_finish_handler = set status_message = <span foreground="gold">done</span>
diff --git a/examples/data/uzbl/scripts/scheme.py b/examples/data/uzbl/scripts/scheme.py
new file mode 100755 (executable)
index 0000000..c09db08
--- /dev/null
@@ -0,0 +1,14 @@
+#!/usr/bin/env python
+
+import os, subprocess, sys, urlparse
+
+if __name__ == '__main__':
+    uri = sys.argv[8]
+    u = urlparse.urlparse(uri)
+    if u.scheme == 'mailto':
+        subprocess.call(['xterm', '-e', 'mail %s' % u.path])
+    elif u.scheme == 'xmpp':
+        subprocess.call(['gajim-remote', 'open_chat', uri])
+    #elif u.scheme == 'git':
+        #os.chdir(os.path.expanduser('~/src'))
+        #subprocess.call(['git', 'clone', uri])
diff --git a/uzbl.c b/uzbl.c
index 64bdf15..bb8c152 100644 (file)
--- a/uzbl.c
+++ b/uzbl.c
@@ -135,6 +135,7 @@ const struct {
     { "download_handler",    PTR_V(uzbl.behave.download_handler,    STR,  1,   NULL)},
     { "cookie_handler",      PTR_V(uzbl.behave.cookie_handler,      STR,  1,   cmd_cookie_handler)},
     { "new_window",          PTR_V(uzbl.behave.new_window,          STR,  1,   NULL)},
+    { "scheme_handler",      PTR_V(uzbl.behave.scheme_handler,      STR,  1,   NULL)},
     { "fifo_dir",            PTR_V(uzbl.behave.fifo_dir,            STR,  1,   cmd_fifo_dir)},
     { "socket_dir",          PTR_V(uzbl.behave.socket_dir,          STR,  1,   cmd_socket_dir)},
     { "http_debug",          PTR_V(uzbl.behave.http_debug,          INT,  1,   cmd_http_debug)},
@@ -520,6 +521,32 @@ catch_alrm(int s) {
 /* --- CALLBACKS --- */
 
 gboolean
+navigation_decision_cb (WebKitWebView *web_view, WebKitWebFrame *frame, WebKitNetworkRequest *request, WebKitWebNavigationAction *navigation_action, WebKitWebPolicyDecision *policy_decision, gpointer user_data) {
+    (void) web_view;
+    (void) frame;
+    (void) navigation_action;
+    (void) policy_decision;
+    (void) user_data;
+    const gchar* uri = webkit_network_request_get_uri (request);
+    if (uzbl.state.verbose)
+        printf("Navigation requested -> %s\n", uri);
+    SoupURI *suri = soup_uri_new(uri);
+    if (suri && strcmp (suri->scheme, "http") &&
+                strcmp (suri->scheme, "https") &&
+                strcmp (suri->scheme, "data") &&
+                strcmp (suri->scheme, "about")) {
+        if (uzbl.behave.scheme_handler) {
+            GString *s = g_string_new ("");
+            g_string_printf(s, "'%s'", uri);
+            run_handler(uzbl.behave.scheme_handler, s->str);
+            webkit_web_policy_decision_ignore(policy_decision);
+            return TRUE;
+        }
+    }
+    return FALSE;
+}
+
+gboolean
 new_window_cb (WebKitWebView *web_view, WebKitWebFrame *frame, WebKitNetworkRequest *request, WebKitWebNavigationAction *navigation_action, WebKitWebPolicyDecision *policy_decision, gpointer user_data) {
     (void) web_view;
     (void) frame;
@@ -2168,6 +2195,7 @@ create_browser () {
     g_signal_connect (G_OBJECT (g->web_view), "load-finished", G_CALLBACK (log_history_cb), g->web_view);
     g_signal_connect (G_OBJECT (g->web_view), "load-finished", G_CALLBACK (load_finish_cb), g->web_view);
     g_signal_connect (G_OBJECT (g->web_view), "hovering-over-link", G_CALLBACK (link_hover_cb), g->web_view);
+    g_signal_connect (G_OBJECT (g->web_view), "navigation-policy-decision-requested", G_CALLBACK (navigation_decision_cb), g->web_view);
     g_signal_connect (G_OBJECT (g->web_view), "new-window-policy-decision-requested", G_CALLBACK (new_window_cb), g->web_view);
     g_signal_connect (G_OBJECT (g->web_view), "download-requested", G_CALLBACK (download_cb), g->web_view);
     g_signal_connect (G_OBJECT (g->web_view), "create-web-view", G_CALLBACK (create_web_view_cb), g->web_view);
diff --git a/uzbl.h b/uzbl.h
index 130f33f..55243ee 100644 (file)
--- a/uzbl.h
+++ b/uzbl.h
@@ -116,6 +116,7 @@ typedef struct {
     gchar*   download_handler;
     gchar*   cookie_handler;
     gchar*   new_window;
+    gchar*   scheme_handler;
     gboolean always_insert_mode;
     gboolean show_status;
     gboolean insert_mode;
@@ -241,6 +242,9 @@ void
 print(WebKitWebView *page, GArray *argv, GString *result);
 
 gboolean
+navigation_decision_cb (WebKitWebView *web_view, WebKitWebFrame *frame, WebKitNetworkRequest *request, WebKitWebNavigationAction *navigation_action, WebKitWebPolicyDecision *policy_decision, gpointer user_data);
+
+gboolean
 new_window_cb (WebKitWebView *web_view, WebKitWebFrame *frame, WebKitNetworkRequest *request, WebKitWebNavigationAction *navigation_action, WebKitWebPolicyDecision *policy_decision, gpointer user_data);
 
 gboolean