aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar uranther <jwheaton@purdue.edu>2009-07-13 08:45:15 -0400
committerGravatar uranther <jwheaton@purdue.edu>2009-07-13 08:45:15 -0400
commit64d00b48f973dffe79f60f6e21093cacf273673e (patch)
tree3a9c74f1fc64b86316817d653185666d9337fcd0
parenteb7f2848471c40fcf205d70e879fba7975a5e0ee (diff)
parente57f902c3b4d0bb52485b33befdc1759baa6f8f5 (diff)
Merge with Dieterbe/experimental
-rw-r--r--AUTHORS1
-rw-r--r--README17
-rw-r--r--docs/CONTRIBUTING69
-rw-r--r--docs/FAQ22
-rw-r--r--examples/config/uzbl/config4
-rwxr-xr-xexamples/data/uzbl/scripts/cookies.py4
-rwxr-xr-xexamples/data/uzbl/scripts/formfiller.sh7
-rw-r--r--uzbl.c133
-rw-r--r--uzbl.h31
9 files changed, 197 insertions, 91 deletions
diff --git a/AUTHORS b/AUTHORS
index bc3b163..e9b97a9 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -35,6 +35,7 @@ Contributors:
Chris van Dijk (quigybo) - work on uzbl_tabbed.py
Moritz Lenz - small doc fix
Sergey Shepelev (temoto) - doc patch
+ Tassilo Horn (tsdh) - $VISUAL patch
Originaly based on http://trac.webkit.org/browser/trunk/WebKitTools/GtkLauncher/main.c
Which is copyrighted:
diff --git a/README b/README
index 2e2be35..a5c3042 100644
--- a/README
+++ b/README
@@ -9,8 +9,8 @@
* invoke uzbl --help
* to get you started: `XDG_DATA_HOME=/usr/share/uzbl/examples/data XDG_CONFIG_HOME=/usr/share/uzbl/examples/config uzbl --uri www.archlinux.org`
* 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
-* 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 or write commands into the fifo (see /usr/share/uzbl/docs/CHECKLIST)
+* You can change the url with commands (if you have setup the appropriate keybinds) but to be most effective it's better to do url editing/changing _outside_ of uzbl.
+ Eg, you can use the `load_from_*` dmenu based scripts to pick/edit a url or type a new one.
* If you have questions, you are likely to find answers in the FAQ or in the other documentation.
@@ -26,8 +26,8 @@ Time to change that!
Here are the general ideas:
* each instance of uzbl renders 1 page (eg it's a small wrapper around webkit), no tabbing, tab previews, or speed dial things.
- For "multiple instances management" use your window managers, or scripts.
- This way you can get something much more useful than tabbing (see rationale in docs)
+ For "multiple instances management" use your window managers, scripts or wrappers.
+ This way you can get something much more useful than tabbing by default
* very simple, plaintext , changeable at runtime configuration
* various interfaces for (programmatic) interaction with uzbl (see below)
* customizable keyboard shortcuts in vim or emacs style (whatever user wants)
@@ -298,14 +298,19 @@ The script specific arguments are this:
Custom, userdefined scripts (`spawn foo bar`) get first the arguments as specified in the config and then the above 7 are added at the end.
### COMMAND LINE ARGUMENTS
-
- -u, --uri=URI Uri to load (equivalent to 'set uri = URI')
+ uzbl [ uri ]
+ -u, --uri=URI alternative way to load uri on start. (equivalent to 'set uri = URI')
-v, --verbose Whether to print all messages or just errors.
-n, --name=NAME Name of the current instance (defaults to Xorg window id)
-c, --config=FILE Config file (or `-` to use stdin)
+ -s, --socket=SOCKET Socket ID
+ -V, --version Print the version and exit
--display=DISPLAY X display to use
--help Help
+
+
+
### BUGS
Please report new issues @ uzbl.org/bugs
diff --git a/docs/CONTRIBUTING b/docs/CONTRIBUTING
index c88be30..f5d7ebc 100644
--- a/docs/CONTRIBUTING
+++ b/docs/CONTRIBUTING
@@ -1,32 +1,58 @@
### Users
-Just use Uzbl, hang around in our IRC channel, try out different things and tell us when things break.
-If you're feeling more adventerous, you can use one of the development branches and give bug
+Just use Uzbl, hang around in our IRC channel, try out different things and report bugs.
+If you're feeling more adventurous, you can use one of the development branches and give bug
reports and suggestions straight to the developer in charge of that, so the
same problems don't occur when they get merged into the master branch.
Play around with the configs and scripts and see if you can improve things.
The wiki can be a good source of inspiration.
+You may also find mistakes in our documentation.
### Developers
-If you don't feel like just sending bug reports, by all means dive into the
-code and clone the code to start hacking. (github makes this really easy
-with their "fork" concept). But it's usually a good thing to tell us first
+If you don't feel like just sending bug reports, you can dive into the
+code and start hacking.
+Even if you're not good at C, thanks to uzbl's 'ecosystem' of scripts there
+is a lot that can be done.
+However, it's usually a good idea to tell us first
what you want to do, to avoid unneeded or duplicate work.
-Note that cloning and letting us pull (preferably via github) is way more
-workable then submitting plain patches. Git is good in merging in branches
-even if the base code has changed in the meanwhile. This does not work with
-patches.
+Read on for more info...
-If you're new to Git/github, have no fear:
+### Clone/patch/merge workflow
-* [Github guides (highly recommended)](http://github.com/guides/home)
-* [Guides: Fork a project and submit your modifications](http://github.com/guides/fork-a-project-and-submit-your-modifications)
+1. clone the code with git.
+ Either you host your git repo yourself, or use something userfriendly
+ like [Github](http://www.github.com)
+ If you want to use github, you basically just need to register and click
+ the fork button on [Dieterbe/uzbl](http://github.com/Dieterbe/uzbl)
+ If you're new to Git/github, have no fear:
-Our convention is to develop in the *experimental* branch, and keep only stable, tested stuff in *master*.
-So ideally, all contributors develop in their experimental, that gets merged into the mainline experimental, and after QA it gets merged into the main master.
+ * [Github guides (highly recommended)](http://github.com/guides/home)
+ * [Guides: Fork a project and submit your modifications](http://github.com/guides/fork-a-project-and-submit-your-modifications)
+2. Do your work, test it and push to your repo. It may be interesting to ask
+ others for input on your work. Make sure you do not develop against the
+ master branch! It is meant for stable, tested code.
+ All contributors develop in their experimental or other specific branches,
+ which get merged into the mainline experimental, and after QA it gets merged into the main master.
+
+3. If you think your code should be in the main uzbl code and meets all
+ requirements (see below), then ask Dieter to merge it.
+
+ * send a mail to the mailing list with subject "`Pull request: <title>`"
+ with a short description of your stuff and link to your git clone and
+ which branch you're talking about.
+ We prefer you send us links to git clones, and not just patches. They
+ seem to be easier to merge, especially if the 'base code' has changed in the
+ meanwhile.
+ * If you really don't want to subscribe to the ML and only if it's a
+ small change, you can email Dieter personally.
+ * Please avoid sending private messages on github or asking Dieter to merge on IRC.
+ * If your patch is big, if it will help a lot if you can mention
+ that your code has been tested and is supported by other people.
+
+This is a relatively easy, solid and transparent way to handle all requests in order.
### Patch/branch requirements before merging:
@@ -38,10 +64,23 @@ So ideally, all contributors develop in their experimental, that gets merged int
Update them, not only for end users but also for your fellow hackers.
* We recommend you finish your stuff first and then let Dieter know you want your stuff to be merged in, but
we know for bigger changes this is not always feasible. Just try to keep the merges about bigger "clean changesets".
-
+* Your code should not introduce any compile warnings or errors. And also,
+ no regressions but that's harder to check.
That said, you can always ask us to check on your stuff or ask for advice.
+### Bugreporting
+
+Bug reports are also welcome, especially the ones that come with a patch ;-)
+Before making a new ticket, check whether the bug is reported already.
+If you want to report a bug and you don't know where the problem in the code
+is, please supply:
+
+* version (commit hash) (see `uzbl --version`)
+* operating system
+* versions of libsoup, webkit, gtk.
+* output of uzbl --verbose (with http_debug set, if relevant)
+
### Valgrind profiling
$ add this to Makefile header: CFLAGS=-g
$ recompile
diff --git a/docs/FAQ b/docs/FAQ
index 1ecce41..b2a5c9c 100644
--- a/docs/FAQ
+++ b/docs/FAQ
@@ -4,8 +4,8 @@ FAQ
### I just installed uzbl but it doesn't do much. What now?
Uzbl includes very limited default settings (statusbar settings, but no keybinds, history/download handlers etc.)
Look at /usr/share/uzbl/docs/config.h to see the default settings.
-Neither does uzbl create a default config file on startup like some other programs do because we want to give you the freedom to place your config where you want, and to use a config or not.
Have a look in /usr/share/uzbl/examples/configs to see what you can do.
+
If you save a config as $XDG\_CONFIG\_HOME/uzbl/config it will be loaded automatically.
Running with the `--verbose` flag on a command line can also be interesting.
To get you started, try this:
@@ -14,6 +14,26 @@ It will temporarily override your $XDG\_CONFIG\_HOME and $XDG\_DATA\_HOME
variables so you can try the sample stuff directly in /usr/share/uzbl/examples.
If you like what you can do, you can copy the sample stuff into your ~ and edit to your liking.
+### Why don't you just use a reasonable config by default?
+We actually did some attempts to make uzbl "usable by default" but in the
+end we had to conclude it cannot be done because of the following reasons:
+
+ * We don't want to store anything "automagically" in the users home.
+ Some people prefer different file/directory layouts, most of just want to
+ control the files in $HOME themselves.
+ * We considered the option of having a global '/etc/uzbl' which user
+ specific ones could override but that would overcomplicate things.
+ * We adhere to the [FHS](http://www.pathname.com/fhs/) (`man hier`), so
+ `uzbl -c /usr/share/...` is not an option.
+
+So even though we would like to make uzbl more usable by default, we think
+there is no sensible way to do it. Maybe downstream packagers could provide
+a note that users could copy the examples from /usr/share/uzbl/examples into
+their homes, because really, that's all that is needed if you want it to
+just "work" without controlling how yourself. (unless you have no
+xdg variables set, in which case you should be smart enough to edit the sample
+config yourself).
+
### Where is the location bar? How do I change the URL ?
Uzbl has no location bar. All changes to the uri (editing of current uri, typing new uri, loading of uri from bookmarks/history/...) happens *outside* of uzbl.
Have a look at the sample scripts in /usr/share/uzbl/examples. Most of our examples use dmenu which is a nifty little tool to pick an item from a list of items (very
diff --git a/examples/config/uzbl/config b/examples/config/uzbl/config
index a4a5f45..3c2b7bf 100644
--- a/examples/config/uzbl/config
+++ b/examples/config/uzbl/config
@@ -11,6 +11,10 @@ set history_handler = spawn $XDG_DATA_HOME/uzbl/scripts/history.sh
set download_handler = spawn $XDG_DATA_HOME/uzbl/scripts/download.sh
set cookie_handler = spawn $XDG_DATA_HOME/uzbl/scripts/cookies.py
+# Control how new windows should open
+#set new_window = sh 'uzbl -u $8' # equivalent to the default behaviour
+#set new_window = sh 'echo uri "$8" > $4' # open in same window
+
# You can bind whatever things (spawn <foo>, script <bar>,..) to some events TODO: make events system more generic
set load_start_handler = set status_message = <span foreground="khaki">wait</span>
set load_commit_handler = set status_message = <span foreground="green">recv</span>
diff --git a/examples/data/uzbl/scripts/cookies.py b/examples/data/uzbl/scripts/cookies.py
index bf2d2e6..c8cf8c0 100755
--- a/examples/data/uzbl/scripts/cookies.py
+++ b/examples/data/uzbl/scripts/cookies.py
@@ -62,10 +62,10 @@ class FakeResponse:
if __name__ == '__main__':
if 'XDG_DATA_HOME' in os.environ.keys() and os.environ['XDG_DATA_HOME']:
- jar = cookielib.MozillaCookieJar(\
+ jar = cookielib.MozillaCookieJar(
os.path.join(os.environ['XDG_DATA_HOME'],'uzbl/cookies.txt'))
else:
- jar = cookielib.MozillaCookieJar(\
+ jar = cookielib.MozillaCookieJar(
os.path.join(os.environ['HOME'],'.local/share/uzbl/cookies.txt'))
try:
jar.load()
diff --git a/examples/data/uzbl/scripts/formfiller.sh b/examples/data/uzbl/scripts/formfiller.sh
index bbb9d1a..10afaba 100755
--- a/examples/data/uzbl/scripts/formfiller.sh
+++ b/examples/data/uzbl/scripts/formfiller.sh
@@ -16,8 +16,11 @@ keydir=${XDG_DATA_HOME:-$HOME/.local/share}/uzbl/forms
[ -d "`dirname $keydir`" ] || exit 1
[ -d "$keydir" ] || mkdir "$keydir"
-#editor=gvim
-editor='urxvt -e vim'
+editor=${VISUAL}
+if [[ -z ${editor} ]]; then
+ #editor='gvim'
+ editor='urxvt -e vim'
+fi
config=$1; shift
pid=$1; shift
diff --git a/uzbl.c b/uzbl.c
index dd94c20..6b6f7ac 100644
--- a/uzbl.c
+++ b/uzbl.c
@@ -67,12 +67,14 @@ GOptionEntry entries[] =
"Uri to load at startup (equivalent to 'set uri = URI')", "URI" },
{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &uzbl.state.verbose,
"Whether to print all messages or just errors.", NULL },
- { "name", 'n', 0, G_OPTION_ARG_STRING, &uzbl.state.instance_name,
+ { "name", 'n', 0, G_OPTION_ARG_STRING, &uzbl.state.instance_name,
"Name of the current instance (defaults to Xorg window id)", "NAME" },
- { "config", 'c', 0, G_OPTION_ARG_STRING, &uzbl.state.config_file,
+ { "config", 'c', 0, G_OPTION_ARG_STRING, &uzbl.state.config_file,
"Config file (this is pretty much equivalent to uzbl < FILE )", "FILE" },
- { "socket", 's', 0, G_OPTION_ARG_INT, &uzbl.state.socket_id,
+ { "socket", 's', 0, G_OPTION_ARG_INT, &uzbl.state.socket_id,
"Socket ID", "SOCKET" },
+ { "version", 'V', 0, G_OPTION_ARG_NONE, &uzbl.behave.print_version,
+ "Print the version and exit", NULL },
{ NULL, 0, 0, 0, NULL, NULL, NULL }
};
@@ -127,6 +129,7 @@ const struct {
{ "history_handler", PTR(uzbl.behave.history_handler, STR, 1, NULL)},
{ "download_handler", PTR(uzbl.behave.download_handler, STR, 1, NULL)},
{ "cookie_handler", PTR(uzbl.behave.cookie_handler, STR, 1, cmd_cookie_handler)},
+ { "new_window", PTR(uzbl.behave.new_window, STR, 1, cmd_new_window)},
{ "fifo_dir", PTR(uzbl.behave.fifo_dir, STR, 1, cmd_fifo_dir)},
{ "socket_dir", PTR(uzbl.behave.socket_dir, STR, 1, cmd_socket_dir)},
{ "http_debug", PTR(uzbl.behave.http_debug, INT, 1, cmd_http_debug)},
@@ -207,7 +210,7 @@ get_exp_type(gchar *s) {
return EXP_ERR;
}
-/*
+/*
* recurse == 1: don't expand '@(command)@'
* recurse == 2: don't expand '@<java script>@'
*/
@@ -263,7 +266,7 @@ expand(char *s, guint recurse) {
ret[vend-s] = '\0';
}
break;
- case EXP_JS:
+ case EXP_JS:
s++;
strcpy(str_end, ">@");
str_end[2] = '\0';
@@ -275,7 +278,7 @@ expand(char *s, guint recurse) {
break;
}
- if(etype == EXP_SIMPLE_VAR ||
+ if(etype == EXP_SIMPLE_VAR ||
etype == EXP_BRACED_VAR) {
if( (c = g_hash_table_lookup(uzbl.comm.proto_var, ret)) ) {
if(c->type == TYPE_STR)
@@ -292,7 +295,7 @@ expand(char *s, guint recurse) {
else
s = vend+1;
}
- else if(recurse != 1 &&
+ else if(recurse != 1 &&
etype == EXP_EXPR) {
mycmd = expand(ret, 1);
g_spawn_command_line_sync(mycmd, &cmd_stdout, NULL, NULL, &err);
@@ -308,7 +311,7 @@ expand(char *s, guint recurse) {
}
s = vend+2;
}
- else if(recurse != 2 &&
+ else if(recurse != 2 &&
etype == EXP_JS) {
mycmd = expand(ret, 2);
eval_js(uzbl.gui.web_view, mycmd, js_ret);
@@ -366,9 +369,9 @@ read_file_by_line (gchar *path) {
gsize len;
GArray *lines = g_array_new(TRUE, FALSE, sizeof(gchar*));
int i = 0;
-
+
chan = g_io_channel_new_file(path, "r", NULL);
-
+
if (chan) {
while (g_io_channel_read_line(chan, &readbuf, &len, NULL, NULL) == G_IO_STATUS_NORMAL) {
const gchar* val = g_strdup (readbuf);
@@ -376,12 +379,12 @@ read_file_by_line (gchar *path) {
g_free (readbuf);
i ++;
}
-
+
g_io_channel_unref (chan);
} else {
fprintf(stderr, "File '%s' not be read.\n", path);
}
-
+
return lines;
}
@@ -390,7 +393,7 @@ parseenv (char* string) {
extern char** environ;
gchar* tmpstr = NULL;
int i = 0;
-
+
while (environ[i] != NULL) {
gchar** env = g_strsplit (environ[i], "=", 2);
@@ -439,7 +442,7 @@ clean_up(void) {
g_scanner_destroy(uzbl.scan);
}
-/* used for html_mode_timeout
+/* used for html_mode_timeout
* be sure to extend this function to use
* more timers if needed in other places
*/
@@ -489,8 +492,8 @@ new_window_cb (WebKitWebView *web_view, WebKitWebFrame *frame, WebKitNetworkRequ
const gchar* uri = webkit_network_request_get_uri (request);
if (uzbl.state.verbose)
printf("New window requested -> %s \n", uri);
- new_window_load_uri(uri);
- return (FALSE);
+ webkit_web_policy_decision_use(policy_decision);
+ return TRUE;
}
gboolean
@@ -885,7 +888,7 @@ js_run_command (JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject,
(void) function;
(void) thisObject;
(void) exception;
-
+
JSStringRef js_result_string;
GString *result = g_string_new("");
@@ -934,20 +937,20 @@ eval_js(WebKitWebView * web_view, gchar *script, GString *result) {
JSValueRef js_result;
JSStringRef js_result_string;
size_t js_result_size;
-
+
js_init();
frame = webkit_web_view_get_main_frame(WEBKIT_WEB_VIEW(web_view));
context = webkit_web_frame_get_global_context(frame);
globalobject = JSContextGetGlobalObject(context);
-
+
/* uzbl javascript namespace */
var_name = JSStringCreateWithUTF8CString("Uzbl");
JSObjectSetProperty(context, globalobject, var_name,
- JSObjectMake(context, uzbl.js.classref, NULL),
+ JSObjectMake(context, uzbl.js.classref, NULL),
kJSClassAttributeNone, NULL);
-
- /* evaluate the script and get return value*/
+
+ /* evaluate the script and get return value*/
js_script = JSStringCreateWithUTF8CString(script);
js_result = JSEvaluateScript(context, js_script, globalobject, NULL, 0, NULL);
if (js_result && !JSValueIsUndefined(context, js_result)) {
@@ -995,7 +998,7 @@ run_external_js (WebKitWebView * web_view, GArray *argv, GString *result) {
i ++;
g_free (line);
}
-
+
if (uzbl.state.verbose)
printf ("External JavaScript file %s loaded\n", argv_idx(argv, 0));
@@ -1019,7 +1022,7 @@ search_text (WebKitWebView *page, GArray *argv, const gboolean forward) {
uzbl.state.searchtx = g_strdup(argv_idx(argv, 0));
}
}
-
+
if (uzbl.state.searchtx) {
if (uzbl.state.verbose)
printf ("Searching: %s\n", uzbl.state.searchtx);
@@ -1049,6 +1052,12 @@ dehilight (WebKitWebView *page, GArray *argv, GString *result) {
void
new_window_load_uri (const gchar * uri) {
+ if (uzbl.behave.new_window) {
+ GString *s = g_string_new ("");
+ g_string_printf(s, "'%s'", uri);
+ run_handler(uzbl.behave.new_window, s->str);
+ return;
+ }
GString* to_execute = g_string_new ("");
g_string_append_printf (to_execute, "%s --uri '%s'", uzbl.state.executable_path, uri);
int i;
@@ -1071,7 +1080,7 @@ chain (WebKitWebView *page, GArray *argv, GString *result) {
(void) page; (void) result;
gchar *a = NULL;
gchar **parts = NULL;
- guint i = 0;
+ guint i = 0;
while ((a = argv_idx(argv, i++))) {
parts = g_strsplit (a, " ", 2);
if (parts[0])
@@ -1359,7 +1368,7 @@ 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]
GError *err = NULL;
-
+
GArray *a = g_array_new (TRUE, FALSE, sizeof(gchar*));
gchar *pid = itos(getpid());
gchar *xwin = itos(uzbl.xwin);
@@ -1377,11 +1386,11 @@ run_command (const gchar *command, const guint npre, const gchar **args,
for (i = npre; i < g_strv_length((gchar**)args); i++)
sharg_append(a, args[i]);
-
+
gboolean result;
if (sync) {
if (*output_stdout) *output_stdout = strfree(*output_stdout);
-
+
result = g_spawn_sync(NULL, (gchar **)a->data, NULL, G_SPAWN_SEARCH_PATH,
NULL, NULL, output_stdout, NULL, NULL, &err);
} else result = g_spawn_async(NULL, (gchar **)a->data, NULL, G_SPAWN_SEARCH_PATH,
@@ -1416,7 +1425,7 @@ 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 */
if (!src) return NULL;
-
+
gboolean dq = FALSE;
gboolean sq = FALSE;
GArray *a = g_array_new (TRUE, FALSE, sizeof(gchar*));
@@ -1459,7 +1468,7 @@ spawn(WebKitWebView *web_view, GArray *argv, GString *result) {
void
spawn_sync(WebKitWebView *web_view, GArray *argv, GString *result) {
(void)web_view; (void)result;
-
+
if (argv_idx(argv, 0))
run_command(argv_idx(argv, 0), 0, ((const gchar **) (argv->data + sizeof(gchar*))),
TRUE, &uzbl.comm.sync_stdout);
@@ -1472,7 +1481,7 @@ spawn_sh(WebKitWebView *web_view, GArray *argv, GString *result) {
g_printerr ("spawn_sh: shell_cmd is not set!\n");
return;
}
-
+
guint i;
gchar *spacer = g_strdup("");
g_array_insert_val(argv, 1, spacer);
@@ -1493,7 +1502,7 @@ spawn_sh_sync(WebKitWebView *web_view, GArray *argv, GString *result) {
g_printerr ("spawn_sh_sync: shell_cmd is not set!\n");
return;
}
-
+
guint i;
gchar *spacer = g_strdup("");
g_array_insert_val(argv, 1, spacer);
@@ -1501,7 +1510,7 @@ spawn_sh_sync(WebKitWebView *web_view, GArray *argv, GString *result) {
for (i = 1; i < g_strv_length(cmd); i++)
g_array_prepend_val(argv, cmd[i]);
-
+
if (cmd) run_command(cmd[0], g_strv_length(cmd) + 1, (const gchar **) argv->data,
TRUE, &uzbl.comm.sync_stdout);
g_free (spacer);
@@ -1621,7 +1630,7 @@ cmd_font_size() {
if (uzbl.behave.font_size > 0) {
g_object_set (G_OBJECT(ws), "default-font-size", uzbl.behave.font_size, NULL);
}
-
+
if (uzbl.behave.monospace_size > 0) {
g_object_set (G_OBJECT(ws), "default-monospace-font-size",
uzbl.behave.monospace_size, NULL);
@@ -1638,7 +1647,7 @@ cmd_zoom_level() {
void
cmd_disable_plugins() {
- g_object_set (G_OBJECT(view_settings()), "enable-plugins",
+ g_object_set (G_OBJECT(view_settings()), "enable-plugins",
!uzbl.behave.disable_plugins, NULL);
}
@@ -1729,6 +1738,19 @@ cmd_cookie_handler() {
}
void
+cmd_new_window() {
+ gchar **split = g_strsplit(uzbl.behave.new_window, " ", 2);
+ /* pitfall: doesn't handle chain actions; must the sync_ action manually */
+ if ((g_strcmp0(split[0], "sh") == 0) ||
+ (g_strcmp0(split[0], "spawn") == 0)) {
+ g_free (uzbl.behave.new_window);
+ uzbl.behave.new_window =
+ g_strdup_printf("%s %s", split[0], split[1]);
+ }
+ g_strfreev (split);
+}
+
+void
cmd_fifo_dir() {
uzbl.behave.fifo_dir = init_fifo(uzbl.behave.fifo_dir);
}
@@ -1754,7 +1776,7 @@ cmd_modkey() {
buf = g_utf8_strup(uzbl.behave.modkey, -1);
uzbl.behave.modmask = 0;
- if(uzbl.behave.modkey)
+ if(uzbl.behave.modkey)
g_free(uzbl.behave.modkey);
uzbl.behave.modkey = buf;
@@ -2000,7 +2022,7 @@ control_socket(GIOChannel *chan) {
clientsock = accept (g_io_channel_unix_get_fd(chan),
(struct sockaddr *) &remote, &t);
-
+
if ((clientchan = g_io_channel_unix_new(clientsock))) {
g_io_add_watch(clientchan, G_IO_IN|G_IO_HUP,
(GIOFunc) control_client_socket, clientchan);
@@ -2114,11 +2136,11 @@ update_title (void) {
if (b->status_background) {
GdkColor color;
gdk_color_parse (b->status_background, &color);
- //labels and hboxes do not draw their own background. applying this on the window/vbox is ok as the statusbar is the only affected widget. (if not, we could also use GtkEventBox)
- if (uzbl.gui.main_window)
- gtk_widget_modify_bg (uzbl.gui.main_window, GTK_STATE_NORMAL, &color);
- else if (uzbl.gui.plug)
- gtk_widget_modify_bg ((GtkWidget * ) uzbl.gui.plug, GTK_STATE_NORMAL, &color);
+ //labels and hboxes do not draw their own background. applying this on the vbox/main_window is ok as the statusbar is the only affected widget. (if not, we could also use GtkEventBox)
+ if (uzbl.gui.main_window)
+ gtk_widget_modify_bg (uzbl.gui.main_window, GTK_STATE_NORMAL, &color);
+ else if (uzbl.gui.plug)
+ gtk_widget_modify_bg (GTK_WIDGET(uzbl.gui.plug), GTK_STATE_NORMAL, &color);
}
} else {
if (b->title_format_long) {
@@ -2219,7 +2241,7 @@ run_keycmd(const gboolean key_ret) {
else exec_paramcmd(act, i); /* otherwise execute the incremental */
break;
}
-
+
g_string_truncate(short_keys, short_keys->len - 1);
}
g_string_free (short_keys, TRUE);
@@ -2373,7 +2395,7 @@ run_handler (const gchar *act, const gchar *args) {
if (g_strcmp0(parts[0], "chain") == 0) {
GString *newargs = g_string_new("");
gchar **chainparts = split_quoted(parts[1], FALSE);
-
+
/* for every argument in the chain, inject the handler args
and make sure the new parts are wrapped in quotes */
gchar **cp = chainparts;
@@ -2381,7 +2403,7 @@ run_handler (const gchar *act, const gchar *args) {
gchar *quotless = NULL;
gchar **spliced_quotless = NULL; // sigh -_-;
gchar **inpart = NULL;
-
+
while (*cp) {
if ((**cp == '\'') || (**cp == '\"')) { /* strip old quotes */
quot = **cp;
@@ -2391,7 +2413,7 @@ run_handler (const gchar *act, const gchar *args) {
spliced_quotless = g_strsplit(quotless, " ", 2);
inpart = inject_handler_args(spliced_quotless[0], spliced_quotless[1], args);
g_strfreev(spliced_quotless);
-
+
g_string_append_printf(newargs, " %c%s %s%c", quot, inpart[0], inpart[1], quot);
g_free(quotless);
g_strfreev(inpart);
@@ -2401,7 +2423,7 @@ run_handler (const gchar *act, const gchar *args) {
parse_command(parts[0], &(newargs->str[1]), NULL);
g_string_free(newargs, TRUE);
g_strfreev(chainparts);
-
+
} else {
gchar **inparts = inject_handler_args(parts[0], parts[1], args);
parse_command(inparts[0], inparts[1], NULL);
@@ -2473,7 +2495,7 @@ find_xdg_file (int xdg_type, char* filename) {
temporary_file = g_strconcat (temporary_string, filename, NULL);
}
}
-
+
//g_free (temporary_string); - segfaults.
if (file_exists (temporary_file)) {
@@ -2538,7 +2560,7 @@ void handle_cookies (SoupSession *session, SoupMessage *msg, gpointer user_data)
}
if (uzbl.comm.sync_stdout)
uzbl.comm.sync_stdout = strfree(uzbl.comm.sync_stdout);
-
+
g_string_free(s, TRUE);
}
@@ -2693,13 +2715,20 @@ main (int argc, char* argv[]) {
uzbl.state.selected_url = NULL;
uzbl.state.searchtx = NULL;
- GOptionContext* context = g_option_context_new ("- some stuff here maybe someday");
+ GOptionContext* context = g_option_context_new ("[ uri ] - load a uri by default");
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, NULL);
g_option_context_free(context);
-
+
+ if (uzbl.behave.print_version) {
+ printf("Commit: %s\n", COMMIT);
+ exit(0);
+ }
+
gchar *uri_override = (uzbl.state.uri ? g_strdup(uzbl.state.uri) : NULL);
+ if (argc > 1 && !uzbl.state.uri)
+ uri_override = g_strdup(argv[1]);
gboolean verbose_override = uzbl.state.verbose;
/* initialize hash table */
@@ -2787,7 +2816,7 @@ main (int argc, char* argv[]) {
if (verbose_override > uzbl.state.verbose)
uzbl.state.verbose = verbose_override;
-
+
if (uri_override) {
set_var_value("uri", uri_override);
g_free(uri_override);
diff --git a/uzbl.h b/uzbl.h
index b40684a..3789dcb 100644
--- a/uzbl.h
+++ b/uzbl.h
@@ -1,4 +1,4 @@
-/* -*- c-basic-offset: 4; -*-
+/* -*- c-basic-offset: 4; -*-
* See LICENSE for license details
*
@@ -137,6 +137,7 @@ typedef struct {
gchar* socket_dir;
gchar* download_handler;
gchar* cookie_handler;
+ gchar* new_window;
gboolean always_insert_mode;
gboolean show_status;
gboolean insert_mode;
@@ -153,24 +154,25 @@ typedef struct {
gfloat zoom_level;
guint disable_plugins;
guint disable_scripts;
- guint autoload_img;
- guint autoshrink_img;
+ guint autoload_img;
+ guint autoshrink_img;
guint enable_spellcheck;
- guint enable_private;
- guint print_bg;
- gchar* style_uri;
- guint resizable_txt;
- gchar* default_encoding;
- guint enforce_96dpi;
+ guint enable_private;
+ guint print_bg;
+ gchar* style_uri;
+ guint resizable_txt;
+ gchar* default_encoding;
+ guint enforce_96dpi;
gchar *inject_html;
- guint caret_browsing;
- guint mode;
+ guint caret_browsing;
+ guint mode;
gchar* base_url;
gchar* html_endmarker;
gchar* insert_indicator;
gchar* cmd_indicator;
GString* html_buffer;
- guint html_timeout;
+ guint html_timeout;
+ gboolean print_version;
/* command list: name -> Command */
GHashTable* commands;
@@ -214,7 +216,7 @@ typedef struct {
gchar* default_value;
} XDG_Var;
-XDG_Var XDG[] =
+XDG_Var XDG[] =
{
{ "XDG_CONFIG_HOME", "~/.config" },
{ "XDG_DATA_HOME", "~/.local/share" },
@@ -495,6 +497,9 @@ void
cmd_cookie_handler();
void
+cmd_new_window();
+
+void
move_statusbar();
void