X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=uzbl.c;h=1031930d6d9bd052075225b3bda186350d3e52ab;hb=23554072f47c0f75a302c57b26d1a7d1905150fc;hp=6494fd9a4f85ebf60702250178236c72fdede951;hpb=68f51084240b156df872d9206640ca80e2cd22a5;p=uzbl-mobile diff --git a/uzbl.c b/uzbl.c index 6494fd9..1031930 100644 --- a/uzbl.c +++ b/uzbl.c @@ -62,7 +62,7 @@ static Uzbl uzbl; /* commandline arguments (set initial values for the state variables) */ -static const +static const GOptionEntry entries[] = { { "uri", 'u', 0, G_OPTION_ARG_STRING, &uzbl.state.uri, @@ -77,6 +77,8 @@ GOptionEntry entries[] = "Socket ID", "SOCKET" }, { "geometry", 'g', 0, G_OPTION_ARG_STRING, &uzbl.gui.geometry, "Set window geometry (format: WIDTHxHEIGHT+-X+-Y)", "GEOMETRY" }, + { "version", 'V', 0, G_OPTION_ARG_NONE, &uzbl.behave.print_version, + "Print the version and exit", NULL }, { NULL, 0, 0, 0, NULL, NULL, NULL } }; @@ -130,6 +132,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)}, @@ -211,7 +214,7 @@ get_exp_type(gchar *s) { return EXP_ERR; } -/* +/* * recurse == 1: don't expand '@(command)@' * recurse == 2: don't expand '@@' */ @@ -267,7 +270,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'; @@ -279,7 +282,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) @@ -295,7 +298,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); @@ -311,7 +314,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); @@ -369,9 +372,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); @@ -379,12 +382,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; } @@ -393,7 +396,7 @@ gchar* parseenv (char* string) { extern char** environ; gchar* tmpstr = NULL; int i = 0; - + while (environ[i] != NULL) { gchar** env = g_strsplit (environ[i], "=", 2); @@ -441,7 +444,7 @@ clean_up(void) { g_hash_table_destroy(uzbl.behave.commands); } -/* 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 */ @@ -491,8 +494,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; } static gboolean @@ -899,7 +902,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(""); @@ -937,7 +940,7 @@ js_init() { } -static void +static void eval_js(WebKitWebView * web_view, gchar *script, GString *result) { WebKitWebFrame *frame; JSGlobalContextRef context; @@ -948,20 +951,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)) { @@ -1010,7 +1013,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)); @@ -1034,7 +1037,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); @@ -1064,6 +1067,12 @@ dehilight (WebKitWebView *page, GArray *argv, GString *result) { static 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; @@ -1086,7 +1095,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); parse_command(parts[0], parts[1], result); @@ -1369,7 +1378,7 @@ run_command (const gchar *command, const guint npre, const gchar **args, const gboolean sync, char **output_stdout) { //command [args] GError *err = NULL; - + GArray *a = g_array_new (TRUE, FALSE, sizeof(gchar*)); gchar *pid = itos(getpid()); gchar *xwin = itos(uzbl.xwin); @@ -1387,11 +1396,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, @@ -1426,7 +1435,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*)); @@ -1469,7 +1478,7 @@ spawn(WebKitWebView *web_view, GArray *argv, GString *result) { static 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); @@ -1482,7 +1491,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); @@ -1503,7 +1512,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); @@ -1511,7 +1520,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); @@ -1579,7 +1588,6 @@ set_icon() { } else { g_printerr ("Icon \"%s\" not found. ignoring.\n", uzbl.gui.icon); } - g_free (uzbl.gui.icon); } static void @@ -1590,7 +1598,7 @@ cmd_load_uri() { g_array_free (a, TRUE); } -static void +static void cmd_always_insert_mode() { uzbl.behave.insert_mode = uzbl.behave.always_insert_mode ? TRUE : FALSE; @@ -1632,7 +1640,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); @@ -1649,7 +1657,7 @@ cmd_zoom_level() { static 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); } @@ -1696,31 +1704,31 @@ cmd_print_bg() { uzbl.behave.print_bg, NULL); } -static void +static void cmd_style_uri() { g_object_set (G_OBJECT(view_settings()), "user-stylesheet-uri", uzbl.behave.style_uri, NULL); } -static void +static void cmd_resizable_txt() { g_object_set (G_OBJECT(view_settings()), "resizable-text-areas", uzbl.behave.resizable_txt, NULL); } -static void +static void cmd_default_encoding() { g_object_set (G_OBJECT(view_settings()), "default-encoding", uzbl.behave.default_encoding, NULL); } -static void +static void cmd_enforce_96dpi() { g_object_set (G_OBJECT(view_settings()), "enforce-96-dpi", uzbl.behave.enforce_96dpi, NULL); } -static void +static void cmd_caret_browsing() { g_object_set (G_OBJECT(view_settings()), "enable-caret-browsing", uzbl.behave.caret_browsing, NULL); @@ -1740,6 +1748,19 @@ cmd_cookie_handler() { } static 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); +} + +static void cmd_fifo_dir() { uzbl.behave.fifo_dir = init_fifo(uzbl.behave.fifo_dir); } @@ -1765,7 +1786,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; @@ -2023,7 +2044,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); @@ -2137,11 +2158,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) { @@ -2262,7 +2283,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); @@ -2416,7 +2437,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; @@ -2424,7 +2445,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; @@ -2434,7 +2455,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); @@ -2444,7 +2465,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); @@ -2516,7 +2537,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)) { @@ -2581,7 +2602,7 @@ static void handle_cookies (SoupSession *session, SoupMessage *msg, gpointer use } if (uzbl.comm.sync_stdout) uzbl.comm.sync_stdout = strfree(uzbl.comm.sync_stdout); - + g_string_free(s, TRUE); } @@ -2748,13 +2769,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 */ @@ -2847,7 +2875,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);