aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--AUTHORS18
-rw-r--r--CHECKLIST26
-rw-r--r--HOWTO3
-rw-r--r--INSTALLING23
-rw-r--r--Makefile17
-rw-r--r--README50
-rw-r--r--TODO21
-rw-r--r--examples/bookmarks4
-rw-r--r--examples/configs/sampleconfig43
-rw-r--r--examples/configs/sampleconfig-dev (renamed from sampleconfig)14
-rwxr-xr-xexamples/scripts/download.sh2
-rwxr-xr-xexamples/scripts/history.sh4
-rwxr-xr-xexamples/scripts/insert_bookmark.sh16
-rwxr-xr-xexamples/scripts/load_url_from_bookmarks.sh12
-rwxr-xr-xexamples/scripts/load_url_from_history.sh6
-rw-r--r--extra/download.sh3
-rw-r--r--extra/insert_bookmark.sh11
-rw-r--r--extra/load_url_from_bookmarks.sh4
-rwxr-xr-xextra/load_url_from_history.sh4
-rw-r--r--uzbl.c513
21 files changed, 599 insertions, 197 deletions
diff --git a/.gitignore b/.gitignore
index d6df486..5dc9796 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-uzbl
+uzbl \ No newline at end of file
diff --git a/AUTHORS b/AUTHORS
index fc49fea..b57d253 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,10 +1,14 @@
-Original code taken from webkit example application whis is copyrighted 2006, 2007 Apple Inc and 2007 Alp Toker <alp@atoker.com>
-enhancements to form uzbl made by Dieter Plaetinck.
-Michael Walker (Barrucadu) <mike@barrucadu.co.uk> - Original threaded FIFO interface. Command adding methods.
+Developers:
+ Dieter Plaetinck (Dieter@be) <dieter@plaetinck.be>
+ Dusan Popovic (dusanx)
+ Michael Walker (Barrucadu) <mike@barrucadu.co.uk>
-Zane Ashby (HashBox) <http://demonastery.org> - Rewrote FIFO interface. Fixed various bugs.
+Contributors:
+ Zane Ashby (HashBox) - Rewrote FIFO interface. Fixed various bugs.
+ (sentientswitch) - Cleaned up code. Added some commands.
-(sentientswitch) - Cleaned up code. Added some commands.
-
-Dusan Popovic (dusanx) - Key handling and stuff
+Originaly based on http://trac.webkit.org/browser/trunk/WebKitTools/GtkLauncher/main.c
+Which is copyrighted:
+2006, 2007 Apple Inc
+2007 Alp Toker <alp@atoker.com>
diff --git a/CHECKLIST b/CHECKLIST
new file mode 100644
index 0000000..8dfe47f
--- /dev/null
+++ b/CHECKLIST
@@ -0,0 +1,26 @@
+This file contains all things that are/should be working.
+When you have been working on something, use this list to verify that you did not cause any regressions (things that worked before, but got broken).
+Also, when you finish a new feature, add it to this list so that everyone knows about it, can play with it, and can test it.
+
+Also testers and interested people can use this list to see what uzbl is about, and report problems if they find items listed here that do not work.
+
+* commandline switches --uri "http://.." and --config should behave as expected
+* --help and -? should show help
+* config loading: loading of settings, bindings and handlers from config file
+* fifo: type this in your shell after starting uzbl:
+ echo 'uri http://www...' > <fifo path here>'
+ where <fifo path> is printed on stdout during program startup. Also "back" , "forward", "refresh" (basically all actions defined in `static Command commands` should behave as expected)
+* history logging: the script as defined in sample config should write history entries (date,time, url) into the file defined in the script (by default ./extra/history.sh and /tmp/uzbl.history)
+* invocations of external commands: you'll see it on stdout everytime uzbl calls an external script/program. the invocations should work and none of the arguments passed should be null/garbage/.. .
+ all should be valid strings and contain things like the pid, fifo file, config file,.. (see README for details).
+* XDG_CONFIG_HOME and XDG_CONFIG_DIRS (+ default values) fully supported and working (looks for a config file called 'uzbl/config').
+* --uri can be specified without http:// -- if missing will be prepended.
+* Download completely finished
+* Open in new window partially finished: target _new works, from popup meny does not work yet
+* Home command working (home_page variable in config)
+* Open in new window completely finished with --config forwarding between instances
+
+TODO: add stuff about internal/external keybinds, mod key, insert mode, status bar,
+behavior settings,....
+
+TODO: add 'http://' to url if there is no substr '://'
diff --git a/HOWTO b/HOWTO
deleted file mode 100644
index 8836674..0000000
--- a/HOWTO
+++ /dev/null
@@ -1,3 +0,0 @@
-1) get the latest code from master branch
-2) make
-3) profit !
diff --git a/INSTALLING b/INSTALLING
new file mode 100644
index 0000000..0d10d24
--- /dev/null
+++ b/INSTALLING
@@ -0,0 +1,23 @@
+* Arch Linux:
+ pkgbuild @ http://aur.archlinux.org/packages.php?ID=25972
+
+* From source:
+
+$ git clone git://github.com/Dieterbe/uzbl.git
+[ $ git checkout master/experimental ] # master == fairly stable. experimental is more bleeding edge
+$ cd uzbl
+$ make
+$ sudo make install
+
+Dependencies:
+libwebkit 1.1.4 or higher
+gtk 2 something something
+pkgconfig (for Make/gcc)
+
+Optional:
+dmenu, zenity, bash for the sample scripts
+
+You will have the program in /usr/bin and various sample scripts, a sample config, sample bookmarks file and some documentation in /usr/share/uzbl. You
+will probably want to change the scripts to behave more like you want, so copy the scripts to your home dir. If you save your config as
+$XDG_CONFIG_HOME/uzbl/config (this expands to ~/.config/uzbl/config on most systems) it will be recognized automatically. You can also pass the path to
+the config file with the --config parameter.
diff --git a/Makefile b/Makefile
index c3938e9..a70ca9a 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,22 @@ LDFLAGS=$(shell pkg-config --libs gtk+-2.0 webkit-1.0)
all: uzbl
test:
- ./uzbl --uri http://www.archlinux.org
+ ./uzbl --uri http://www.uzbl.org
+test-config:
+ ./uzbl --uri http://www.uzbl.org --config examples/configs/sampleconfig-dev
+
+test-config-real:
+ ./uzbl --uri http://www.uzbl.org --config /usr/share/uzbl/examples/configs/sampleconfig
+
clean:
rm -f uzbl
+
+install:
+ install -d $(DESTDIR)/usr/bin
+ install -d $(DESTDIR)/usr/share/uzbl/docs
+ install -d $(DESTDIR)/usr/share/uzbl/examples
+ install -D -m755 uzbl $(DESTDIR)/usr/bin/uzbl
+ cp -ax examples $(DESTDIR)/usr/share/uzbl/
+ install -D -m644 CHECKLIST $(DESTDIR)/usr/share/uzbl/docs
+ install -D -m644 README $(DESTDIR)/usr/share/uzbl/docs
diff --git a/README b/README
index e58962d..02062f1 100644
--- a/README
+++ b/README
@@ -1,3 +1,23 @@
+THIS PROJECT IS NOT FOR:
+- people want a browser that does everything
+- people who want a browser with things like a built-in bookmark manager, address bar, forward/back buttons, ...
+
+
+
+TO NEW PEOPLE:
+ - please read the README in /usr/share/uzbl/docs
+ - invoke uzbl --help
+ - to get you started: uzbl --uri 'http://www.archlinux.org' --config /usr/share/uzbl/examples/configs/sampleconfig
+ - study the sample config, have a look at all the bindings, and note how you can call the scripts to load new url from history and the bookmarks file
+ - inserting new bookmarks is not working yet. it will be soon.
+ - note that there is no url bar. all url editing is supposed to happen _outside_ of uzbl.
+ for now, you can use the load_from_* dmenu based scripts to pick a url or type a new one (we should have a dmenu-like that functions as a better editor) or write commands into the fifo (see /usr/share/uzbl/docs/CHECKLIST)
+
+
+CURRENT STATE:
+ alpha / prototype
+
+
- Uzbl.
In my opinion, any program can only be really useful if it complies to the unix philosophy.
Web browsers are frequent violators of this principle. Time to change that!
@@ -60,8 +80,7 @@ There is code to run a benchmark in the 'extra' dir. For results & interpretati
CONTROL:
- FIFO opened in /tmp/uzbl_pid
- See config file for commands
-- Press ESC to toggle the command entry.
-- Press enter after typing a command to use it.
+- Press ESC/i to toggle command/insert mode
NOTES:
- My c skills are very rusty, it will take me a while to get back up to speed
@@ -75,9 +94,30 @@ REPO's:
They may be developing specific features, which get merged into Dieters experimental branch
+EXTERNAL SCRIPTS
+You can use external scripts with uzbl the following ways:
+1) let uzbl call them. these scripts are called handlers in the uzbl config. used for handling logging history, handling a new download,..
+2) call them yourself from inside uzbl. you can bind keys for this. examples: add new bookmark, load new url,..
+3) if you want to call scripts that have no option, you can trigger them with something like xbindkeys. example: ? (we try to keep all possibilities inside option 1/2)
+
+Scripts that are called by uzbl are passed the following arguments:
+$1 uzbl-config-file
+$2 uzbl-pid
+$3 uzbl-x-window-id
+$4 uzbl_fifo-filename
+.. [ script specific ] (optional)
+
+The script specific arguments are this:
+* history:
+ $5 page url
+ $6 page title
+ $7 date of visit (Y-m-d H:i:s localtime)
+* add bookmark:
+ $5 page url
+ $6 page title
+* download:
+ $5 url
+
KNOWN BUGS
-- Segfault occurs on shutdown, almost definitely FIFO related (I'm not seeing this bug now, but the warning was here when I forked the code and I haven't touched the FIFO bit)
- Segfaults when using zoom commands (happens when max zoom already reached?).
- Something in the FIFO code causes CPU usage to jump.
-- Segfaults when loading aliases from config file (currently aliases are defined in the code as a 'work-around').
-- Segfaults when setting the xwin variable \ No newline at end of file
diff --git a/TODO b/TODO
index 2f5bef8..c6eeda3 100644
--- a/TODO
+++ b/TODO
@@ -1,11 +1,24 @@
+ASAP
* implement all the ideas from README
+* get a logo
+* improve site
* Support for binding keyboard shortcuts in config file.
+* when launching new instance, don't just try 'uzbl' and then './uzbl', rather launch a new uzbl in the same way the current uzbl instance was started. (same command, same arguments, except --uri)
* where to put proxy config? webkit support?
-* do not store the 'http://' part in the history file
-* improve commandline arguments
-* have a better look at /merge the fifo code from barrucadu and friends
-* history logging broken. logs always starting url because i made uri const
+* implement XDG basedir spec (config is done, but not cache/data, which I presume we'll need at some point)
+* check configured commands if they end on .sh so users don't need to prepend /bin/<shell>
+* implement a more advanced dmenu alike that behaves like FF's awesomebar and where you can search in url + window title
+* recognize -h with GOption?
+* implement a vimperator-like link following scheme. but let user pick his favorite characters to construct the "link identifiers" with.
+* add a keybind to hand the current url to an external scrips, so you can edit it and/or store it in the primary and secondary clipboards
+* use http://library.gnome.org/devel/glib/stable/glib-Hash-Tables.html#g-hash-table-insert for tracking bindings and wherever we use structs and ugly loops
+* fifo -> socket. so you can do question-response. socket is slightly more complicated so we'll need to create a uzblctrl
+* select/fork based instead of the pthread stuff -> drops dependency, more lightweight.
+* on website, see if we can <pre><?php include('..'); ?></pre> the documentation inside the uzbl project itself, so we need to maintain the stuff on only 1 place
+* see if we can use the github bugtracker (anonymous posting allowed?)
+* allow user to change bindings for navigation (up,down,left,right, page up, page down etc)
SOMEDAY:
+check if we can make the settings loading less hard coded. eg( keep a list of all settings, and for each one, try to load it)
figure out caching with webkit and in general how we can speed up everything
figure out how webkit intercepts key input
diff --git a/examples/bookmarks b/examples/bookmarks
new file mode 100644
index 0000000..13fcd48
--- /dev/null
+++ b/examples/bookmarks
@@ -0,0 +1,4 @@
+http://www.archlinux.org linux arch
+http://www.uzbl.org uzbl browser
+http://dieter.plaetinck.be uzbl
+http://www.icanhascheezburger.com lolcats fun
diff --git a/examples/configs/sampleconfig b/examples/configs/sampleconfig
new file mode 100644
index 0000000..03f963d
--- /dev/null
+++ b/examples/configs/sampleconfig
@@ -0,0 +1,43 @@
+
+# example uzbl config. in a real config, we should obey the xdg spec
+
+# all keys in the behavior group are optional. if not set, the corresponding behavior is disabed.
+# bindings_internal denote keys to trigger actions internally in uzbl
+# bindings_external denote keys to trigger scripts outside uzbl
+
+# keyboard behavior is vimstyle by default (all actions -> 1 key). set
+# always_insert_mode to always be in insert mode and disable going out of it.
+# if you do this, make sure you've set a modkey so you can reach the actions
+# from insert mode by combining them with the modkey
+
+[behavior]
+history_handler = /bin/bash /usr/share/uzbl/examples/scripts/history.sh
+download_handler = /bin/bash /usr/share/uzbl/examples/scripts/download.sh
+fifo_dir = /tmp
+always_insert_mode = 0
+modkey = Mod1
+show_status = 1
+status_top = 0
+home_page = http://www.uzbl.org
+
+[bindings_internal]
+back = b
+forward = m
+stop = s
+refresh = r
+reload = R
+home = h
+follow_link_here = f
+follow_link_new_tab = F
+follow_link_new_window = w
+zoom_in = +
+zoom_out = -
+toggle_status = t
+exit = k
+
+[bindings_external]
+/bin/bash /usr/share/uzbl/examples/scripts/insert_bookmark.sh = B
+/bin/bash /usr/share/uzbl/examples/scripts/load_url_from_history.sh = u
+/bin/bash /usr/share/uzbl/examples/scripts/load_url_from_bookmarks.sh = U
+
+[network]
diff --git a/sampleconfig b/examples/configs/sampleconfig-dev
index 9c7336b..9d890b60 100644
--- a/sampleconfig
+++ b/examples/configs/sampleconfig-dev
@@ -11,13 +11,14 @@
# from insert mode by combining them with the modkey
[behavior]
-history_file = /tmp/uzbl.history
-download_handler = ./extra/download.sh
+history_handler = /bin/bash ./examples/scripts/history.sh
+download_handler = /bin/bash ./examples/scripts/download.sh
fifo_dir = /tmp
always_insert_mode = 0
-modkey = Mod4
+modkey = Mod1
show_status = 1
status_top = 0
+home_page = http://www.uzbl.org
[bindings_internal]
back = b
@@ -32,10 +33,11 @@ follow_link_new_window = w
zoom_in = +
zoom_out = -
toggle_status = t
+exit = k
[bindings_external]
-./extra/insert_bookmark.sh = b
-./extra/load_url_from_history.sh = u
-./extra/load_url_from_bookmarks.sh = U
+/bin/bash ./examples/scripts/insert_bookmark.sh = B
+/bin/bash ./examples/scripts/load_url_from_history.sh = u
+/bin/bash ./examples/scripts/load_url_from_bookmarks.sh = U
[network]
diff --git a/examples/scripts/download.sh b/examples/scripts/download.sh
new file mode 100755
index 0000000..ff3d8db
--- /dev/null
+++ b/examples/scripts/download.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+wget $5
diff --git a/examples/scripts/history.sh b/examples/scripts/history.sh
new file mode 100755
index 0000000..03c568a
--- /dev/null
+++ b/examples/scripts/history.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+#TODO: strip 'http://' part
+# you probably really want this in your $XDG_DATA_HOME (eg $HOME/.local/share/uzbl/history)
+echo "$7 $5" >> /tmp/uzbl.history
diff --git a/examples/scripts/insert_bookmark.sh b/examples/scripts/insert_bookmark.sh
new file mode 100755
index 0000000..be17c05
--- /dev/null
+++ b/examples/scripts/insert_bookmark.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+# you probably want your bookmarks file in your $XDG_DATA_HOME ( eg $HOME/.local/share/uzbl/bookmarks)
+
+if [ -f /usr/share/uzbl/examples/bookmarks ]
+then
+ file=/usr/share/uzbl/examples/bookmarks # you will probably get permission denied errors here. pick a file in your ~
+else
+ file=./examples/bookmarks #useful when developing
+fi
+
+which zenity &>/dev/null || exit 2
+
+entry=`zenity --entry --text="Add bookmark. add tags at the end, separated by commas" --entry-text="$5"`
+url=`awk '{print $1}' <<< $entry`
+# TODO: check if already exists, if so, and tags are different: ask if you want to replace tags
+echo "$entry" >> $file
diff --git a/examples/scripts/load_url_from_bookmarks.sh b/examples/scripts/load_url_from_bookmarks.sh
new file mode 100755
index 0000000..ca512eb
--- /dev/null
+++ b/examples/scripts/load_url_from_bookmarks.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+# you probably want your bookmarks file in your $XDG_DATA_HOME ( eg $HOME/.local/share/uzbl/bookmarks)
+if [ -f /usr/share/uzbl/examples/bookmarks ]
+then
+ file=/usr/share/uzbl/examples/bookmarks
+else
+ file=./examples/bookmarks #useful when developing
+fi
+
+goto=`awk '{print $1}' $file | dmenu` #NOTE: it's the job of the script that inserts bookmarks to make sure there are no dupes.
+[ -n "$goto" ] && echo "uri $goto" > $4
diff --git a/examples/scripts/load_url_from_history.sh b/examples/scripts/load_url_from_history.sh
new file mode 100755
index 0000000..366aedf
--- /dev/null
+++ b/examples/scripts/load_url_from_history.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+# you probably really want this in your $XDG_DATA_HOME (eg $HOME/.local/share/uzbl/history)
+history_file=/tmp/uzbl.history
+
+goto=`awk '{print $3}' $history_file | sort | uniq | dmenu`
+[ -n "$goto" ] && echo "uri $goto" > $4
diff --git a/extra/download.sh b/extra/download.sh
deleted file mode 100644
index 90d0a9f..0000000
--- a/extra/download.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/bash
-# $1 = url of file to download
-wget $1
diff --git a/extra/insert_bookmark.sh b/extra/insert_bookmark.sh
deleted file mode 100644
index 3df6086..0000000
--- a/extra/insert_bookmark.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-# $1 should be the uri you want to bookmark
-file=bookmarks
-
-[ -z "$1" ] && exit 1
-which zenity &>/dev/null || exit 2
-
-entry=`zenity --entry --text="Add bookmark. add tags at the end, separated by commas" --entry-text="$1"`
-url=`awk '{print $1}' <<< $entry`
-# TODO: check if already exists, if so, and tags are different: ask if you want to replace tags
-echo "$entry" >> $file
diff --git a/extra/load_url_from_bookmarks.sh b/extra/load_url_from_bookmarks.sh
deleted file mode 100644
index dfbbf9a..0000000
--- a/extra/load_url_from_bookmarks.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-file=bookmarks
-goto=`awk '{print $1}' $history_file | dmenu` #NOTE: it's the job of the script that inserts bookmarks to make sure there are no dupes.
-[ -n "$goto" ] && echo "uri $goto" > /tmp/uzbl-fifo-name-TODO
diff --git a/extra/load_url_from_history.sh b/extra/load_url_from_history.sh
deleted file mode 100755
index bcc2362..0000000
--- a/extra/load_url_from_history.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-history_file=/tmp/uzbl.history
-goto=`awk '{print $3}' $history_file | sort | uniq | dmenu`
-[ -n "$goto" ] && echo "uri $goto" > /tmp/uzbl-fifo-name-TODO
diff --git a/uzbl.c b/uzbl.c
index 984e181..cbd577d 100644
--- a/uzbl.c
+++ b/uzbl.c
@@ -29,11 +29,11 @@
*/
-#define LENGTH(x) (sizeof x / sizeof x[0])
-#define GDK_Escape 0xff1b
+#define LENGTH(x) (sizeof x / sizeof x[0])
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
+#include <gdk/gdkkeysyms.h>
#include <webkit/webkit.h>
#include <pthread.h>
#include <stdio.h>
@@ -43,73 +43,145 @@
#include <unistd.h>
#include <stdlib.h>
+/* housekeeping / internal variables */
static GtkWidget* main_window;
static GtkWidget* mainbar;
static GtkWidget* mainbar_label;
static WebKitWebView* web_view;
static gchar* main_title;
-static gchar selected_url[500];
+static gchar selected_url[500] = "\0";
+static gint load_progress;
+static Window xwin = 0;
+static char fifopath[64];
+
+/* state variables (initial values coming from command line arguments but may be changed later) */
+static gchar* uri = NULL;
+static gchar* config_file = NULL;
+static gchar config_file_path[500];
+
+static gboolean verbose = FALSE;
-/* Behaviour variables */
-static gchar* history_file = NULL;
+/* settings from config: group behaviour */
+static gchar* history_handler = NULL;
static gchar* fifodir = NULL;
static gchar* download_handler = NULL;
static gboolean always_insert_mode = FALSE;
-static gboolean insert_mode = FALSE;
static gboolean show_status = FALSE;
+static gboolean insert_mode = FALSE;
static gboolean status_top = FALSE;
static gchar* modkey = NULL;
+static guint modmask = 0;
+static gchar* home_page = NULL;
-static char fifopath[64];
-static gint load_progress;
-static guint status_context_id;
-static Window xwin = 0;
-static gchar* uri = NULL;
+typedef struct {
+ const char *binding;
+ const char *action;
+} Binding;
-static gboolean verbose = FALSE;
+/* settings from config: group bindings_internal */
+static Binding internal_bindings[256];
+static int num_internal_bindings = 0;
+/* settings from config: group bindings_external */
+static Binding external_bindings[256];
+static int num_external_bindings = 0;
+
+/* commandline arguments (set initial values for the state variables) */
static GOptionEntry entries[] =
{
- { "uri", 'u', 0, G_OPTION_ARG_STRING, &uri, "Uri to load", NULL },
- { "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, "Be verbose", NULL },
- { NULL }
+ { "uri", 'u', 0, G_OPTION_ARG_STRING, &uri, "Uri to load", NULL },
+ { "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, "Be verbose", NULL },
+ { "config", 'c', 0, G_OPTION_ARG_STRING, &config_file, "Config file", NULL },
+ { NULL, 0, 0, 0, NULL, NULL, NULL }
};
+/* for internal list of commands */
typedef struct
{
const char *command;
void (*func_1_param)(WebKitWebView*);
- void (*func_2_params)(WebKitWebView*, char *);
+ void (*func_2_params)(WebKitWebView*, const gchar *);
} Command;
-typedef struct
-{
- const char *binding;
- const char *action;
-} Binding;
-
-static Binding internal_bindings[256];
-static Binding external_bindings[256];
-static int num_internal_bindings = 0;
-static int num_external_bindings = 0;
+/* XDG stuff */
+char *XDG_CONFIG_HOME_default[256];
+char *XDG_CONFIG_DIRS_default = "/etc/xdg";
static void
update_title (GtkWindow* window);
+static void
+load_uri ( WebKitWebView * web_view, const gchar * uri);
+
+static void
+new_window_load_uri (const gchar * uri);
+
+static void
+go_home ( WebKitWebView * web_view);
+
+static void
+close_uzbl ( WebKitWebView * web_view);
+
+static gboolean
+run_command(const char *command, const char *args);
+
/* --- CALLBACKS --- */
+
+static 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;
+ (void) navigation_action;
+ (void) policy_decision;
+ (void) user_data;
+ const gchar* uri = webkit_network_request_get_uri (request);
+ printf("New window requested -> %s \n", uri);
+ new_window_load_uri(uri);
+ return (FALSE);
+}
+
+WebKitWebView*
+create_web_view_cb (WebKitWebView *web_view, WebKitWebFrame *frame, gpointer user_data) {
+ (void) web_view;
+ (void) frame;
+ (void) user_data;
+ if (selected_url[0]!=0) {
+ printf("\nNew web view -> %s\n",selected_url);
+ new_window_load_uri(selected_url);
+ } else {
+ printf("New web view -> %s\n","Nothing to open, exiting");
+ }
+ return (NULL);
+}
+
+static gboolean
+download_cb (WebKitWebView *web_view, GObject *download, gpointer user_data) {
+ (void) web_view;
+ (void) user_data;
+ if (download_handler) {
+ const gchar* uri = webkit_download_get_uri ((WebKitDownload*)download);
+ printf("Download -> %s\n",uri);
+ run_command(download_handler, uri);
+ }
+ return (FALSE);
+}
+
static void
-go_back_cb (GtkWidget* widget, gpointer data) {
+go_back_cb (WebKitWebView* page) {
+ (void) page;
webkit_web_view_go_back (web_view);
}
static void
-go_forward_cb (GtkWidget* widget, gpointer data) {
+go_forward_cb (WebKitWebView* page) {
+ (void) page;
webkit_web_view_go_forward (web_view);
}
static void
-cb_toggle_status() {
+toggle_status_cb (WebKitWebView* page) {
+ (void) page;
if (show_status) {
gtk_widget_hide(mainbar);
} else {
@@ -121,23 +193,22 @@ cb_toggle_status() {
static void
link_hover_cb (WebKitWebView* page, const gchar* title, const gchar* link, gpointer data) {
- /* underflow is allowed */
- //gtk_statusbar_pop (main_statusbar, status_context_id);
- //if (link)
- // gtk_statusbar_push (main_statusbar, status_context_id, link);
- //TODO implementation roadmap pending..
-
+ (void) page;
+ (void) title;
+ (void) data;
//ADD HOVER URL TO WINDOW TITLE
selected_url[0] = '\0';
if (link) {
- strcpy (selected_url, link);
+ strcpy (selected_url, link);
}
update_title (GTK_WINDOW (main_window));
-
}
static void
title_change_cb (WebKitWebView* web_view, WebKitWebFrame* web_frame, const gchar* title, gpointer data) {
+ (void) web_view;
+ (void) web_frame;
+ (void) data;
if (main_title)
g_free (main_title);
main_title = g_strdup (title);
@@ -146,63 +217,143 @@ title_change_cb (WebKitWebView* web_view, WebKitWebFrame* web_frame, const gchar
static void
progress_change_cb (WebKitWebView* page, gint progress, gpointer data) {
+ (void) page;
+ (void) data;
load_progress = progress;
update_title (GTK_WINDOW (main_window));
}
static void
load_commit_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data) {
- const gchar* uri = webkit_web_frame_get_uri(frame);
+ (void) page;
+ (void) data;
+ free (uri);
+ GString* newuri = g_string_new (webkit_web_frame_get_uri (frame));
+ uri = g_string_free (newuri, FALSE);
}
static void
destroy_cb (GtkWidget* widget, gpointer data) {
+ (void) widget;
+ (void) data;
gtk_main_quit ();
}
static void
log_history_cb () {
- FILE * output_file = fopen (history_file, "a");
- if (output_file == NULL) {
- fprintf (stderr, "Cannot open %s for logging\n", history_file);
- } else {
- time_t rawtime;
- struct tm * timeinfo;
- char buffer [80];
- time ( &rawtime );
- timeinfo = localtime ( &rawtime );
- strftime (buffer, 80, "%Y-%m-%d %H:%M:%S", timeinfo);
-
- fprintf (output_file, "%s %s\n", buffer, uri);
- fclose (output_file);
- }
+ if (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);
+ GString* args = g_string_new ("");
+ g_string_printf (args, "'%s' '%s' '%s'", uri, "TODO:page title here", date);
+ run_command(history_handler, args->str);
+ g_string_free (args, TRUE);
+ }
}
/* -- command to callback/function map for things we cannot attach to any signals */
// TODO: reload, home, quit
static Command commands[] =
{
- { "back", &go_back_cb, NULL },
- { "forward", &go_forward_cb, NULL },
- { "refresh", &webkit_web_view_reload, NULL }, //Buggy
- { "stop", &webkit_web_view_stop_loading, NULL },
- { "zoom_in", &webkit_web_view_zoom_in, NULL }, //Can crash (when max zoom reached?).
- { "zoom_out", &webkit_web_view_zoom_out, NULL },
- { "uri", NULL, &webkit_web_view_load_uri },
- { "toggle_status", &cb_toggle_status, NULL}
+ { "back", &go_back_cb, NULL },
+ { "forward", &go_forward_cb, NULL },
+ { "refresh", &webkit_web_view_reload, NULL }, //Buggy
+ { "stop", &webkit_web_view_stop_loading, NULL },
+ { "zoom_in", &webkit_web_view_zoom_in, NULL }, //Can crash (when max zoom reached?).
+ { "zoom_out", &webkit_web_view_zoom_out, NULL },
+ { "uri", (void *) NULL, &load_uri },
+ { "toggle_status", &toggle_status_cb, NULL },
+ { "home" , &go_home, NULL },
+ { "exit" , &close_uzbl, NULL },
//{ "get uri", &webkit_web_view_get_uri},
};
/* -- CORE FUNCTIONS -- */
+static bool
+file_exists (const char * filename) {
+ FILE *file = fopen (filename, "r");
+ if (file) {
+ fclose (file);
+ return true;
+ }
+ return false;
+}
+
static void
-parse_command(const char *command) {
- int i;
+load_uri (WebKitWebView * web_view, const gchar * uri) {
+ if (uri != NULL) {
+ GString* newuri = g_string_new (uri);
+ if (g_strrstr (uri, "://") == NULL)
+ g_string_prepend (newuri, "http://");
+ webkit_web_view_load_uri (web_view, newuri->str);
+ g_string_free (newuri, TRUE);
+ }
+}
+
+static void
+new_window_load_uri (const gchar * uri) {
+ GString* to_execute = g_string_new ("");
+ if (!config_file) {
+ g_string_printf (to_execute, "uzbl --uri '%s'", uri);
+ } else {
+ g_string_printf (to_execute, "uzbl --uri '%s' --config '%s'", uri, config_file);
+ }
+ printf("Spawning %s\n",to_execute->str);
+ if (!g_spawn_command_line_async (to_execute->str, NULL)) {
+ if (!config_file) {
+ g_string_printf (to_execute, "./uzbl --uri '%s'", uri);
+ } else {
+ g_string_printf (to_execute, "./uzbl --uri '%s' --config '%s'", uri, config_file);
+ }
+ printf("Spawning %s\n",to_execute->str);
+ g_spawn_command_line_async (to_execute->str, NULL);
+ }
+ g_string_free (to_execute, TRUE);
+}
+
+static void
+go_home (WebKitWebView * web_view) {
+ if (home_page)
+ webkit_web_view_load_uri (web_view, home_page);
+}
+
+static void
+close_uzbl (WebKitWebView * web_view) {
+ (void) web_view;
+ gtk_main_quit ();
+}
+
+// make sure to put '' around args, so that if there is whitespace we can still keep arguments together.
+static gboolean
+run_command(const char *command, const char *args) {
+ //command <uzbl conf> <uzbl pid> <uzbl win id> <uzbl fifo file> [args]
+ GString* to_execute = g_string_new ("");
+ gboolean result;
+ g_string_printf (to_execute, "%s '%s' '%i' '%i' '%s'", command, config_file, (int) getpid() , (int) xwin, fifopath);
+ if(args) {
+ g_string_append_printf (to_execute, " %s", args);
+ }
+ result = g_spawn_command_line_async (to_execute->str, NULL);
+ printf("Called %s. Result: %s\n", to_execute->str, (result ? "TRUE" : "FALSE" ));
+ g_string_free (to_execute, TRUE);
+ return result;
+}
+
+static void
+parse_command(const char *cmd) {
+ unsigned int i;
Command *c = NULL;
- char * command_name = strtok (command, " ");
- char * command_param = strtok (NULL, " ,"); //dunno how this works, but it seems to work
+ char buffer[512];
+ strcpy (buffer, cmd);
+ const gchar * command_name = strtok (buffer, " ");
+ const gchar * command_param = strtok (NULL, " ,");
- Command *c_tmp;
+ Command *c_tmp = NULL;
for (i = 0; i < LENGTH (commands); i++) {
c_tmp = &commands[i];
if (strncmp (command_name, c_tmp->command, strlen (c_tmp->command)) == 0) {
@@ -227,7 +378,7 @@ parse_command(const char *command) {
c->func_1_param (web_view);
}
} else {
- fprintf (stderr, "command \"%s\" not understood. ignoring.\n", command);
+ fprintf (stderr, "command \"%s\" not understood. ignoring.\n", cmd);
}
}
@@ -263,8 +414,7 @@ static void
}
return NULL;
-}
-
+}
static void
setup_threading () {
@@ -294,7 +444,7 @@ update_title (GtkWindow* window) {
if (show_status) {
gtk_window_set_title (window, title_short);
- gtk_label_set_text(mainbar_label, title_long);
+ gtk_label_set_text(GTK_LABEL(mainbar_label), title_long);
} else {
gtk_window_set_title (window, title_long);
}
@@ -306,34 +456,39 @@ update_title (GtkWindow* window) {
static gboolean
key_press_cb (WebKitWebView* page, GdkEventKey* event)
{
+ (void) page;
int i;
gboolean result=FALSE; //TRUE to stop other handlers from being invoked for the event. FALSE to propagate the event further.
- if (event->type != GDK_KEY_PRESS)
+ if (event->type != GDK_KEY_PRESS)
return result;
- //TURN OFF INSERT MODE
- if (insert_mode && (event->keyval == GDK_Escape)) {
- insert_mode = FALSE;
+ //TURN OFF/ON INSERT MODE
+ if (!always_insert_mode && ((insert_mode && (event->keyval == GDK_Escape)) || (!insert_mode && (event->string[0] == 'i')))) {
+ insert_mode = !insert_mode;
update_title (GTK_WINDOW (main_window));
return TRUE;
}
- //TURN ON INSERT MODE
- if (!insert_mode && (event->string[0] == 'i')) {
- insert_mode = TRUE;
- update_title (GTK_WINDOW (main_window));
- return TRUE;
+ //INTERNAL BINDINGS
+ for (i = 0; i < num_internal_bindings; i++) {
+ if (strcmp(event->string, internal_bindings[i].binding) == 0) {
+ if (!insert_mode || (event->state == modmask)) {
+ parse_command (internal_bindings[i].action);
+ result = TRUE;
+ }
+ }
}
- //INTERNAL KEYS
- if (always_insert_mode || !insert_mode) {
- for (i = 0; i < num_internal_bindings; i++) {
- if (event->string[0] == internal_bindings[i].binding[0]) {
- parse_command (internal_bindings[i].action);
+ //EXTERNAL BINDINGS
+ for (i = 0; i < num_external_bindings; i++) {
+ if (strcmp(event->string, external_bindings[i].binding) == 0) {
+ if (!insert_mode || (event->state == modmask)) {
+ run_command(external_bindings[i].action, NULL);
result = TRUE;
- }
- }
+ }
+ }
}
+
if (!result)
result = (insert_mode ? FALSE : TRUE);
@@ -354,6 +509,9 @@ create_browser () {
g_signal_connect (G_OBJECT (web_view), "load-committed", G_CALLBACK (log_history_cb), web_view);
g_signal_connect (G_OBJECT (web_view), "hovering-over-link", G_CALLBACK (link_hover_cb), web_view);
g_signal_connect (G_OBJECT (web_view), "key-press-event", G_CALLBACK (key_press_cb), web_view);
+ g_signal_connect (G_OBJECT (web_view), "new-window-policy-decision-requested", G_CALLBACK (new_window_cb), web_view);
+ g_signal_connect (G_OBJECT (web_view), "download-requested", G_CALLBACK (download_cb), web_view);
+ g_signal_connect (G_OBJECT (web_view), "create-web-view", G_CALLBACK (create_web_view_cb), web_view);
return scrolled_window;
}
@@ -362,8 +520,8 @@ static GtkWidget*
create_mainbar () {
mainbar = gtk_hbox_new (FALSE, 0);
mainbar_label = gtk_label_new ("");
- gtk_misc_set_alignment (mainbar_label, 0, 0);
- gtk_misc_set_padding (mainbar_label, 2, 2);
+ gtk_misc_set_alignment (GTK_MISC(mainbar_label), 0, 0);
+ gtk_misc_set_padding (GTK_MISC(mainbar_label), 2, 2);
gtk_box_pack_start (GTK_BOX (mainbar), mainbar_label, TRUE, TRUE, 0);
return mainbar;
}
@@ -392,68 +550,120 @@ add_binding (char *binding, char *action, bool internal) {
static void
settings_init () {
- GKeyFile* config = g_key_file_new ();
- gboolean res = g_key_file_load_from_file (config, "./sampleconfig", G_KEY_FILE_NONE, NULL); //TODO: pass config file as argument
- if (res) {
- printf ("Config loaded\n");
- } else {
- fprintf (stderr, "Config loading failed\n"); //TODO: exit codes with gtk?
+ GKeyFile* config;
+ gboolean res = FALSE;
+ gchar** keysi = NULL;
+ gchar** keyse = NULL;
+
+ if (!config_file) {
+ const char* XDG_CONFIG_HOME = getenv ("XDG_CONFIG_HOME");
+ if (! XDG_CONFIG_HOME || ! strcmp (XDG_CONFIG_HOME, "")) {
+ XDG_CONFIG_HOME = (char *)XDG_CONFIG_HOME_default;
+ }
+ printf("XDG_CONFIG_HOME: %s\n", XDG_CONFIG_HOME);
+
+ strcpy (config_file_path, XDG_CONFIG_HOME);
+ strcat (config_file_path, "/uzbl/config");
+ if (file_exists (config_file_path)) {
+ printf ("Config file %s found.\n", config_file_path);
+ config_file = &config_file_path[0];
+ } else {
+ // Now we check $XDG_CONFIG_DIRS
+ char *XDG_CONFIG_DIRS = getenv ("XDG_CONFIG_DIRS");
+ if (! XDG_CONFIG_DIRS || ! strcmp (XDG_CONFIG_DIRS, ""))
+ XDG_CONFIG_DIRS = XDG_CONFIG_DIRS_default;
+
+ printf("XDG_CONFIG_DIRS: %s\n", XDG_CONFIG_DIRS);
+
+ char buffer[512];
+ strcpy (buffer, XDG_CONFIG_DIRS);
+ const gchar* dir = strtok (buffer, ":");
+ while (dir && ! file_exists (config_file_path)) {
+ strcpy (config_file_path, dir);
+ strcat (config_file_path, "/uzbl/config");
+ if (file_exists (config_file_path)) {
+ printf ("Config file %s found.\n", config_file_path);
+ config_file = &config_file_path[0];
+ }
+ dir = strtok (NULL, ":");
+ }
+ }
}
- history_file = g_key_file_get_value (config, "behavior", "history_file", NULL);
- if (history_file) {
- printf ("History file: %s\n", history_file);
+ if (config_file) {
+ config = g_key_file_new ();
+ res = g_key_file_load_from_file (config, config_file, G_KEY_FILE_NONE, NULL);
+ if(res) {
+ printf ("Config %s loaded\n", config_file);
+ } else {
+ fprintf (stderr, "Config %s loading failed\n", config_file);
+ }
} else {
- printf ("History logging disabled\n");
+ printf ("No configuration.\n");
}
- download_handler = g_key_file_get_value (config, "behavior", "download_handler", NULL);
- if (download_handler) {
- printf ("Download manager: %s\n", download_handler);
- } else {
- printf ("Download manager disabled\n");
+ if (res) {
+ history_handler = g_key_file_get_value (config, "behavior", "history_handler", NULL);
+ download_handler = g_key_file_get_value (config, "behavior", "download_handler", NULL);
+ always_insert_mode = g_key_file_get_boolean (config, "behavior", "always_insert_mode", NULL);
+ show_status = g_key_file_get_boolean (config, "behavior", "show_status", NULL);
+ modkey = g_key_file_get_value (config, "behavior", "modkey", NULL);
+ keysi = g_key_file_get_keys (config, "bindings_internal", NULL, NULL);
+ keyse = g_key_file_get_keys (config, "bindings_external", NULL, NULL);
+ status_top = g_key_file_get_boolean (config, "behavior", "status_top", NULL);
+ home_page = g_key_file_get_value (config, "behavior", "home_page", NULL);
+ if (! fifodir)
+ fifodir = g_key_file_get_value (config, "behavior", "fifodir", NULL);
}
-
- if (! fifodir)
- fifodir = g_key_file_get_value (config, "behavior", "fifodir", NULL);
- if (fifodir) {
- printf ("Fifo directory: %s\n", fifodir);
- } else {
- printf ("Fifo directory: /tmp\n");
+
+ printf ("History handler: %s\n", (history_handler ? history_handler : "disabled"));
+ printf ("Download manager: %s\n", (download_handler ? download_handler : "disabled"));
+ printf ("FIFO directory: %s\n", (fifodir ? fifodir : "/tmp"));
+ printf ("Always insert mode: %s\n", (always_insert_mode ? "TRUE" : "FALSE"));
+ printf ("Show status: %s\n", (show_status ? "TRUE" : "FALSE"));
+ printf ("Status top: %s\n", (status_top ? "TRUE" : "FALSE"));
+ printf ("Modkey: %s\n", (modkey ? modkey : "disabled"));
+ printf ("Home page: %s\n", (home_page ? home_page : "disabled"));
+
+ if (! modkey)
+ modkey = "";
+
+ //POSSIBLE MODKEY VALUES (COMBINATIONS CAN BE USED)
+ gchar* modkeyup = g_utf8_strup (modkey, -1);
+ if (g_strrstr (modkeyup,"SHIFT") != NULL) modmask |= GDK_SHIFT_MASK; //the Shift key.
+ if (g_strrstr (modkeyup,"LOCK") != NULL) modmask |= GDK_LOCK_MASK; //a Lock key (depending on the modifier mapping of the X server this may either be CapsLock or ShiftLock).
+ if (g_strrstr (modkeyup,"CONTROL") != NULL) modmask |= GDK_CONTROL_MASK; //the Control key.
+ if (g_strrstr (modkeyup,"MOD1") != NULL) modmask |= GDK_MOD1_MASK; //the fourth modifier key (it depends on the modifier mapping of the X server which key is interpreted as this modifier, but normally it is the Alt key).
+ if (g_strrstr (modkeyup,"MOD2") != NULL) modmask |= GDK_MOD2_MASK; //the fifth modifier key (it depends on the modifier mapping of the X server which key is interpreted as this modifier).
+ if (g_strrstr (modkeyup,"MOD3") != NULL) modmask |= GDK_MOD3_MASK; //the sixth modifier key (it depends on the modifier mapping of the X server which key is interpreted as this modifier).
+ if (g_strrstr (modkeyup,"MOD4") != NULL) modmask |= GDK_MOD4_MASK; //the seventh modifier key (it depends on the modifier mapping of the X server which key is interpreted as this modifier).
+ if (g_strrstr (modkeyup,"MOD5") != NULL) modmask |= GDK_MOD5_MASK; //the eighth modifier key (it depends on the modifier mapping of the X server which key is interpreted as this modifier).
+ if (g_strrstr (modkeyup,"BUTTON1") != NULL) modmask |= GDK_BUTTON1_MASK; //the first mouse button.
+ if (g_strrstr (modkeyup,"BUTTON2") != NULL) modmask |= GDK_BUTTON2_MASK; //the second mouse button.
+ if (g_strrstr (modkeyup,"BUTTON3") != NULL) modmask |= GDK_BUTTON3_MASK; //the third mouse button.
+ if (g_strrstr (modkeyup,"BUTTON4") != NULL) modmask |= GDK_BUTTON4_MASK; //the fourth mouse button.
+ if (g_strrstr (modkeyup,"BUTTON5") != NULL) modmask |= GDK_BUTTON5_MASK; //the fifth mouse button.
+ if (g_strrstr (modkeyup,"SUPER") != NULL) modmask |= GDK_SUPER_MASK; //the Super modifier. Since 2.10
+ if (g_strrstr (modkeyup,"HYPER") != NULL) modmask |= GDK_HYPER_MASK; //the Hyper modifier. Since 2.10
+ if (g_strrstr (modkeyup,"META") != NULL) modmask |= GDK_META_MASK; //the Meta modifier. Since 2.10 */
+ free (modkeyup);
+
+ if (keysi) {
+ int i = 0;
+ for (i = 0; keysi[i]; i++) {
+ gchar *binding = g_key_file_get_string (config, "bindings_internal", keysi[i], NULL);
+ printf ("Action: %s, Binding: %s (internal)\n", g_strdup (keysi[i]), binding);
+ add_binding (binding, g_strdup (keysi[i]), true);
+ }
}
-
- always_insert_mode = g_key_file_get_boolean (config, "behavior", "always_insert_mode", NULL);
- printf ("Always insert mode: %s\n", (always_insert_mode ? "TRUE" : "FALSE"));
-
- show_status = g_key_file_get_boolean (config, "behavior", "show_status", NULL);
- printf ("Show status: %s\n", (show_status ? "TRUE" : "FALSE"));
-
- status_top = g_key_file_get_boolean (config, "behavior", "status_top", NULL);
- printf ("Status top: %s\n", (status_top ? "TRUE" : "FALSE"));
-
- modkey = g_key_file_get_value (config, "behavior", "modkey", NULL);
- if (modkey) {
- printf ("Mod key: %s\n", modkey);
- } else {
- printf ("Mod key disabled/\n");
+ if (keyse) {
+ int i = 0;
+ for (i = 0; keyse[i]; i++) {
+ gchar *binding = g_key_file_get_string (config, "bindings_external", keyse[i], NULL);
+ printf ("Action: %s, Binding: %s (external)\n", g_strdup (keyse[i]), binding);
+ add_binding (binding, g_strdup (keyse[i]), false);
+ }
}
-
- gchar **keysi = g_key_file_get_keys (config, "bindings_internal", NULL, NULL);
- int i = 0;
- for (i = 0; keysi[i]; i++)
- {
- gchar *binding = g_key_file_get_string(config, "bindings_internal", keysi[i], NULL);
- printf("Action: %s, Binding: %s (internal)\n", g_strdup (keysi[i]), binding);
- add_binding (binding, g_strdup (keysi[i]), true);
- }
-
- gchar **keyse = g_key_file_get_keys (config, "bindings_external", NULL, NULL);
- for (i = 0; keyse[i]; i++)
- {
- gchar *binding = g_key_file_get_string(config, "bindings_external", keyse[i], NULL);
- printf("Action: %s, Binding: %s (external)\n", g_strdup (keyse[i]), binding);
- add_binding (binding, g_strdup (keyse[i]), false);
- }
}
int
@@ -462,6 +672,17 @@ main (int argc, char* argv[]) {
if (!g_thread_supported ())
g_thread_init (NULL);
+ printf("Uzbl start location: %s\n", argv[0]);
+
+ strcat ((char *) XDG_CONFIG_HOME_default, getenv ("HOME"));
+ strcat ((char *) XDG_CONFIG_HOME_default, "/.config");
+
+ GError *error = NULL;
+ GOptionContext* context = g_option_context_new ("- some stuff here maybe someday");
+ g_option_context_add_main_entries (context, entries, NULL);
+ g_option_context_add_group (context, gtk_get_option_group (TRUE));
+ g_option_context_parse (context, &argc, &argv, &error);
+
settings_init ();
if (always_insert_mode)
insert_mode = TRUE;
@@ -475,14 +696,8 @@ main (int argc, char* argv[]) {
main_window = create_window ();
gtk_container_add (GTK_CONTAINER (main_window), vbox);
- GError *error = NULL;
-
- GOptionContext* context = g_option_context_new ("- some stuff here maybe someday");
- g_option_context_add_main_entries (context, entries, NULL);
- g_option_context_add_group (context, gtk_get_option_group (TRUE));
- g_option_context_parse (context, &argc, &argv, &error);
- webkit_web_view_load_uri (web_view, uri);
+ load_uri (web_view, uri);
gtk_widget_grab_focus (GTK_WIDGET (web_view));
gtk_widget_show_all (main_window);
@@ -500,3 +715,5 @@ main (int argc, char* argv[]) {
unlink (fifopath);
return 0;
}
+
+/* vi: set et ts=4: */