From fdbc0adb186d0abe0de1e0164c5de9d533748bdd Mon Sep 17 00:00:00 2001 From: Tom Adams Date: Wed, 22 Jul 2009 00:18:57 +0100 Subject: [PATCH] Only navigate to URI if scheme_handler doesn't print "USED". --- examples/data/uzbl/scripts/scheme.py | 22 +++++++++++++---- uzbl.c | 43 +++++++++++++++++++++++++++++----- uzbl.h | 3 +++ 3 files changed, 57 insertions(+), 11 deletions(-) diff --git a/examples/data/uzbl/scripts/scheme.py b/examples/data/uzbl/scripts/scheme.py index c09db08..dde9ba1 100755 --- a/examples/data/uzbl/scripts/scheme.py +++ b/examples/data/uzbl/scripts/scheme.py @@ -2,13 +2,25 @@ import os, subprocess, sys, urlparse +def detach_open(cmd): + # Thanks to the vast knowledge of Laurence Withers (lwithers) and this message: + # http://mail.python.org/pipermail/python-list/2006-November/587523.html + if not os.fork(): + null = os.open(os.devnull,os.O_WRONLY) + for i in range(3): os.dup2(null,i) + os.close(null) + subprocess.Popen(cmd) + if __name__ == '__main__': uri = sys.argv[8] u = urlparse.urlparse(uri) if u.scheme == 'mailto': - subprocess.call(['xterm', '-e', 'mail %s' % u.path]) + detach_open(['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]) + detach_open(['gajim-remote', 'open_chat', uri]) + elif u.scheme == 'git': + detach_open(['git', 'clone', uri], cwd=os.path.expanduser('~/src')) + else: + print 'DIY!' + exit() + print 'USED' diff --git a/uzbl.c b/uzbl.c index 1a5094e..381222d 100644 --- a/uzbl.c +++ b/uzbl.c @@ -135,7 +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)}, + { "scheme_handler", PTR_V(uzbl.behave.scheme_handler, STR, 1, cmd_scheme_handler)}, { "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)}, @@ -525,12 +525,15 @@ navigation_decision_cb (WebKitWebView *web_view, WebKitWebFrame *frame, WebKitNe (void) web_view; (void) frame; (void) navigation_action; - (void) policy_decision; (void) user_data; + const gchar* uri = webkit_network_request_get_uri (request); + SoupURI *suri = soup_uri_new(uri); + gboolean decision_made = FALSE; + 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") && @@ -539,12 +542,27 @@ navigation_decision_cb (WebKitWebView *web_view, WebKitWebFrame *frame, WebKitNe 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; + + if(uzbl.comm.sync_stdout && strcmp (uzbl.comm.sync_stdout, "") != 0) { + char *p = strchr(uzbl.comm.sync_stdout, '\n' ); + if ( p != NULL ) *p = '\0'; + if (!strcmp(uzbl.comm.sync_stdout, "USED")) { + webkit_web_policy_decision_ignore(policy_decision); + decision_made = TRUE; + } + } + if (uzbl.comm.sync_stdout) + uzbl.comm.sync_stdout = strfree(uzbl.comm.sync_stdout); + + g_string_free(s, TRUE); } } - return FALSE; + if (!decision_made) + webkit_web_policy_decision_use(policy_decision); + + return TRUE; } gboolean @@ -1641,6 +1659,19 @@ cmd_cookie_handler() { } void +cmd_scheme_handler() { + gchar **split = g_strsplit(uzbl.behave.scheme_handler, " ", 2); + /* pitfall: doesn't handle chain actions; must the sync_ action manually */ + if ((g_strcmp0(split[0], "sh") == 0) || + (g_strcmp0(split[0], "spawn") == 0)) { + g_free (uzbl.behave.scheme_handler); + uzbl.behave.scheme_handler = + g_strdup_printf("sync_%s %s", split[0], split[1]); + } + g_strfreev (split); +} + +void cmd_fifo_dir() { uzbl.behave.fifo_dir = init_fifo(uzbl.behave.fifo_dir); } diff --git a/uzbl.h b/uzbl.h index 55243ee..b0a0171 100644 --- a/uzbl.h +++ b/uzbl.h @@ -506,6 +506,9 @@ void cmd_cookie_handler(); void +cmd_scheme_handler(); + +void move_statusbar(); void -- 1.7.9.5