Merge commit 'Dieterbe/experimental' into experimental
authoruranther <jwheaton@purdue.edu>
Fri, 10 Jul 2009 17:44:10 +0000 (13:44 -0400)
committeruranther <jwheaton@purdue.edu>
Fri, 10 Jul 2009 17:44:10 +0000 (13:44 -0400)
.gitignore
Makefile
README
docs/TODO
tests/Makefile [new file with mode: 0644]
tests/test-1.c [new file with mode: 0644]
uzbl.c
uzbl.h

index abbd2d7..2efc5e1 100644 (file)
@@ -1,5 +1,6 @@
 uzbl
 uzblctrl
+uzbl.o
 *~
 tags
 examples/data
index 4e9d282..960ea20 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -4,8 +4,47 @@ all: uzbl uzblctrl
 
 PREFIX?=$(DESTDIR)/usr
 
-test: uzbl
-       ./uzbl --uri http://www.uzbl.org --verbose
+# When compiling unit tests, compile uzbl as a library first
+test: uzbl.o
+       $(CC) -DUZBL_LIBRARY -shared -Wl uzbl.o -o ./tests/libuzbl.so
+       cd ./tests/; $(MAKE)
+
+# test-report: run tests in subdirs and generate report
+# perf-report: run tests in subdirs with -m perf and generate report
+# full-report: like test-report: with -m perf and -m slow
+#test-report perf-report full-report:    ${TEST_PROGS}
+#      @test -z "${TEST_PROGS}" || { \
+#          case $@ in \
+#          test-report) test_options="-k";; \
+#          perf-report) test_options="-k -m=perf";; \
+#          full-report) test_options="-k -m=perf -m=slow";; \
+#          esac ; \
+#          if test -z "$$GTESTER_LOGDIR" ; then  \
+#            ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \
+#          elif test -n "${TEST_PROGS}" ; then \
+#            ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \
+#          fi ; \
+#        }
+#      @ ignore_logdir=true ; \
+#          if test -z "$$GTESTER_LOGDIR" ; then \
+#            GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \
+#            ignore_logdir=false ; \
+#          fi ; \
+#          for subdir in $(SUBDIRS) . ; do \
+#            test "$$subdir" = "." -o "$$subdir" = "po" || \
+#            ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \
+#          done ; \
+#          $$ignore_logdir || { \
+#            echo '<?xml version="1.0"?>' > $@.xml ; \
+#            echo '<report-collection>'  >> $@.xml ; \
+#            for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \
+#              sed '1,1s/^<?xml\b[^>?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \
+#            done ; \
+#            echo >> $@.xml ; \
+#            echo '</report-collection>' >> $@.xml ; \
+#            rm -rf "$$GTESTER_LOGDIR"/ ; \
+#            ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \
+#          }
 
 test-dev: uzbl
        XDG_DATA_HOME=./examples/data               XDG_CONFIG_HOME=./examples/config               ./uzbl --uri http://www.uzbl.org --verbose
@@ -17,6 +56,8 @@ test-share: uzbl
 clean:
        rm -f uzbl
        rm -f uzblctrl
+       rm -f uzbl.o
+       cd ./tests/; $(MAKE) clean
 
 install:
        install -d $(PREFIX)/bin
diff --git a/README b/README
index 47b17b9..2e2be35 100644 (file)
--- a/README
+++ b/README
@@ -308,10 +308,4 @@ Custom, userdefined scripts (`spawn foo bar`) get first the arguments as specifi
 
 
 ### BUGS
-known bugs:
-
-* Segfaults when using zoom commands (happens when max zoom already reached?).
-
 Please report new issues @ uzbl.org/bugs
-
-
index 00166eb..343a344 100644 (file)
--- a/docs/TODO
+++ b/docs/TODO
@@ -38,6 +38,7 @@ More or less in order of importance/urgency
 * proxy_url is not a good var name. it's not a url.
 * regex style page searching? so you can do 'or' and 'and' things. flags like case sensitive etc.
 * check for real command name, not just the first letter.
+* Allow the spacebar to be binded to a command
 * let users attach handlers to the most common events/signals in uzbl.
   great use case: automatically calling formfiller for certain sites
 * document:
diff --git a/tests/Makefile b/tests/Makefile
new file mode 100644 (file)
index 0000000..43a878b
--- /dev/null
@@ -0,0 +1,14 @@
+CFLAGS:=-std=c99 -I$(shell pwd)/../ -L$(shell pwd) -luzbl $(shell pkg-config --cflags gtk+-2.0 webkit-1.0 libsoup-2.4) -ggdb -Wall -W -DARCH="\"$(shell uname -m)\"" -DG_ERRORCHECK_MUTEXES -DCOMMIT="\"$(shell git log | head -n1 | sed "s/.* //")\"" $(CPPFLAGS)
+LDFLAGS:=$(shell pkg-config --libs gtk+-2.0 webkit-1.0 libsoup-2.4) -pthread $(LDFLAGS)
+
+GTESTER:=gtester
+GTESTER_REPORT:=gtester-report
+
+TEST_PROGS:=test-1
+
+all: $(TEST_PROGS)
+       LD_LIBRARY_PATH="$LD_LIBRARY_PATH:." $(GTESTER) --verbose $(TEST_PROGS)
+
+clean:
+       rm -f $(TEST_PROGS)
+       rm -f libuzbl.so
diff --git a/tests/test-1.c b/tests/test-1.c
new file mode 100644 (file)
index 0000000..3a94c9b
--- /dev/null
@@ -0,0 +1,48 @@
+/* -*- c-basic-offset: 4; -*- */
+#define _POSIX_SOURCE
+
+#include <gtk/gtk.h>
+#include <gdk/gdkx.h>
+#include <gdk/gdkkeysyms.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/un.h>
+#include <sys/utsname.h>
+#include <sys/time.h>
+#include <webkit/webkit.h>
+#include <libsoup/soup.h>
+#include <JavaScriptCore/JavaScript.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+
+#include <uzbl.h>
+#include <config.h>
+
+Uzbl uzbl;
+
+static void
+test_URI (void) {
+    setup_scanner();
+    uzbl.state.uri = g_strdup("http://www.uzbl.org");
+    g_assert_cmpstr(expand_template("URI", FALSE), ==, uzbl.state.uri);
+    g_free(uzbl.state.uri);
+}
+
+int
+main (int argc, char *argv[]) {
+    g_type_init();
+    g_test_init(&argc, &argv, NULL);
+
+    g_test_add_func("/test-1/URI", test_URI);
+
+    return g_test_run();
+}
+
+/* vi: set et ts=4: */
diff --git a/uzbl.c b/uzbl.c
index ed9c4be..dd94c20 100644 (file)
--- a/uzbl.c
+++ b/uzbl.c
 #include "uzbl.h"
 #include "config.h"
 
-static Uzbl uzbl;
-
-
+Uzbl uzbl;
 
 /* commandline arguments (set initial values for the state variables) */
-static const 
+const 
 GOptionEntry entries[] =
 {
     { "uri",     'u', 0, G_OPTION_ARG_STRING, &uzbl.state.uri,
@@ -80,6 +78,8 @@ GOptionEntry entries[] =
 
 /* associate command names to their properties */
 typedef const struct {
+    /* TODO: Make this ambiguous void **ptr into a union { char *char_p; int *int_p; float *float_p; } val;
+             the PTR() macro is kind of preventing this change at the moment. */
     void **ptr;
     int type;
     int dump;
@@ -181,7 +181,7 @@ const struct {
 
 
 /* construct a hash from the var_name_to_ptr array for quick access */
-static void
+void
 make_var_to_name_hash() {
     uzbl.comm.proto_var = g_hash_table_new(g_str_hash, g_str_equal);
     while(n2v_p->name) {
@@ -191,9 +191,8 @@ make_var_to_name_hash() {
 }
 
 /* --- UTILITY FUNCTIONS --- */
-
 enum {EXP_ERR, EXP_SIMPLE_VAR, EXP_BRACED_VAR, EXP_EXPR, EXP_JS};
-static guint
+guint
 get_exp_type(gchar *s) {
     /* variables */
     if(*(s+1) == '(')
@@ -212,7 +211,7 @@ return EXP_ERR;
  * recurse == 1: don't expand '@(command)@'
  * recurse == 2: don't expand '@<java script>@'
  */
-static gchar *
+gchar *
 expand(char *s, guint recurse) {
     uzbl_cmdprop *c;
     guint etype;
@@ -282,9 +281,10 @@ expand(char *s, guint recurse) {
                         if(c->type == TYPE_STR)
                             g_string_append(buf, (gchar *)*c->ptr);
                         else if(c->type == TYPE_INT) {
-                            char *b = itos((int)*c->ptr);
-                            g_string_append(buf, b);
-                            g_free(b);
+                            g_string_append_printf(buf, "%d", (int)*c->ptr);
+                        }
+                        else if(c->type == TYPE_FLOAT) {
+                            g_string_append_printf(buf, "%f", *(float *)c->ptr);
                         }
                     }
                     if(etype == EXP_SIMPLE_VAR)
@@ -341,13 +341,13 @@ itos(int val) {
     return g_strdup(tmp);
 }
 
-static gchar*
+gchar*
 strfree(gchar *str) { g_free(str); return NULL; }  // for freeing & setting to null in one go
 
-static gchar*
+gchar*
 argv_idx(const GArray *a, const guint idx) { return g_array_index(a, gchar*, idx); }
 
-static char *
+char *
 str_replace (const char* search, const char* replace, const char* string) {
     gchar **buf;
     char *ret;
@@ -359,7 +359,7 @@ str_replace (const char* search, const char* replace, const char* string) {
     return ret;
 }
 
-static GArray*
+GArray*
 read_file_by_line (gchar *path) {
     GIOChannel *chan = NULL;
     gchar *readbuf = NULL;
@@ -385,8 +385,8 @@ read_file_by_line (gchar *path) {
     return lines;
 }
 
-static
-gchar* parseenv (char* string) {
+gchar* 
+parseenv (char* string) {
     extern char** environ;
     gchar* tmpstr = NULL;
     int i = 0;
@@ -411,7 +411,7 @@ gchar* parseenv (char* string) {
     return string;
 }
 
-static sigfunc*
+sigfunc*
 setup_signal(int signr, sigfunc *shandler) {
     struct sigaction nh, oh;
 
@@ -425,7 +425,7 @@ setup_signal(int signr, sigfunc *shandler) {
     return NULL;
 }
 
-static void
+void
 clean_up(void) {
     if (uzbl.behave.fifo_dir)
         unlink (uzbl.comm.fifo_path);
@@ -436,13 +436,14 @@ clean_up(void) {
     g_string_free(uzbl.state.keycmd, TRUE);
     g_hash_table_destroy(uzbl.bindings);
     g_hash_table_destroy(uzbl.behave.commands);
+    g_scanner_destroy(uzbl.scan);
 }
 
 /* used for html_mode_timeout 
  * be sure to extend this function to use
  * more timers if needed in other places
 */
-static void
+void
 set_timeout(int seconds) {
     struct itimerval t;
     memset(&t, 0, sizeof t);
@@ -454,20 +455,20 @@ set_timeout(int seconds) {
 
 /* --- SIGNAL HANDLER --- */
 
-static void
+void
 catch_sigterm(int s) {
     (void) s;
     clean_up();
 }
 
-static void
+void
 catch_sigint(int s) {
     (void) s;
     clean_up();
     exit(EXIT_SUCCESS);
 }
 
-static void
+void
 catch_alrm(int s) {
     (void) s;
 
@@ -478,7 +479,7 @@ catch_alrm(int s) {
 
 /* --- CALLBACKS --- */
 
-static gboolean
+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;
@@ -492,7 +493,7 @@ new_window_cb (WebKitWebView *web_view, WebKitWebFrame *frame, WebKitNetworkRequ
     return (FALSE);
 }
 
-static gboolean
+gboolean
 mime_policy_cb(WebKitWebView *web_view, WebKitWebFrame *frame, WebKitNetworkRequest *request, gchar *mime_type,  WebKitWebPolicyDecision *policy_decision, gpointer user_data) {
     (void) frame;
     (void) request;
@@ -525,7 +526,7 @@ create_web_view_cb (WebKitWebView  *web_view, WebKitWebFrame *frame, gpointer us
     return (NULL);
 }
 
-static gboolean
+gboolean
 download_cb (WebKitWebView *web_view, GObject *download, gpointer user_data) {
     (void) web_view;
     (void) user_data;
@@ -540,7 +541,7 @@ download_cb (WebKitWebView *web_view, GObject *download, gpointer user_data) {
 }
 
 /* scroll a bar in a given direction */
-static void
+void
 scroll (GtkAdjustment* bar, GArray *argv) {
     gchar *end;
     gdouble max_value;
@@ -562,32 +563,32 @@ scroll (GtkAdjustment* bar, GArray *argv) {
     gtk_adjustment_set_value (bar, value);
 }
 
-static void
+void
 scroll_begin(WebKitWebView* page, GArray *argv, GString *result) {
     (void) page; (void) argv; (void) result;
     gtk_adjustment_set_value (uzbl.gui.bar_v, gtk_adjustment_get_lower(uzbl.gui.bar_v));
 }
 
-static void
+void
 scroll_end(WebKitWebView* page, GArray *argv, GString *result) {
     (void) page; (void) argv; (void) result;
     gtk_adjustment_set_value (uzbl.gui.bar_v, gtk_adjustment_get_upper(uzbl.gui.bar_v) -
                               gtk_adjustment_get_page_size(uzbl.gui.bar_v));
 }
 
-static void
+void
 scroll_vert(WebKitWebView* page, GArray *argv, GString *result) {
     (void) page; (void) result;
     scroll(uzbl.gui.bar_v, argv);
 }
 
-static void
+void
 scroll_horz(WebKitWebView* page, GArray *argv, GString *result) {
     (void) page; (void) result;
     scroll(uzbl.gui.bar_h, argv);
 }
 
-static void
+void
 cmd_set_status() {
     if (!uzbl.behave.show_status) {
         gtk_widget_hide(uzbl.gui.mainbar);
@@ -597,16 +598,16 @@ cmd_set_status() {
     update_title();
 }
 
-static void
+void
 toggle_zoom_type (WebKitWebView* page, GArray *argv, GString *result) {
     (void)page;
     (void)argv;
     (void)result;
-
     webkit_web_view_set_full_content_zoom (page, !webkit_web_view_get_full_content_zoom (page));
 }
 
-static void
+void
 toggle_status_cb (WebKitWebView* page, GArray *argv, GString *result) {
     (void)page;
     (void)argv;
@@ -621,7 +622,7 @@ toggle_status_cb (WebKitWebView* page, GArray *argv, GString *result) {
     update_title();
 }
 
-static void
+void
 link_hover_cb (WebKitWebView* page, const gchar* title, const gchar* link, gpointer data) {
     (void) page;
     (void) title;
@@ -635,7 +636,7 @@ link_hover_cb (WebKitWebView* page, const gchar* title, const gchar* link, gpoin
     update_title();
 }
 
-static void
+void
 title_change_cb (WebKitWebView* web_view, GParamSpec param_spec) {
     (void) web_view;
     (void) param_spec;
@@ -646,7 +647,7 @@ title_change_cb (WebKitWebView* web_view, GParamSpec param_spec) {
     update_title();
 }
 
-static void
+void
 progress_change_cb (WebKitWebView* page, gint progress, gpointer data) {
     (void) page;
     (void) data;
@@ -654,7 +655,7 @@ progress_change_cb (WebKitWebView* page, gint progress, gpointer data) {
     update_title();
 }
 
-static void
+void
 load_finish_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data) {
     (void) page;
     (void) frame;
@@ -663,7 +664,7 @@ load_finish_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data) {
         run_handler(uzbl.behave.load_finish_handler, "");
 }
 
-static void
+void
 load_start_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data) {
     (void) page;
     (void) frame;
@@ -674,7 +675,7 @@ load_start_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data) {
         run_handler(uzbl.behave.load_start_handler, "");
 }
 
-static void
+void
 load_commit_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data) {
     (void) page;
     (void) data;
@@ -689,29 +690,31 @@ load_commit_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data) {
         run_handler(uzbl.behave.load_commit_handler, uzbl.state.uri);
 }
 
-static void
+void
 destroy_cb (GtkWidget* widget, gpointer data) {
     (void) widget;
     (void) data;
     gtk_main_quit ();
 }
 
-static void
+void
 log_history_cb () {
    if (uzbl.behave.history_handler) {
-       time_t rawtime;
-       struct tm * timeinfo;
-       char date [80];
-       time ( &rawtime );
-       timeinfo = localtime ( &rawtime );
-       strftime (date, 80, "\"%Y-%m-%d %H:%M:%S\"", timeinfo);
+       GTimeVal the_time;
+       gchar *date;
+       
+       g_get_current_time(&the_time);
+       /* no need to wrap this string with quotes since it contains no spaces.
+          format is like: 2009-06-26T20:02:05.262864Z */
+       date = g_time_val_to_iso8601(&the_time);
        run_handler(uzbl.behave.history_handler, date);
+       g_free(date);
    }
 }
 
 
 /* VIEW funcs (little webkit wrappers) */
-#define VIEWFUNC(name) static void view_##name(WebKitWebView *page, GArray *argv, GString *result){(void)argv; (void)result; webkit_web_view_##name(page);}
+#define VIEWFUNC(name) void view_##name(WebKitWebView *page, GArray *argv, GString *result){(void)argv; (void)result; webkit_web_view_##name(page);}
 VIEWFUNC(reload)
 VIEWFUNC(reload_bypass_cache)
 VIEWFUNC(stop_loading)
@@ -722,7 +725,7 @@ VIEWFUNC(go_forward)
 #undef VIEWFUNC
 
 /* -- command to callback/function map for things we cannot attach to any signals */
-static struct {char *key; CommandInfo value;} cmdlist[] =
+struct {char *key; CommandInfo value;} cmdlist[] =
 {   /* key                   function      no_split      */
     { "back",               {view_go_back, 0}              },
     { "forward",            {view_go_forward, 0}           },
@@ -745,6 +748,7 @@ static struct {char *key; CommandInfo value;} cmdlist[] =
     { "sh",                 {spawn_sh, 0}                  },
     { "sync_sh",            {spawn_sh_sync, 0}             }, // needed for cookie handler
     { "exit",               {close_uzbl, 0}                },
+    { "quit",               {close_uzbl, 0}                },
     { "search",             {search_forward_text, TRUE}    },
     { "search_reverse",     {search_reverse_text, TRUE}    },
     { "dehilight",          {dehilight, 0}                 },
@@ -760,7 +764,7 @@ static struct {char *key; CommandInfo value;} cmdlist[] =
     { "print",              {print, TRUE}                  }
 };
 
-static void
+void
 commands_hash(void)
 {
     unsigned int i;
@@ -794,12 +798,12 @@ new_action(const gchar *name, const gchar *param) {
     return action;
 }
 
-static bool
+bool
 file_exists (const char * filename) {
     return (access(filename, F_OK) == 0);
 }
 
-static void
+void
 set_var(WebKitWebView *page, GArray *argv, GString *result) {
     (void) page; (void) result;
     gchar **split = g_strsplit(argv_idx(argv, 0), "=", 2);
@@ -811,7 +815,7 @@ set_var(WebKitWebView *page, GArray *argv, GString *result) {
     g_strfreev(split);
 }
 
-static void
+void
 print(WebKitWebView *page, GArray *argv, GString *result) {
     (void) page; (void) result;
     gchar* buf;
@@ -821,7 +825,7 @@ print(WebKitWebView *page, GArray *argv, GString *result) {
     g_free(buf);
 }
 
-static void
+void
 act_bind(WebKitWebView *page, GArray *argv, GString *result) {
     (void) page; (void) result;
     gchar **split = g_strsplit(argv_idx(argv, 0), " = ", 2);
@@ -832,12 +836,12 @@ act_bind(WebKitWebView *page, GArray *argv, GString *result) {
 }
 
 
-static void
+void
 act_dump_config() {
     dump_config();
 }
 
-static void
+void
 toggle_insert_mode(WebKitWebView *page, GArray *argv, GString *result) {
     (void) page; (void) result;
 
@@ -854,7 +858,7 @@ toggle_insert_mode(WebKitWebView *page, GArray *argv, GString *result) {
     update_title();
 }
 
-static void
+void
 load_uri (WebKitWebView *web_view, GArray *argv, GString *result) {
     (void) result;
 
@@ -872,10 +876,9 @@ load_uri (WebKitWebView *web_view, GArray *argv, GString *result) {
     }
 }
 
-
 /* Javascript*/
 
-static JSValueRef
+JSValueRef
 js_run_command (JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject,
                 size_t argumentCount, const JSValueRef arguments[],
                 JSValueRef* exception) {
@@ -903,11 +906,11 @@ js_run_command (JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject,
     return JSValueMakeString(ctx, js_result_string);
 }
 
-static JSStaticFunction js_static_functions[] = {
+JSStaticFunction js_static_functions[] = {
     {"run", js_run_command, kJSPropertyAttributeNone},
 };
 
-static void
+void
 js_init() {
     /* This function creates the class and its definition, only once */
     if (!uzbl.js.initialized) {
@@ -920,7 +923,7 @@ js_init() {
 }
 
 
-static void 
+void 
 eval_js(WebKitWebView * web_view, gchar *script, GString *result) {
     WebKitWebFrame *frame;
     JSGlobalContextRef context;
@@ -967,14 +970,13 @@ eval_js(WebKitWebView * web_view, gchar *script, GString *result) {
     JSStringRelease(js_script);
 }
 
-static void
+void
 run_js (WebKitWebView * web_view, GArray *argv, GString *result) {
-
     if (argv_idx(argv, 0))
         eval_js(web_view, argv_idx(argv, 0), result);
 }
 
-static void
+void
 run_external_js (WebKitWebView * web_view, GArray *argv, GString *result) {
     (void) result;
     if (argv_idx(argv, 0)) {
@@ -1008,7 +1010,7 @@ run_external_js (WebKitWebView * web_view, GArray *argv, GString *result) {
     }
 }
 
-static void
+void
 search_text (WebKitWebView *page, GArray *argv, const gboolean forward) {
     if (argv_idx(argv, 0) && (*argv_idx(argv, 0) != '\0')) {
         if (g_strcmp0 (uzbl.state.searchtx, argv_idx(argv, 0)) != 0) {
@@ -1026,26 +1028,26 @@ search_text (WebKitWebView *page, GArray *argv, const gboolean forward) {
     }
 }
 
-static void
+void
 search_forward_text (WebKitWebView *page, GArray *argv, GString *result) {
     (void) result;
     search_text(page, argv, TRUE);
 }
 
-static void
+void
 search_reverse_text (WebKitWebView *page, GArray *argv, GString *result) {
     (void) result;
     search_text(page, argv, FALSE);
 }
 
-static void
+void
 dehilight (WebKitWebView *page, GArray *argv, GString *result) {
     (void) argv; (void) result;
     webkit_web_view_set_highlight_text_matches (page, FALSE);
 }
 
 
-static void
+void
 new_window_load_uri (const gchar * uri) {
     GString* to_execute = g_string_new ("");
     g_string_append_printf (to_execute, "%s --uri '%s'", uzbl.state.executable_path, uri);
@@ -1064,7 +1066,7 @@ new_window_load_uri (const gchar * uri) {
     g_string_free (to_execute, TRUE);
 }
 
-static void
+void
 chain (WebKitWebView *page, GArray *argv, GString *result) {
     (void) page; (void) result;
     gchar *a = NULL;
@@ -1072,12 +1074,13 @@ chain (WebKitWebView *page, GArray *argv, GString *result) {
     guint i = 0;    
     while ((a = argv_idx(argv, i++))) {
         parts = g_strsplit (a, " ", 2);
-        parse_command(parts[0], parts[1], result);
+        if (parts[0])
+          parse_command(parts[0], parts[1], result);
         g_strfreev (parts);
     }
 }
 
-static void
+void
 keycmd (WebKitWebView *page, GArray *argv, GString *result) {
     (void)page;
     (void)argv;
@@ -1087,7 +1090,7 @@ keycmd (WebKitWebView *page, GArray *argv, GString *result) {
     update_title();
 }
 
-static void
+void
 keycmd_nl (WebKitWebView *page, GArray *argv, GString *result) {
     (void)page;
     (void)argv;
@@ -1097,7 +1100,7 @@ keycmd_nl (WebKitWebView *page, GArray *argv, GString *result) {
     update_title();
 }
 
-static void
+void
 keycmd_bs (WebKitWebView *page, GArray *argv, GString *result) {
     gchar *prev;
     (void)page;
@@ -1109,7 +1112,7 @@ keycmd_bs (WebKitWebView *page, GArray *argv, GString *result) {
     update_title();
 }
 
-static void
+void
 close_uzbl (WebKitWebView *page, GArray *argv, GString *result) {
     (void)page;
     (void)argv;
@@ -1118,7 +1121,7 @@ close_uzbl (WebKitWebView *page, GArray *argv, GString *result) {
 }
 
 /* --Statusbar functions-- */
-static char*
+char*
 build_progressbar_ascii(int percent) {
    int width=uzbl.gui.sbar.progress_w;
    int i;
@@ -1137,7 +1140,7 @@ build_progressbar_ascii(int percent) {
    return g_string_free(bar, FALSE);
 }
 
-static void
+void
 setup_scanner() {
      const GScannerConfig scan_config = {
              (
@@ -1192,7 +1195,7 @@ setup_scanner() {
      }
 }
 
-static gchar *
+gchar *
 expand_template(const char *template, gboolean escape_markup) {
      if(!template) return NULL;
 
@@ -1210,14 +1213,14 @@ expand_template(const char *template, gboolean escape_markup) {
              switch(sym) {
                  case SYM_URI:
                      if(escape_markup) {
-                         buf = uzbl.state.uri?
-                             g_markup_printf_escaped("%s", uzbl.state.uri):g_strdup("");
+                         buf = uzbl.state.uri ?
+                             g_markup_printf_escaped("%s", uzbl.state.uri) : g_strdup("");
                          g_string_append(ret, buf);
                          g_free(buf);
                      }
                      else
-                         g_string_append(ret, uzbl.state.uri?
-                                 uzbl.state.uri:g_strdup(""));
+                         g_string_append(ret, uzbl.state.uri ?
+                                 uzbl.state.uri : g_strdup(""));
                      break;
                  case SYM_LOADPRGS:
                      buf = itos(uzbl.gui.sbar.load_progress);
@@ -1231,51 +1234,51 @@ expand_template(const char *template, gboolean escape_markup) {
                      break;
                  case SYM_TITLE:
                      if(escape_markup) {
-                         buf = uzbl.gui.main_title?
-                             g_markup_printf_escaped("%s", uzbl.gui.main_title):g_strdup("");
+                         buf = uzbl.gui.main_title ?
+                             g_markup_printf_escaped("%s", uzbl.gui.main_title) : g_strdup("");
                          g_string_append(ret, buf);
                          g_free(buf);
                      }
                      else
-                         g_string_append(ret, uzbl.gui.main_title?
-                                 uzbl.gui.main_title:g_strdup(""));
+                         g_string_append(ret, uzbl.gui.main_title ?
+                                 uzbl.gui.main_title : "");
                      break;
                  case SYM_SELECTED_URI:
                      if(escape_markup) {
-                         buf = uzbl.state.selected_url?
-                             g_markup_printf_escaped("%s", uzbl.state.selected_url):g_strdup("");
+                         buf = uzbl.state.selected_url ?
+                             g_markup_printf_escaped("%s", uzbl.state.selected_url) : g_strdup("");
                          g_string_append(ret, buf);
                          g_free(buf);
                      }
                      else
-                         g_string_append(ret, uzbl.state.selected_url?
-                                 uzbl.state.selected_url:g_strdup(""));
+                         g_string_append(ret, uzbl.state.selected_url ?
+                                 uzbl.state.selected_url : "");
                      break;
                  case SYM_NAME:
                      buf = itos(uzbl.xwin);
                      g_string_append(ret,
-                             uzbl.state.instance_name?uzbl.state.instance_name:buf);
+                             uzbl.state.instance_name ? uzbl.state.instance_name : buf);
                      g_free(buf);
                      break;
                  case SYM_KEYCMD:
                      if(escape_markup) {
-                         buf = uzbl.state.keycmd->str?
-                             g_markup_printf_escaped("%s", uzbl.state.keycmd->str):g_strdup("");
+                         buf = uzbl.state.keycmd->str ?
+                             g_markup_printf_escaped("%s", uzbl.state.keycmd->str) : g_strdup("");
                          g_string_append(ret, buf);
                          g_free(buf);
                      }
                      else
-                         g_string_append(ret, uzbl.state.keycmd->str?
-                                 uzbl.state.keycmd->str:g_strdup(""));
+                         g_string_append(ret, uzbl.state.keycmd->str ?
+                                 uzbl.state.keycmd->str : "");
                      break;
                  case SYM_MODE:
                      g_string_append(ret,
-                             uzbl.behave.insert_mode?
-                             uzbl.behave.insert_indicator:uzbl.behave.cmd_indicator);
+                             uzbl.behave.insert_mode ?
+                             uzbl.behave.insert_indicator : uzbl.behave.cmd_indicator);
                      break;
                  case SYM_MSG:
                      g_string_append(ret,
-                             uzbl.gui.sbar.msg?uzbl.gui.sbar.msg:"");
+                             uzbl.gui.sbar.msg ? uzbl.gui.sbar.msg : "");
                      break;
                      /* useragent syms */
                  case SYM_WK_MAJ:
@@ -1324,9 +1327,7 @@ expand_template(const char *template, gboolean escape_markup) {
              }
          }
          else if(token == G_TOKEN_INT) {
-             buf = itos(g_scanner_cur_value(uzbl.scan).v_int);
-             g_string_append(ret, buf);
-             g_free(buf);
+             g_string_append_printf(ret, "%lu", g_scanner_cur_value(uzbl.scan).v_int);
          }
          else if(token == G_TOKEN_IDENTIFIER) {
              g_string_append(ret, (gchar *)g_scanner_cur_value(uzbl.scan).v_identifier);
@@ -1334,20 +1335,26 @@ expand_template(const char *template, gboolean escape_markup) {
          else if(token == G_TOKEN_CHAR) {
              g_string_append_c(ret, (gchar)g_scanner_cur_value(uzbl.scan).v_char);
          }
+         else if(token == G_TOKEN_ERROR) {
+             g_scanner_error(uzbl.scan, "Token error in template ('%s') at line %d, column %d.", 
+                                        template, 
+                                        g_scanner_cur_line(uzbl.scan), 
+                                        g_scanner_cur_position(uzbl.scan));
+         }
      }
 
      return g_string_free(ret, FALSE);
 }
 /* --End Statusbar functions-- */
 
-static void
+void
 sharg_append(GArray *a, const gchar *str) {
     const gchar *s = (str ? str : "");
     g_array_append_val(a, s);
 }
 
 // make sure that the args string you pass can properly be interpreted (eg properly escaped against whitespace, quotes etc)
-static gboolean
+gboolean
 run_command (const gchar *command, const guint npre, const gchar **args,
              const gboolean sync, char **output_stdout) {
    //command <uzbl conf> <uzbl pid> <uzbl win id> <uzbl fifo file> <uzbl socket file> [args]
@@ -1404,7 +1411,7 @@ run_command (const gchar *command, const guint npre, const gchar **args,
     return result;
 }
 
-static gchar**
+gchar**
 split_quoted(const gchar* src, const gboolean unquote) {
     /* split on unquoted space, return array of strings;
        remove a layer of quotes and backslashes if unquote */
@@ -1441,7 +1448,7 @@ split_quoted(const gchar* src, const gboolean unquote) {
     return ret;
 }
 
-static void
+void
 spawn(WebKitWebView *web_view, GArray *argv, GString *result) {
     (void)web_view; (void)result;
     //TODO: allow more control over argument order so that users can have some arguments before the default ones from run_command, and some after
@@ -1449,7 +1456,7 @@ spawn(WebKitWebView *web_view, GArray *argv, GString *result) {
         run_command(argv_idx(argv, 0), 0, ((const gchar **) (argv->data + sizeof(gchar*))), FALSE, NULL);
 }
 
-static void
+void
 spawn_sync(WebKitWebView *web_view, GArray *argv, GString *result) {
     (void)web_view; (void)result;
     
@@ -1458,7 +1465,7 @@ spawn_sync(WebKitWebView *web_view, GArray *argv, GString *result) {
                     TRUE, &uzbl.comm.sync_stdout);
 }
 
-static void
+void
 spawn_sh(WebKitWebView *web_view, GArray *argv, GString *result) {
     (void)web_view; (void)result;
     if (!uzbl.behave.shell_cmd) {
@@ -1479,7 +1486,7 @@ spawn_sh(WebKitWebView *web_view, GArray *argv, GString *result) {
     g_strfreev (cmd);
 }
 
-static void
+void
 spawn_sh_sync(WebKitWebView *web_view, GArray *argv, GString *result) {
     (void)web_view; (void)result;
     if (!uzbl.behave.shell_cmd) {
@@ -1501,7 +1508,7 @@ spawn_sh_sync(WebKitWebView *web_view, GArray *argv, GString *result) {
     g_strfreev (cmd);
 }
 
-static void
+void
 parse_command(const char *cmd, const char *param, GString *result) {
     CommandInfo *c;
 
@@ -1535,7 +1542,7 @@ parse_command(const char *cmd, const char *param, GString *result) {
         g_printerr ("command \"%s\" not understood. ignoring.\n", cmd);
 }
 
-static void
+void
 set_proxy_url() {
     SoupURI *suri;
 
@@ -1554,7 +1561,7 @@ set_proxy_url() {
     return;
 }
 
-static void
+void
 set_icon() {
     if(file_exists(uzbl.gui.icon)) {
         if (uzbl.gui.main_window)
@@ -1562,10 +1569,9 @@ set_icon() {
     } else {
         g_printerr ("Icon \"%s\" not found. ignoring.\n", uzbl.gui.icon);
     }
-    g_free (uzbl.gui.icon);
 }
 
-static void
+void
 cmd_load_uri() {
     GArray *a = g_array_new (TRUE, FALSE, sizeof(gchar*));
     g_array_append_val (a, uzbl.state.uri);
@@ -1573,26 +1579,26 @@ cmd_load_uri() {
     g_array_free (a, TRUE);
 }
 
-static void 
+void 
 cmd_always_insert_mode() {
     uzbl.behave.insert_mode =
         uzbl.behave.always_insert_mode ?  TRUE : FALSE;
     update_title();
 }
 
-static void
+void
 cmd_max_conns() {
     g_object_set(G_OBJECT(uzbl.net.soup_session),
             SOUP_SESSION_MAX_CONNS, uzbl.net.max_conns, NULL);
 }
 
-static void
+void
 cmd_max_conns_host() {
     g_object_set(G_OBJECT(uzbl.net.soup_session),
             SOUP_SESSION_MAX_CONNS_PER_HOST, uzbl.net.max_conns_host, NULL);
 }
 
-static void
+void
 cmd_http_debug() {
     soup_session_remove_feature
         (uzbl.net.soup_session, SOUP_SESSION_FEATURE(uzbl.net.soup_logger));
@@ -1604,12 +1610,12 @@ cmd_http_debug() {
             SOUP_SESSION_FEATURE(uzbl.net.soup_logger));
 }
 
-static WebKitWebSettings*
+WebKitWebSettings*
 view_settings() {
     return webkit_web_view_get_settings(uzbl.gui.web_view);
 }
 
-static void
+void
 cmd_font_size() {
     WebKitWebSettings *ws = view_settings();
     if (uzbl.behave.font_size > 0) {
@@ -1625,91 +1631,91 @@ cmd_font_size() {
     }
 }
 
-static void
+void
 cmd_zoom_level() {
     webkit_web_view_set_zoom_level (uzbl.gui.web_view, uzbl.behave.zoom_level);
 }
 
-static void
+void
 cmd_disable_plugins() {
     g_object_set (G_OBJECT(view_settings()), "enable-plugins", 
             !uzbl.behave.disable_plugins, NULL);
 }
 
-static void
+void
 cmd_disable_scripts() {
     g_object_set (G_OBJECT(view_settings()), "enable-scripts",
             !uzbl.behave.disable_scripts, NULL);
 }
 
-static void
+void
 cmd_minimum_font_size() {
     g_object_set (G_OBJECT(view_settings()), "minimum-font-size",
             uzbl.behave.minimum_font_size, NULL);
 }
-static void
+void
 cmd_autoload_img() {
     g_object_set (G_OBJECT(view_settings()), "auto-load-images",
             uzbl.behave.autoload_img, NULL);
 }
 
 
-static void
+void
 cmd_autoshrink_img() {
     g_object_set (G_OBJECT(view_settings()), "auto-shrink-images",
             uzbl.behave.autoshrink_img, NULL);
 }
 
 
-static void
+void
 cmd_enable_spellcheck() {
     g_object_set (G_OBJECT(view_settings()), "enable-spell-checking",
             uzbl.behave.enable_spellcheck, NULL);
 }
 
-static void
+void
 cmd_enable_private() {
     g_object_set (G_OBJECT(view_settings()), "enable-private-browsing",
             uzbl.behave.enable_private, NULL);
 }
 
-static void
+void
 cmd_print_bg() {
     g_object_set (G_OBJECT(view_settings()), "print-backgrounds",
             uzbl.behave.print_bg, NULL);
 }
 
-static void 
+void 
 cmd_style_uri() {
     g_object_set (G_OBJECT(view_settings()), "user-stylesheet-uri",
             uzbl.behave.style_uri, NULL);
 }
 
-static void 
+void 
 cmd_resizable_txt() {
     g_object_set (G_OBJECT(view_settings()), "resizable-text-areas",
             uzbl.behave.resizable_txt, NULL);
 }
 
-static void 
+void 
 cmd_default_encoding() {
     g_object_set (G_OBJECT(view_settings()), "default-encoding",
             uzbl.behave.default_encoding, NULL);
 }
 
-static void 
+void 
 cmd_enforce_96dpi() {
     g_object_set (G_OBJECT(view_settings()), "enforce-96-dpi",
             uzbl.behave.enforce_96dpi, NULL);
 }
 
-static void 
+void 
 cmd_caret_browsing() {
     g_object_set (G_OBJECT(view_settings()), "enable-caret-browsing",
             uzbl.behave.caret_browsing, NULL);
 }
 
-static void
+void
 cmd_cookie_handler() {
     gchar **split = g_strsplit(uzbl.behave.cookie_handler, " ", 2);
     /* pitfall: doesn't handle chain actions; must the sync_ action manually */
@@ -1722,17 +1728,17 @@ cmd_cookie_handler() {
     g_strfreev (split);
 }
 
-static void
+void
 cmd_fifo_dir() {
     uzbl.behave.fifo_dir = init_fifo(uzbl.behave.fifo_dir);
 }
 
-static void
+void
 cmd_socket_dir() {
     uzbl.behave.socket_dir = init_socket(uzbl.behave.socket_dir);
 }
 
-static void
+void
 cmd_inject_html() {
     if(uzbl.behave.inject_html) {
         webkit_web_view_load_html_string (uzbl.gui.web_view,
@@ -1740,7 +1746,7 @@ cmd_inject_html() {
     }
 }
 
-static void
+void
 cmd_modkey() {
     int i;
     char *buf;
@@ -1758,7 +1764,7 @@ cmd_modkey() {
     }
 }
 
-static void
+void
 cmd_useragent() {
     if (*uzbl.net.useragent == ' ') {
         g_free (uzbl.net.useragent);
@@ -1772,7 +1778,7 @@ cmd_useragent() {
     }
 }
 
-static void
+void
 move_statusbar() {
     gtk_widget_ref(uzbl.gui.scrolled_win);
     gtk_widget_ref(uzbl.gui.mainbar);
@@ -1793,7 +1799,7 @@ move_statusbar() {
     return;
 }
 
-static gboolean
+gboolean
 set_var_value(gchar *name, gchar *val) {
     uzbl_cmdprop *c = NULL;
     char *endp = NULL;
@@ -1823,7 +1829,7 @@ set_var_value(gchar *name, gchar *val) {
     return TRUE;
 }
 
-static void
+void
 render_html() {
     Behaviour *b = &uzbl.behave;
 
@@ -1836,7 +1842,7 @@ render_html() {
 }
 
 enum {M_CMD, M_HTML};
-static void
+void
 parse_cmd_line(const char *ctl_line, GString *result) {
     Behaviour *b = &uzbl.behave;
     size_t len=0;
@@ -1876,7 +1882,7 @@ parse_cmd_line(const char *ctl_line, GString *result) {
     }
 }
 
-static gchar*
+gchar*
 build_stream_name(int type, const gchar* dir) {
     char *xwin_str = NULL;
     State *s = &uzbl.state;
@@ -1896,7 +1902,7 @@ build_stream_name(int type, const gchar* dir) {
     return str;
 }
 
-static gboolean
+gboolean
 control_fifo(GIOChannel *gio, GIOCondition condition) {
     if (uzbl.state.verbose)
         printf("triggered\n");
@@ -1922,20 +1928,8 @@ control_fifo(GIOChannel *gio, GIOCondition condition) {
     return TRUE;
 }
 
-static gchar*
+gchar*
 init_fifo(gchar *dir) { /* return dir or, on error, free dir and return NULL */
-    if (uzbl.comm.fifo_path) { /* get rid of the old fifo if one exists */
-        if (unlink(uzbl.comm.fifo_path) == -1)
-            g_warning ("Fifo: Can't unlink old fifo at %s\n", uzbl.comm.fifo_path);
-        g_free(uzbl.comm.fifo_path);
-        uzbl.comm.fifo_path = NULL;
-    }
-
-    if (*dir == ' ') { /* space unsets the variable */
-        g_free (dir);
-        return NULL;
-    }
-
     GIOChannel *chan = NULL;
     GError *error = NULL;
     gchar *path = build_stream_name(FIFO, dir);
@@ -1962,7 +1956,7 @@ init_fifo(gchar *dir) { /* return dir or, on error, free dir and return NULL */
     return NULL;
 }
 
-static gboolean
+gboolean
 control_stdin(GIOChannel *gio, GIOCondition condition) {
     (void) condition;
     gchar *ctl_line = NULL;
@@ -1978,7 +1972,7 @@ control_stdin(GIOChannel *gio, GIOCondition condition) {
     return TRUE;
 }
 
-static void
+void
 create_stdin () {
     GIOChannel *chan = NULL;
     GError *error = NULL;
@@ -1997,7 +1991,7 @@ create_stdin () {
     if (error) g_error_free (error);
 }
 
-static gboolean
+gboolean
 control_socket(GIOChannel *chan) {
     struct sockaddr_un remote;
     unsigned int t = sizeof(remote);
@@ -2015,7 +2009,7 @@ control_socket(GIOChannel *chan) {
     return TRUE;
 }
 
-static gboolean
+gboolean
 control_client_socket(GIOChannel *clientchan) {
     char *ctl_line;
     GString *result = g_string_new("");
@@ -2051,7 +2045,7 @@ control_client_socket(GIOChannel *clientchan) {
     return TRUE;
 }
 
-static gchar*
+gchar*
 init_socket(gchar *dir) { /* return dir or, on error, free dir and return NULL */
     if (uzbl.comm.socket_path) { /* remove an existing socket should one exist */
         if (unlink(uzbl.comm.socket_path) == -1)
@@ -2100,7 +2094,7 @@ init_socket(gchar *dir) { /* return dir or, on error, free dir and return NULL *
  it will probably improve performance if we would "cache" the processed variant, but for now it works well enough...
 */
 // this function may be called very early when the templates are not set (yet), hence the checks
-static void
+void
 update_title (void) {
     Behaviour *b = &uzbl.behave;
     gchar *parsed;
@@ -2136,7 +2130,7 @@ update_title (void) {
     }
 }
 
-static gboolean
+gboolean
 key_press_cb (GtkWidget* window, GdkEventKey* event)
 {
     //TRUE to stop other handlers from being invoked for the event. FALSE to propagate the event further.
@@ -2194,7 +2188,7 @@ key_press_cb (GtkWidget* window, GdkEventKey* event)
     return TRUE;
 }
 
-static void
+void
 run_keycmd(const gboolean key_ret) {
     /* run the keycmd immediately if it isn't incremental and doesn't take args */
     Action *act;
@@ -2232,7 +2226,7 @@ run_keycmd(const gboolean key_ret) {
     g_string_free (short_keys_inc, TRUE);
 }
 
-static void
+void
 exec_paramcmd(const Action *act, const guint i) {
     GString *parampart = g_string_new (uzbl.state.keycmd->str);
     GString *actionname = g_string_new ("");
@@ -2249,7 +2243,7 @@ exec_paramcmd(const Action *act, const guint i) {
 }
 
 
-static GtkWidget*
+GtkWidget*
 create_browser () {
     GUI *g = &uzbl.gui;
 
@@ -2275,7 +2269,7 @@ create_browser () {
     return scrolled_window;
 }
 
-static GtkWidget*
+GtkWidget*
 create_mainbar () {
     GUI *g = &uzbl.gui;
 
@@ -2294,8 +2288,8 @@ create_mainbar () {
     return g->mainbar;
 }
 
-static
-GtkWidget* create_window () {
+GtkWidget*
+create_window () {
     GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
     gtk_window_set_default_size (GTK_WINDOW (window), 800, 600);
     gtk_widget_set_name (window, "Uzbl browser");
@@ -2305,8 +2299,8 @@ GtkWidget* create_window () {
     return window;
 }
 
-static
-GtkPlug* create_plug () {
+GtkPlug* 
+create_plug () {
     GtkPlug* plug = GTK_PLUG (gtk_plug_new (uzbl.state.socket_id));
     g_signal_connect (G_OBJECT (plug), "destroy", G_CALLBACK (destroy_cb), NULL);
     g_signal_connect (G_OBJECT (plug), "key-press-event", G_CALLBACK (key_press_cb), NULL);
@@ -2315,7 +2309,7 @@ GtkPlug* create_plug () {
 }
 
 
-static gchar**
+gchar**
 inject_handler_args(const gchar *actname, const gchar *origargs, const gchar *newargs) {
     /*
       If actname is one that calls an external command, this function will inject
@@ -2323,7 +2317,7 @@ inject_handler_args(const gchar *actname, const gchar *origargs, const gchar *ne
       come become after the body of the script (in sh) or after the name of
       the command to execute (in spawn).
       i.e. sh <body> <userargs> becomes sh <body> <ARGS> <userargs> and
-      span <command> <userargs> becomes spawn <command> <ARGS> <userargs>.
+      spawn <command> <userargs> becomes spawn <command> <ARGS> <userargs>.
 
       The return value consist of two strings: the action (sh, ...) and its args.
 
@@ -2331,6 +2325,7 @@ inject_handler_args(const gchar *actname, const gchar *origargs, const gchar *ne
       gets duplicated.
     */
     GArray *rets = g_array_new(TRUE, FALSE, sizeof(gchar*));
+    /* Arrr! Here be memory leaks */
     gchar *actdup = g_strdup(actname);
     g_array_append_val(rets, actdup);
 
@@ -2357,7 +2352,7 @@ inject_handler_args(const gchar *actname, const gchar *origargs, const gchar *ne
     return (gchar**)g_array_free(rets, FALSE);
 }
 
-static void
+void
 run_handler (const gchar *act, const gchar *args) {
     /* Consider this code a temporary hack to make the handlers usable.
        In practice, all this splicing, injection, and reconstruction is
@@ -2416,7 +2411,7 @@ run_handler (const gchar *act, const gchar *args) {
     g_strfreev(parts);
 }
 
-static void
+void
 add_binding (const gchar *key, const gchar *act) {
     char **parts = g_strsplit(act, " ", 2);
     Action *action;
@@ -2435,7 +2430,7 @@ add_binding (const gchar *key, const gchar *act) {
     g_strfreev(parts);
 }
 
-static gchar*
+gchar*
 get_xdg_var (XDG_Var xdg) {
     const gchar* actual_value = getenv (xdg.environmental);
     const gchar* home         = getenv ("HOME");
@@ -2454,7 +2449,7 @@ get_xdg_var (XDG_Var xdg) {
     return return_value;
 }
 
-static gchar*
+gchar*
 find_xdg_file (int xdg_type, char* filename) {
     /* xdg_type = 0 => config
        xdg_type = 1 => data
@@ -2487,7 +2482,7 @@ find_xdg_file (int xdg_type, char* filename) {
         return NULL;
     }
 }
-static void
+void
 settings_init () {
     State *s = &uzbl.state;
     Network *n = &uzbl.net;
@@ -2524,7 +2519,7 @@ settings_init () {
     g_signal_connect_after(n->soup_session, "request-started", G_CALLBACK(handle_cookies), NULL);
 }
 
-static void handle_cookies (SoupSession *session, SoupMessage *msg, gpointer user_data){
+void handle_cookies (SoupSession *session, SoupMessage *msg, gpointer user_data){
     (void) session;
     (void) user_data;
     if (!uzbl.behave.cookie_handler)
@@ -2547,7 +2542,7 @@ static void handle_cookies (SoupSession *session, SoupMessage *msg, gpointer use
     g_string_free(s, TRUE);
 }
 
-static void
+void
 save_cookies (SoupMessage *msg, gpointer user_data){
     (void) user_data;
     GSList *ck;
@@ -2565,14 +2560,14 @@ save_cookies (SoupMessage *msg, gpointer user_data){
 }
 
 /* --- WEBINSPECTOR --- */
-static void
+void
 hide_window_cb(GtkWidget *widget, gpointer data) {
     (void) data;
 
     gtk_widget_hide(widget);
 }
 
-static WebKitWebView*
+WebKitWebView*
 create_inspector_cb (WebKitWebInspector* web_inspector, WebKitWebView* page, gpointer data){
     (void) data;
     (void) page;
@@ -2601,7 +2596,7 @@ create_inspector_cb (WebKitWebInspector* web_inspector, WebKitWebView* page, gpo
     return WEBKIT_WEB_VIEW(new_web_view);
 }
 
-static gboolean
+gboolean
 inspector_show_window_cb (WebKitWebInspector* inspector){
     (void) inspector;
     gtk_widget_show(uzbl.gui.inspector_window);
@@ -2609,37 +2604,37 @@ inspector_show_window_cb (WebKitWebInspector* inspector){
 }
 
 /* TODO: Add variables and code to make use of these functions */
-static gboolean
+gboolean
 inspector_close_window_cb (WebKitWebInspector* inspector){
     (void) inspector;
     return TRUE;
 }
 
-static gboolean
+gboolean
 inspector_attach_window_cb (WebKitWebInspector* inspector){
     (void) inspector;
     return FALSE;
 }
 
-static gboolean
+gboolean
 inspector_detach_window_cb (WebKitWebInspector* inspector){
     (void) inspector;
     return FALSE;
 }
 
-static gboolean
+gboolean
 inspector_uri_changed_cb (WebKitWebInspector* inspector){
     (void) inspector;
     return FALSE;
 }
 
-static gboolean
+gboolean
 inspector_inspector_destroyed_cb (WebKitWebInspector* inspector){
     (void) inspector;
     return FALSE;
 }
 
-static void
+void
 set_up_inspector() {
     GUI *g = &uzbl.gui;
     WebKitWebSettings *settings = view_settings();
@@ -2656,7 +2651,7 @@ set_up_inspector() {
     g_signal_connect (G_OBJECT (g->inspector), "notify::inspected-uri", G_CALLBACK (inspector_uri_changed_cb), NULL);
 }
 
-static void
+void
 dump_var_hash(gpointer k, gpointer v, gpointer ud) {
     (void) ud;
     uzbl_cmdprop *c = v;
@@ -2665,12 +2660,14 @@ dump_var_hash(gpointer k, gpointer v, gpointer ud) {
         return;
 
     if(c->type == TYPE_STR)
-        printf("set %s = %s\n", (char *)k, *c->ptr?(char *)*c->ptr:" ");
+        printf("set %s = %s\n", (char *)k, *c->ptr ? (char *)*c->ptr : " ");
     else if(c->type == TYPE_INT)
         printf("set %s = %d\n", (char *)k, (int)*c->ptr);
+    else if(c->type == TYPE_FLOAT)
+        printf("set %s = %f\n", (char *)k, *(float *)c->ptr);
 }
 
-static void
+void
 dump_key_hash(gpointer k, gpointer v, gpointer ud) {
     (void) ud;
     Action *a = v;
@@ -2679,12 +2676,13 @@ dump_key_hash(gpointer k, gpointer v, gpointer ud) {
             (char *)a->name, a->param?(char *)a->param:"");
 }
 
-static void
+void
 dump_config() {
     g_hash_table_foreach(uzbl.comm.proto_var, dump_var_hash, NULL);
     g_hash_table_foreach(uzbl.bindings, dump_key_hash, NULL);
 }
 
+#ifndef UZBL_LIBRARY
 /** -- MAIN -- **/
 int
 main (int argc, char* argv[]) {
@@ -2801,5 +2799,6 @@ main (int argc, char* argv[]) {
 
     return EXIT_SUCCESS;
 }
+#endif
 
 /* vi: set et ts=4: */
diff --git a/uzbl.h b/uzbl.h
index d19ceb3..b40684a 100644 (file)
--- a/uzbl.h
+++ b/uzbl.h
@@ -224,79 +224,82 @@ XDG_Var XDG[] =
 };
 
 /* Functions */
-static void
+gchar *
+expand_template(const char *template, gboolean escape_markup);
+
+void
 setup_scanner();
 
 char *
 itos(int val);
 
-static char *
+char *
 str_replace (const char* search, const char* replace, const char* string);
 
-static GArray*
+GArray*
 read_file_by_line (gchar *path);
 
-static
-gchar* parseenv (char* string);
+gchar*
+parseenv (char* string);
 
-static void
+void
 clean_up(void);
 
-static void
+void
 catch_sigterm(int s);
 
-static sigfunc *
+sigfunc *
 setup_signal(int signe, sigfunc *shandler);
 
-static gboolean
+gboolean
 set_var_value(gchar *name, gchar *val);
 
-static void
+void
 print(WebKitWebView *page, GArray *argv, GString *result);
 
-static gboolean
+gboolean
 new_window_cb (WebKitWebView *web_view, WebKitWebFrame *frame, WebKitNetworkRequest *request, WebKitWebNavigationAction *navigation_action, WebKitWebPolicyDecision *policy_decision, gpointer user_data);
 
-static gboolean
+gboolean
 mime_policy_cb(WebKitWebView *web_view, WebKitWebFrame *frame, WebKitNetworkRequest *request, gchar *mime_type,  WebKitWebPolicyDecision *policy_decision, gpointer user_data);
 
 WebKitWebView*
 create_web_view_cb (WebKitWebView  *web_view, WebKitWebFrame *frame, gpointer user_data);
 
-static gboolean
+gboolean
 download_cb (WebKitWebView *web_view, GObject *download, gpointer user_data);
 
-static void
+void
 toggle_zoom_type (WebKitWebView* page, GArray *argv, GString *result);
 
-static void
+void
 toggle_status_cb (WebKitWebView* page, GArray *argv, GString *result);
 
-static void
+void
 link_hover_cb (WebKitWebView* page, const gchar* title, const gchar* link, gpointer data);
 
-static void
+void
 title_change_cb (WebKitWebView* web_view, GParamSpec param_spec);
 
-static void
+void
 progress_change_cb (WebKitWebView* page, gint progress, gpointer data);
 
-static void
+void
 load_commit_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data);
 
-static void
+void
 load_start_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data);
 
-static void
+void
 load_finish_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data);
 
-static void
+void
 destroy_cb (GtkWidget* widget, gpointer data);
 
-static void
+void
 log_history_cb ();
 
-static void
+void
 commands_hash(void);
 
 void
@@ -305,171 +308,170 @@ free_action(gpointer act);
 Action*
 new_action(const gchar *name, const gchar *param);
 
-static bool
+bool
 file_exists (const char * filename);
 
-static void
+void
 toggle_insert_mode(WebKitWebView *page, GArray *argv, GString *result);
 
-static void
+void
 load_uri (WebKitWebView * web_view, GArray *argv, GString *result);
 
-static void
+void
 new_window_load_uri (const gchar * uri);
 
-static void
+void
 chain (WebKitWebView *page, GArray *argv, GString *result);
 
-static void
+void
 keycmd (WebKitWebView *page, GArray *argv, GString *result);
 
-static void
+void
 keycmd_nl (WebKitWebView *page, GArray *argv, GString *result);
 
-static void
+void
 keycmd_bs (WebKitWebView *page, GArray *argv, GString *result);
 
-static void
+void
 close_uzbl (WebKitWebView *page, GArray *argv, GString *result);
 
-static gboolean
+gboolean
 run_command(const gchar *command, const guint npre,
             const gchar **args, const gboolean sync, char **output_stdout);
 
-static void
+void
 spawn(WebKitWebView *web_view, GArray *argv, GString *result);
 
-static void
+void
 spawn_sh(WebKitWebView *web_view, GArray *argv, GString *result);
 
-static void
+void
 spawn_sync(WebKitWebView *web_view, GArray *argv, GString *result);
 
-static void
+void
 spawn_sh_sync(WebKitWebView *web_view, GArray *argv, GString *result);
 
-static void
+void
 parse_command(const char *cmd, const char *param, GString *result);
 
-static void
+void
 parse_cmd_line(const char *ctl_line, GString *result);
 
-static gchar*
+gchar*
 build_stream_name(int type, const gchar *dir);
 
-static gboolean
+gboolean
 control_fifo(GIOChannel *gio, GIOCondition condition);
 
-static gchar*
+gchar*
 init_fifo(gchar *dir);
 
-static gboolean
+gboolean
 control_stdin(GIOChannel *gio, GIOCondition condition);
 
-static void
+void
 create_stdin();
 
-static gchar*
+gchar*
 init_socket(gchar *dir);
 
-static gboolean
+gboolean
 control_socket(GIOChannel *chan);
 
-static gboolean
+gboolean
 control_client_socket(GIOChannel *chan);
 
-static void
+void
 update_title (void);
 
-static gboolean
+gboolean
 key_press_cb (GtkWidget* window, GdkEventKey* event);
 
-static void
+void
 run_keycmd(const gboolean key_ret);
 
-static void
+void
 exec_paramcmd(const Action* act, const guint i);
 
-static GtkWidget*
+GtkWidget*
 create_browser ();
 
-static GtkWidget*
+GtkWidget*
 create_mainbar ();
 
-static
-GtkWidget* create_window ();
+GtkWidget*
+create_window ();
 
-static
-GtkPlug* create_plug ();
+GtkPlug* 
+create_plug ();
 
-static void
+void
 run_handler (const gchar *act, const gchar *args);
 
-static void
+void
 add_binding (const gchar *key, const gchar *act);
 
-static gchar*
+gchar*
 get_xdg_var (XDG_Var xdg);
 
-static gchar*
+gchar*
 find_xdg_file (int xdg_type, char* filename);
 
-static void
+void
 settings_init ();
 
-static void
+void
 search_text (WebKitWebView *page, GArray *argv, const gboolean forward);
 
-static void
+void
 search_forward_text (WebKitWebView *page, GArray *argv, GString *result);
 
-static void
+void
 search_reverse_text (WebKitWebView *page, GArray *argv, GString *result);
 
-static void
+void
 dehilight (WebKitWebView *page, GArray *argv, GString *result);
 
-static void
+void
 run_js (WebKitWebView * web_view, GArray *argv, GString *result);
 
-static void
+void
 run_external_js (WebKitWebView * web_view, GArray *argv, GString *result);
 
-static void
+void
 eval_js(WebKitWebView * web_view, gchar *script, GString *result);
 
-static void handle_cookies (SoupSession *session,
+void handle_cookies (SoupSession *session,
                             SoupMessage *msg,
                             gpointer     user_data);
-static void
+void
 save_cookies (SoupMessage *msg,
                 gpointer     user_data);
 
-static void
+void
 set_var(WebKitWebView *page, GArray *argv, GString *result);
 
-static void
+void
 act_bind(WebKitWebView *page, GArray *argv, GString *result);
 
-static void
+void
 act_dump_config();
 
-static void
+void
 render_html();
 
-static void
+void
 set_timeout(int seconds);
 
-static void
+void
 dump_var_hash(gpointer k, gpointer v, gpointer ud);
 
-static void
+void
 dump_key_hash(gpointer k, gpointer v, gpointer ud);
 
-static void
+void
 dump_config();
 
-
 typedef void (*Command)(WebKitWebView*, GArray *argv, GString *result);
 typedef struct {
     Command function;
@@ -477,96 +479,96 @@ typedef struct {
 } CommandInfo;
 
 /* Command callbacks */
-static void
+void
 cmd_load_uri();
 
-static void
+void
 cmd_set_status();
 
-static void
+void
 set_proxy_url();
 
-static void
+void
 set_icon();
 
-static void
+void
 cmd_cookie_handler();
 
-static void
+void
 move_statusbar();
 
-static void
+void
 cmd_always_insert_mode();
 
-static void
+void
 cmd_http_debug();
 
-static void
+void
 cmd_max_conns();
 
-static void
+void
 cmd_max_conns_host();
 
 /* exported WebKitWebSettings properties */
 
-static void
+void
 cmd_font_size();
 
-static void
+void
 cmd_zoom_level();
 
-static void
+void
 cmd_disable_plugins();
 
-static void
+void
 cmd_disable_scripts();
 
-static void
+void
 cmd_minimum_font_size();
 
-static void
+void
 cmd_fifo_dir();
 
-static void
+void
 cmd_socket_dir();
 
-static void
+void
 cmd_modkey();
 
-static void
+void
 cmd_useragent() ;
 
-static void
+void
 cmd_autoload_img();
 
-static void
+void
 cmd_autoshrink_img();
 
-static void
+void
 cmd_enable_spellcheck();
 
-static void
+void
 cmd_enable_private();
 
-static void
+void
 cmd_print_bg();
 
-static void 
+void 
 cmd_style_uri();
 
-static void 
+void 
 cmd_resizable_txt();
 
-static void 
+void 
 cmd_default_encoding();
 
-static void 
+void 
 cmd_enforce_96dpi();
 
-static void
+void
 cmd_inject_html();
 
-static void 
+void 
 cmd_caret_browsing();
 
 /* vi: set et ts=4: */