From 97526404f52875d82d584f18420be72fdc300d93 Mon Sep 17 00:00:00 2001 From: Dequis Date: Wed, 10 Jun 2009 18:29:13 -0300 Subject: Add disable_stdin config option --- uzbl.h | 1 + 1 file changed, 1 insertion(+) (limited to 'uzbl.h') diff --git a/uzbl.h b/uzbl.h index ee9e693..8dd2c02 100644 --- a/uzbl.h +++ b/uzbl.h @@ -144,6 +144,7 @@ typedef struct { gboolean insert_mode; gboolean status_top; gboolean reset_command_mode; + gboolean disable_stdin; gchar* modkey; guint modmask; guint http_debug; -- cgit v1.2.3 From e230f5720de05c2d385b6047de1c8d7c422728d6 Mon Sep 17 00:00:00 2001 From: Dequis Date: Sun, 14 Jun 2009 23:21:27 -0300 Subject: Added *result to get data back from commands This allows socket (and stdio) to have a way to reply back. Had to change all their function definitions, unfortunately. Currently, no functions write a result. print will, at least, probably run_js too, and some others. When a function calling parse_command (or parse_cmd_line) is not interested in the result, it is safe to pass NULL. Before calling the function, parse_command creates a GString and prints the result to stdout if verbose is enabled. You could do the same when calling most command functions directly, but not with those that expect a GString. Oh, additionally, I killed NOSPLIT, moved the typedef Command to uzbl.h, and created the struct CommandInfo which replaces a Command[2] array. That fixes FS#22, which is a warning with -pedantic. Heh. --- uzbl.c | 202 ++++++++++++++++++++++++++++++++++++++--------------------------- uzbl.h | 136 +++++++++++++++++++++++--------------------- 2 files changed, 190 insertions(+), 148 deletions(-) (limited to 'uzbl.h') diff --git a/uzbl.c b/uzbl.c index 24b0315..1bb1e41 100644 --- a/uzbl.c +++ b/uzbl.c @@ -57,7 +57,6 @@ #include "config.h" static Uzbl uzbl; -typedef void (*Command)(WebKitWebView*, GArray *argv); @@ -455,27 +454,27 @@ scroll (GtkAdjustment* bar, GArray *argv) { } static void -scroll_begin(WebKitWebView* page, GArray *argv) { - (void) page; (void) argv; +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 -scroll_end(WebKitWebView* page, GArray *argv) { - (void) page; (void) argv; +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 -scroll_vert(WebKitWebView* page, GArray *argv) { - (void) page; +scroll_vert(WebKitWebView* page, GArray *argv, GString *result) { + (void) page; (void) result; scroll(uzbl.gui.bar_v, argv); } static void -scroll_horz(WebKitWebView* page, GArray *argv) { - (void) page; +scroll_horz(WebKitWebView* page, GArray *argv, GString *result) { + (void) page; (void) result; scroll(uzbl.gui.bar_h, argv); } @@ -490,17 +489,19 @@ cmd_set_status() { } static void -toggle_zoom_type (WebKitWebView* page, GArray *argv) { +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 -toggle_status_cb (WebKitWebView* page, GArray *argv) { +toggle_status_cb (WebKitWebView* page, GArray *argv, GString *result) { (void)page; (void)argv; + (void)result; if (uzbl.behave.show_status) { gtk_widget_hide(uzbl.gui.mainbar); @@ -601,7 +602,7 @@ log_history_cb () { /* VIEW funcs (little webkit wrappers) */ -#define VIEWFUNC(name) static void view_##name(WebKitWebView *page, GArray *argv){(void)argv; webkit_web_view_##name(page);} +#define VIEWFUNC(name) static 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) @@ -612,7 +613,7 @@ VIEWFUNC(go_forward) #undef VIEWFUNC /* -- command to callback/function map for things we cannot attach to any signals */ -static struct {char *name; Command command[2];} cmdlist[] = +static struct {char *key; CommandInfo value;} cmdlist[] = { /* key function no_split */ { "back", {view_go_back, 0} }, { "forward", {view_go_forward, 0} }, @@ -626,8 +627,8 @@ static struct {char *name; Command command[2];} cmdlist[] = { "zoom_in", {view_zoom_in, 0}, }, //Can crash (when max zoom reached?). { "zoom_out", {view_zoom_out, 0}, }, { "toggle_zoom_type", {toggle_zoom_type, 0}, }, - { "uri", {load_uri, NOSPLIT} }, - { "js", {run_js, NOSPLIT} }, + { "uri", {load_uri, TRUE} }, + { "js", {run_js, TRUE} }, { "script", {run_external_js, 0} }, { "toggle_status", {toggle_status_cb, 0} }, { "spawn", {spawn, 0} }, @@ -635,19 +636,19 @@ static struct {char *name; Command command[2];} cmdlist[] = { "sh", {spawn_sh, 0} }, { "sync_sh", {spawn_sh_sync, 0} }, // needed for cookie handler { "exit", {close_uzbl, 0} }, - { "search", {search_forward_text, NOSPLIT} }, - { "search_reverse", {search_reverse_text, NOSPLIT} }, + { "search", {search_forward_text, TRUE} }, + { "search_reverse", {search_reverse_text, TRUE} }, { "dehilight", {dehilight, 0} }, { "toggle_insert_mode", {toggle_insert_mode, 0} }, - { "set", {set_var, NOSPLIT} }, - //{ "get", {get_var, NOSPLIT} }, - { "bind", {act_bind, NOSPLIT} }, + { "set", {set_var, TRUE} }, + //{ "get", {get_var, TRUE} }, + { "bind", {act_bind, TRUE} }, { "dump_config", {act_dump_config, 0} }, - { "keycmd", {keycmd, NOSPLIT} }, - { "keycmd_nl", {keycmd_nl, NOSPLIT} }, + { "keycmd", {keycmd, TRUE} }, + { "keycmd_nl", {keycmd_nl, TRUE} }, { "keycmd_bs", {keycmd_bs, 0} }, { "chain", {chain, 0} }, - { "print", {print, NOSPLIT} } + { "print", {print, TRUE} } }; static void @@ -657,7 +658,7 @@ commands_hash(void) uzbl.behave.commands = g_hash_table_new(g_str_hash, g_str_equal); for (i = 0; i < LENGTH(cmdlist); i++) - g_hash_table_insert(uzbl.behave.commands, cmdlist[i].name, cmdlist[i].command); + g_hash_table_insert(uzbl.behave.commands, cmdlist[i].key, &cmdlist[i].value); } /* -- CORE FUNCTIONS -- */ @@ -690,8 +691,8 @@ file_exists (const char * filename) { } static void -set_var(WebKitWebView *page, GArray *argv) { - (void) page; +set_var(WebKitWebView *page, GArray *argv, GString *result) { + (void) page; (void) result; gchar **split = g_strsplit(argv_idx(argv, 0), "=", 2); gchar *value = parseenv(g_strdup(split[1] ? g_strchug(split[1]) : " ")); set_var_value(g_strstrip(split[0]), value); @@ -700,18 +701,18 @@ set_var(WebKitWebView *page, GArray *argv) { } static void -print(WebKitWebView *page, GArray *argv) { - (void) page; +print(WebKitWebView *page, GArray *argv, GString *result) { + (void) page; (void) result; gchar* buf; buf = expand_vars(argv_idx(argv, 0)); - puts(buf); + puts(buf); /*TODO: result?*/ g_free(buf); } static void -act_bind(WebKitWebView *page, GArray *argv) { - (void) page; +act_bind(WebKitWebView *page, GArray *argv, GString *result) { + (void) page; (void) result; gchar **split = g_strsplit(argv_idx(argv, 0), " = ", 2); gchar *value = parseenv(g_strdup(split[1] ? g_strchug(split[1]) : " ")); add_binding(g_strstrip(split[0]), value); @@ -726,8 +727,8 @@ act_dump_config() { } static void -toggle_insert_mode(WebKitWebView *page, GArray *argv) { - (void)page; +toggle_insert_mode(WebKitWebView *page, GArray *argv, GString *result) { + (void) page; (void) result; if (argv_idx(argv, 0)) { if (strcmp (argv_idx(argv, 0), "0") == 0) { @@ -743,11 +744,13 @@ toggle_insert_mode(WebKitWebView *page, GArray *argv) { } static void -load_uri (WebKitWebView *web_view, GArray *argv) { +load_uri (WebKitWebView *web_view, GArray *argv, GString *result) { + (void) result; + if (argv_idx(argv, 0)) { GString* newuri = g_string_new (argv_idx(argv, 0)); if (g_strstr_len (argv_idx(argv, 0), 11, "javascript:") != NULL) { - run_js(web_view, argv); + run_js(web_view, argv, NULL); return; } if (g_strrstr (argv_idx(argv, 0), "://") == NULL && g_strstr_len (argv_idx(argv, 0), 5, "data:") == NULL) @@ -759,13 +762,16 @@ load_uri (WebKitWebView *web_view, GArray *argv) { } static void -run_js (WebKitWebView * web_view, GArray *argv) { +run_js (WebKitWebView * web_view, GArray *argv, GString *result) { + (void) result; + /* TODO: result! */ if (argv_idx(argv, 0)) webkit_web_view_execute_script (web_view, argv_idx(argv, 0)); } static void -run_external_js (WebKitWebView * web_view, GArray *argv) { +run_external_js (WebKitWebView * web_view, GArray *argv, GString *result) { + (void) result; if (argv_idx(argv, 0)) { GArray* lines = read_file_by_line (argv_idx (argv, 0)); gchar* js = NULL; @@ -816,18 +822,20 @@ search_text (WebKitWebView *page, GArray *argv, const gboolean forward) { } static void -search_forward_text (WebKitWebView *page, GArray *argv) { +search_forward_text (WebKitWebView *page, GArray *argv, GString *result) { + (void) result; search_text(page, argv, TRUE); } static void -search_reverse_text (WebKitWebView *page, GArray *argv) { +search_reverse_text (WebKitWebView *page, GArray *argv, GString *result) { + (void) result; search_text(page, argv, FALSE); } static void -dehilight (WebKitWebView *page, GArray *argv) { - (void) argv; +dehilight (WebKitWebView *page, GArray *argv, GString *result) { + (void) argv; (void) result; webkit_web_view_set_highlight_text_matches (page, FALSE); } @@ -852,48 +860,52 @@ new_window_load_uri (const gchar * uri) { } static void -chain (WebKitWebView *page, GArray *argv) { - (void)page; +chain (WebKitWebView *page, GArray *argv, GString *result) { + (void) page; (void) result; gchar *a = NULL; gchar **parts = NULL; guint i = 0; while ((a = argv_idx(argv, i++))) { parts = g_strsplit (a, " ", 2); - parse_command(parts[0], parts[1]); + parse_command(parts[0], parts[1], result); g_strfreev (parts); } } static void -keycmd (WebKitWebView *page, GArray *argv) { +keycmd (WebKitWebView *page, GArray *argv, GString *result) { (void)page; (void)argv; + (void)result; g_string_assign(uzbl.state.keycmd, argv_idx(argv, 0)); run_keycmd(FALSE); update_title(); } static void -keycmd_nl (WebKitWebView *page, GArray *argv) { +keycmd_nl (WebKitWebView *page, GArray *argv, GString *result) { (void)page; (void)argv; + (void)result; g_string_assign(uzbl.state.keycmd, argv_idx(argv, 0)); run_keycmd(TRUE); update_title(); } static void -keycmd_bs (WebKitWebView *page, GArray *argv) { +keycmd_bs (WebKitWebView *page, GArray *argv, GString *result) { (void)page; (void)argv; + (void)result; g_string_truncate(uzbl.state.keycmd, uzbl.state.keycmd->len - 1); update_title(); } static void -close_uzbl (WebKitWebView *page, GArray *argv) { +close_uzbl (WebKitWebView *page, GArray *argv, GString *result) { (void)page; (void)argv; + (void)result; gtk_main_quit (); } @@ -1222,16 +1234,16 @@ split_quoted(const gchar* src, const gboolean unquote) { } static void -spawn(WebKitWebView *web_view, GArray *argv) { - (void)web_view; +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 if (argv_idx(argv, 0)) run_command(argv_idx(argv, 0), 0, ((const gchar **) (argv->data + sizeof(gchar*))), FALSE, NULL); } static void -spawn_sync(WebKitWebView *web_view, GArray *argv) { - (void)web_view; +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*))), @@ -1239,8 +1251,8 @@ spawn_sync(WebKitWebView *web_view, GArray *argv) { } static void -spawn_sh(WebKitWebView *web_view, GArray *argv) { - (void)web_view; +spawn_sh(WebKitWebView *web_view, GArray *argv, GString *result) { + (void)web_view; (void)result; if (!uzbl.behave.shell_cmd) { g_printerr ("spawn_sh: shell_cmd is not set!\n"); return; @@ -1260,8 +1272,8 @@ spawn_sh(WebKitWebView *web_view, GArray *argv) { } static void -spawn_sh_sync(WebKitWebView *web_view, GArray *argv) { - (void)web_view; +spawn_sh_sync(WebKitWebView *web_view, GArray *argv, GString *result) { + (void)web_view; (void)result; if (!uzbl.behave.shell_cmd) { g_printerr ("spawn_sh_sync: shell_cmd is not set!\n"); return; @@ -1282,22 +1294,32 @@ spawn_sh_sync(WebKitWebView *web_view, GArray *argv) { } static void -parse_command(const char *cmd, const char *param) { - Command *c; +parse_command(const char *cmd, const char *param, GString *result) { + CommandInfo *c; if ((c = g_hash_table_lookup(uzbl.behave.commands, cmd))) { - guint i; gchar **par = split_quoted(param, TRUE); GArray *a = g_array_new (TRUE, FALSE, sizeof(gchar*)); - if (c[1] == NOSPLIT) { /* don't split */ + if (c->no_split) { /* don't split */ sharg_append(a, param); } else if (par) { for (i = 0; i < g_strv_length(par); i++) sharg_append(a, par[i]); } - c[0](uzbl.gui.web_view, a); + + if (result == NULL) { + GString *result_print = g_string_new(""); + + c->function(uzbl.gui.web_view, a, result_print); + if (uzbl.state.verbose) + printf("%s returned %s\n", cmd, result_print->str); + + g_string_free(result_print, TRUE); + } else { + c->function(uzbl.gui.web_view, a, result); + } g_strfreev (par); g_array_free (a, TRUE); @@ -1339,7 +1361,7 @@ static void cmd_load_uri() { GArray *a = g_array_new (TRUE, FALSE, sizeof(gchar*)); g_array_append_val (a, uzbl.state.uri); - load_uri(uzbl.gui.web_view, a); + load_uri(uzbl.gui.web_view, a, NULL); g_array_free (a, TRUE); } @@ -1607,7 +1629,7 @@ render_html() { enum {M_CMD, M_HTML}; static void -parse_cmd_line(const char *ctl_line) { +parse_cmd_line(const char *ctl_line, GString *result) { Behaviour *b = &uzbl.behave; size_t len=0; @@ -1640,7 +1662,7 @@ parse_cmd_line(const char *ctl_line) { else ctlstrip = g_strdup(ctl_line); tokens = g_strsplit(ctlstrip, " ", 2); - parse_command(tokens[0], tokens[1]); + parse_command(tokens[0], tokens[1], result); g_free(ctlstrip); g_strfreev(tokens); } @@ -1686,7 +1708,7 @@ control_fifo(GIOChannel *gio, GIOCondition condition) { g_error_free (err); } - parse_cmd_line(ctl_line); + parse_cmd_line(ctl_line, NULL); g_free(ctl_line); return TRUE; @@ -1742,7 +1764,7 @@ control_stdin(GIOChannel *gio, GIOCondition condition) { if ( (ret == G_IO_STATUS_ERROR) || (ret == G_IO_STATUS_EOF) ) return FALSE; - parse_cmd_line(ctl_line); + parse_cmd_line(ctl_line, NULL); g_free(ctl_line); return TRUE; @@ -1769,8 +1791,11 @@ create_stdin () { static gboolean control_socket(GIOChannel *chan) { + char *ctl_line; + GString *result = g_string_new(""); +#if 1 struct sockaddr_un remote; - char buffer[512], *ctl_line; + char buffer[512]; char temp[128]; int sock, clientsock, n, done; unsigned int t; @@ -1799,24 +1824,33 @@ control_socket(GIOChannel *chan) { } else { buffer[strlen (buffer)] = '\0'; } - close (clientsock); - ctl_line = g_strdup(buffer); - parse_cmd_line (ctl_line); -/* - TODO: we should be able to do it with this. but glib errors out with "Invalid argument" + ctl_line = g_strdup(buffer); + parse_cmd_line (ctl_line, result); + + send (clientsock, result->str, result->len, 0); + + close (clientsock); +#else + /* TODO: we should be able to do it with this. but glib errors out with "Invalid argument" */ GError *error = NULL; gsize len; GIOStatus ret; + ret = g_io_channel_read_line(chan, &ctl_line, &len, NULL, &error); if (ret == G_IO_STATUS_ERROR) g_error ("Error reading: %s\n", error->message); printf("Got line %s (%u bytes) \n",ctl_line, len); - if(ctl_line) { - parse_line(ctl_line); -*/ - + if (ctl_line) { + parse_cmd_line (ctl_line, result); + ret = g_io_channel_write_chars (chan, result->str, result->len, &len, &error); + if (ret == G_IO_STATUS_ERROR) { + g_error ("Error writing: %s", error->message) + } + } +#endif + g_string_free(result, TRUE); g_free(ctl_line); return TRUE; } @@ -1928,7 +1962,7 @@ key_press_cb (GtkWidget* window, GdkEventKey* event) if (event->keyval == GDK_Escape) { g_string_truncate(uzbl.state.keycmd, 0); update_title(); - dehilight(uzbl.gui.web_view, NULL); + dehilight(uzbl.gui.web_view, NULL, NULL); return TRUE; } @@ -1949,7 +1983,7 @@ key_press_cb (GtkWidget* window, GdkEventKey* event) } if (event->keyval == GDK_BackSpace) - keycmd_bs(NULL, NULL); + keycmd_bs(NULL, NULL, NULL); gboolean key_ret = FALSE; if ((event->keyval == GDK_Return) || (event->keyval == GDK_KP_Enter)) @@ -1968,7 +2002,7 @@ run_keycmd(const gboolean key_ret) { Action *act; if ((act = g_hash_table_lookup(uzbl.bindings, uzbl.state.keycmd->str))) { g_string_truncate(uzbl.state.keycmd, 0); - parse_command(act->name, act->param); + parse_command(act->name, act->param, NULL); return; } @@ -2010,7 +2044,7 @@ exec_paramcmd(const Action *act, const guint i) { g_string_printf (actionname, act->name, parampart->str); if (act->param) g_string_printf (actionparam, act->param, parampart->str); - parse_command(actionname->str, actionparam->str); + parse_command(actionname->str, actionparam->str, NULL); g_string_free(actionname, TRUE); g_string_free(actionparam, TRUE); g_string_free(parampart, TRUE); @@ -2171,13 +2205,13 @@ run_handler (const gchar *act, const gchar *args) { cp++; } - parse_command(parts[0], &(newargs->str[1])); + 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]); + parse_command(inparts[0], inparts[1], NULL); g_free(inparts[0]); g_free(inparts[1]); } @@ -2261,7 +2295,7 @@ settings_init () { Network *n = &uzbl.net; int i; for (i = 0; default_config[i].command != NULL; i++) { - parse_cmd_line(default_config[i].command); + parse_cmd_line(default_config[i].command, NULL); } if (!s->config_file) { @@ -2274,7 +2308,7 @@ settings_init () { gchar* line; while ((line = g_array_index(lines, gchar*, i))) { - parse_cmd_line (line); + parse_cmd_line (line, NULL); i ++; g_free (line); } diff --git a/uzbl.h b/uzbl.h index 8dd2c02..865b87e 100644 --- a/uzbl.h +++ b/uzbl.h @@ -11,8 +11,6 @@ * */ -#define NOSPLIT ((void*)1) - enum { /* statusbar symbols */ SYM_TITLE, SYM_URI, SYM_NAME, @@ -219,6 +217,7 @@ XDG_Var XDG[] = { "XDG_DATA_DIRS", "/usr/local/share/:/usr/share/" }, }; + /* Functions */ static void setup_scanner(); @@ -247,9 +246,6 @@ setup_signal(int signe, sigfunc *shandler); static gboolean set_var_value(gchar *name, gchar *val); -static void -print(WebKitWebView *page, GArray *argv); - static gboolean new_window_cb (WebKitWebView *web_view, WebKitWebFrame *frame, WebKitNetworkRequest *request, WebKitWebNavigationAction *navigation_action, WebKitWebPolicyDecision *policy_decision, gpointer user_data); @@ -262,12 +258,6 @@ create_web_view_cb (WebKitWebView *web_view, WebKitWebFrame *frame, gpointer us static gboolean download_cb (WebKitWebView *web_view, GObject *download, gpointer user_data); -static void -toggle_zoom_type (WebKitWebView* page, GArray *argv); - -static void -toggle_status_cb (WebKitWebView* page, GArray *argv); - static void link_hover_cb (WebKitWebView* page, const gchar* title, const gchar* link, gpointer data); @@ -304,51 +294,18 @@ new_action(const gchar *name, const gchar *param); static bool file_exists (const char * filename); -static void -toggle_insert_mode(WebKitWebView *page, GArray *argv); - -static void -load_uri (WebKitWebView * web_view, GArray *argv); - static void new_window_load_uri (const gchar * uri); -static void -chain (WebKitWebView *page, GArray *argv); - -static void -keycmd (WebKitWebView *page, GArray *argv); - -static void -keycmd_nl (WebKitWebView *page, GArray *argv); - -static void -keycmd_bs (WebKitWebView *page, GArray *argv); - -static void -close_uzbl (WebKitWebView *page, GArray *argv); - static gboolean run_command(const gchar *command, const guint npre, const gchar **args, const gboolean sync, char **output_stdout); static void -spawn(WebKitWebView *web_view, GArray *argv); - -static void -spawn_sh(WebKitWebView *web_view, GArray *argv); +parse_command(const char *cmd, const char *param, GString *result); static void -spawn_sync(WebKitWebView *web_view, GArray *argv); - -static void -spawn_sh_sync(WebKitWebView *web_view, GArray *argv); - -static void -parse_command(const char *cmd, const char *param); - -static void -parse_cmd_line(const char *ctl_line); +parse_cmd_line(const char *ctl_line, GString *result); static gchar* build_stream_name(int type, const gchar *dir); @@ -413,51 +370,102 @@ settings_init (); static void search_text (WebKitWebView *page, GArray *argv, const gboolean forward); +static void handle_cookies (SoupSession *session, + SoupMessage *msg, + gpointer user_data); static void -search_forward_text (WebKitWebView *page, GArray *argv); +save_cookies (SoupMessage *msg, + gpointer user_data); static void -search_reverse_text (WebKitWebView *page, GArray *argv); +act_dump_config(); static void -dehilight (WebKitWebView *page, GArray *argv); +render_html(); static void -run_js (WebKitWebView * web_view, GArray *argv); +set_timeout(int seconds); static void -run_external_js (WebKitWebView * web_view, GArray *argv); +dump_var_hash(gpointer k, gpointer v, gpointer ud); -static void handle_cookies (SoupSession *session, - SoupMessage *msg, - gpointer user_data); static void -save_cookies (SoupMessage *msg, - gpointer user_data); +dump_key_hash(gpointer k, gpointer v, gpointer ud); static void -set_var(WebKitWebView *page, GArray *argv); +dump_config(); + + +/* Commands */ + +typedef void (*Command)(WebKitWebView*, GArray *argv, GString *result); +typedef struct { + Command function; + gboolean no_split; +} CommandInfo; static void -act_bind(WebKitWebView *page, GArray *argv); +print(WebKitWebView *page, GArray *argv, GString *result); static void -act_dump_config(); +toggle_zoom_type (WebKitWebView* page, GArray *argv, GString *result); static void -render_html(); +toggle_status_cb (WebKitWebView* page, GArray *argv, GString *result); static void -set_timeout(int seconds); +toggle_insert_mode(WebKitWebView *page, GArray *argv, GString *result); static void -dump_var_hash(gpointer k, gpointer v, gpointer ud); +load_uri (WebKitWebView * web_view, GArray *argv, GString *result); static void -dump_key_hash(gpointer k, gpointer v, gpointer ud); +chain (WebKitWebView *page, GArray *argv, GString *result); static void -dump_config(); +keycmd (WebKitWebView *page, GArray *argv, GString *result); + +static void +keycmd_nl (WebKitWebView *page, GArray *argv, GString *result); + +static void +keycmd_bs (WebKitWebView *page, GArray *argv, GString *result); + +static void +close_uzbl (WebKitWebView *page, GArray *argv, GString *result); + +static void +spawn(WebKitWebView *web_view, GArray *argv, GString *result); + +static void +spawn_sh(WebKitWebView *web_view, GArray *argv, GString *result); + +static void +spawn_sync(WebKitWebView *web_view, GArray *argv, GString *result); + +static void +spawn_sh_sync(WebKitWebView *web_view, GArray *argv, GString *result); + +static void +search_forward_text (WebKitWebView *page, GArray *argv, GString *result); + +static void +search_reverse_text (WebKitWebView *page, GArray *argv, GString *result); + +static void +dehilight (WebKitWebView *page, GArray *argv, GString *result); + +static void +run_js (WebKitWebView * web_view, GArray *argv, GString *result); + +static void +run_external_js (WebKitWebView * web_view, GArray *argv, GString *result); + +static void +set_var(WebKitWebView *page, GArray *argv, GString *result); + +static void +act_bind(WebKitWebView *page, GArray *argv, GString *result); /* Command callbacks */ -- cgit v1.2.3 From 50a2ba82d9a667b8e7ad700be399318a8349d338 Mon Sep 17 00:00:00 2001 From: Dequis Date: Mon, 15 Jun 2009 01:09:40 -0300 Subject: Fix control_socket to use GIOChannel --- uzbl.c | 73 +++++++++++++++++++++++++----------------------------------------- uzbl.h | 3 +++ 2 files changed, 31 insertions(+), 45 deletions(-) (limited to 'uzbl.h') diff --git a/uzbl.c b/uzbl.c index 1bb1e41..e953d3d 100644 --- a/uzbl.c +++ b/uzbl.c @@ -1791,65 +1791,48 @@ create_stdin () { static gboolean control_socket(GIOChannel *chan) { - char *ctl_line; - GString *result = g_string_new(""); -#if 1 struct sockaddr_un remote; - char buffer[512]; - char temp[128]; - int sock, clientsock, n, done; - unsigned int t; - - sock = g_io_channel_unix_get_fd(chan); - - memset (buffer, 0, sizeof (buffer)); - - t = sizeof (remote); - clientsock = accept (sock, (struct sockaddr *) &remote, &t); - - done = 0; - do { - memset (temp, 0, sizeof (temp)); - n = recv (clientsock, temp, 128, 0); - if (n == 0) { - buffer[strlen (buffer)] = '\0'; - done = 1; - } - if (!done) - strcat (buffer, temp); - } while (!done); + unsigned int t = sizeof(remote); + int clientsock; + GIOChannel *clientchan; - if (strcmp (buffer, "\n") < 0) { - buffer[strlen (buffer) - 1] = '\0'; - } else { - buffer[strlen (buffer)] = '\0'; + 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); } - ctl_line = g_strdup(buffer); - parse_cmd_line (ctl_line, result); - - send (clientsock, result->str, result->len, 0); - - close (clientsock); -#else - /* TODO: we should be able to do it with this. but glib errors out with "Invalid argument" */ + return TRUE; +} + +static gboolean +control_client_socket(GIOChannel *clientchan) { + char *ctl_line; + GString *result = g_string_new(""); GError *error = NULL; - gsize len; GIOStatus ret; + gsize len; - ret = g_io_channel_read_line(chan, &ctl_line, &len, NULL, &error); - if (ret == G_IO_STATUS_ERROR) + ret = g_io_channel_read_line(clientchan, &ctl_line, &len, NULL, &error); + if (ret == G_IO_STATUS_ERROR) { g_error ("Error reading: %s\n", error->message); + return FALSE; + } else if (ret == G_IO_STATUS_EOF) { + /* socket closed, remove channel watch from main loop */ + return FALSE; + } - printf("Got line %s (%u bytes) \n",ctl_line, len); if (ctl_line) { parse_cmd_line (ctl_line, result); - ret = g_io_channel_write_chars (chan, result->str, result->len, &len, &error); + ret = g_io_channel_write_chars (clientchan, result->str, result->len, + &len, &error); if (ret == G_IO_STATUS_ERROR) { - g_error ("Error writing: %s", error->message) + g_error ("Error writing: %s", error->message); } } -#endif + g_string_free(result, TRUE); g_free(ctl_line); return TRUE; diff --git a/uzbl.h b/uzbl.h index 865b87e..21840f3 100644 --- a/uzbl.h +++ b/uzbl.h @@ -328,6 +328,9 @@ init_socket(gchar *dir); static gboolean control_socket(GIOChannel *chan); +static gboolean +control_client_socket(GIOChannel *chan); + static void update_title (void); -- cgit v1.2.3 From ed39cbe56f8923407604a1306a179529521ecd26 Mon Sep 17 00:00:00 2001 From: Dequis Date: Mon, 15 Jun 2009 03:53:55 -0300 Subject: Replaced disable_stdin with uzbl -c - That means, read config from stdin. So stdin is always disabled, except when you tell uzbl to read from there. The default one in the xdg config path is still loaded. Fixes problems when sending uzbl to background. --- uzbl.c | 9 +++++---- uzbl.h | 1 - 2 files changed, 5 insertions(+), 5 deletions(-) (limited to 'uzbl.h') diff --git a/uzbl.c b/uzbl.c index 407070e..8500d9e 100644 --- a/uzbl.c +++ b/uzbl.c @@ -98,7 +98,6 @@ const struct { /* --------------------------------------------------------------------------------------- */ { "uri", PTR(uzbl.state.uri, STR, 1, cmd_load_uri)}, { "verbose", PTR(uzbl.state.verbose, INT, 1, NULL)}, - { "disable_stdin", PTR(uzbl.behave.disable_stdin, INT, 1, NULL)}, { "mode", PTR(uzbl.behave.mode, INT, 0, NULL)}, { "inject_html", PTR(uzbl.behave.inject_html, STR, 0, cmd_inject_html)}, { "base_url", PTR(uzbl.behave.base_url, STR, 1, NULL)}, @@ -2286,6 +2285,11 @@ settings_init () { parse_cmd_line(default_config[i].command, NULL); } + if (g_strcmp0(s->config_file, "-") == 0) { + s->config_file = NULL; + create_stdin(); + } + if (!s->config_file) { s->config_file = find_xdg_file (0, "/uzbl/config"); } @@ -2572,9 +2576,6 @@ main (int argc, char* argv[]) { /* WebInspector */ set_up_inspector(); - if (!uzbl.behave.disable_stdin) - create_stdin(); - if (verbose_override > uzbl.state.verbose) uzbl.state.verbose = verbose_override; diff --git a/uzbl.h b/uzbl.h index 21840f3..2b36edd 100644 --- a/uzbl.h +++ b/uzbl.h @@ -142,7 +142,6 @@ typedef struct { gboolean insert_mode; gboolean status_top; gboolean reset_command_mode; - gboolean disable_stdin; gchar* modkey; guint modmask; guint http_debug; -- cgit v1.2.3 From fedfe2c06b3e01d5dede2cbab395a0ab48bb94e9 Mon Sep 17 00:00:00 2001 From: Dequis Date: Mon, 15 Jun 2009 20:37:55 -0300 Subject: Use JavaScriptCore for evaluation, with Uzbl.run() Both "js" and "script" commands use eval_js(), which creates an instance of the Uzbl object class (created by js_init()) which right now provides only a run() method (handled by js_run_command()). After evaluating the code, eval_js() removes the object so the scripts from the loaded page can't access it. eval_js() supports returning a string result, and you can use it with uzblctrl to query the DOM. Uzbl.run() also returns a string, but the only useful thing you can do right now with that is to print @uri or other variables. --- uzbl.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- uzbl.h | 10 +++++++ 2 files changed, 109 insertions(+), 4 deletions(-) (limited to 'uzbl.h') diff --git a/uzbl.c b/uzbl.c index 8500d9e..a596b0e 100644 --- a/uzbl.c +++ b/uzbl.c @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -760,12 +761,106 @@ load_uri (WebKitWebView *web_view, GArray *argv, GString *result) { } } + +/* Javascript*/ + +static JSValueRef +js_run_command (JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, + size_t argumentCount, const JSValueRef arguments[], + JSValueRef* exception) { + (void) function; + (void) thisObject; + (void) exception; + + JSStringRef js_result_string; + GString *result = g_string_new(""); + + if (argumentCount >= 1) { + JSStringRef arg = JSValueToStringCopy(ctx, arguments[0], NULL); + size_t arg_size = JSStringGetMaximumUTF8CStringSize(arg); + char ctl_line[arg_size]; + JSStringGetUTF8CString(arg, ctl_line, arg_size); + + parse_cmd_line(ctl_line, result); + + JSStringRelease(arg); + } + js_result_string = JSStringCreateWithUTF8CString(result->str); + + g_string_free(result, TRUE); + + return JSValueMakeString(ctx, js_result_string); +} + +static JSStaticFunction js_static_functions[] = { + {"run", js_run_command, kJSPropertyAttributeNone}, +}; + +static void +js_init() { + /* This function creates the class and its definition, only once */ + if (!uzbl.js.initialized) { + /* it would be pretty cool to make this dynamic */ + uzbl.js.classdef = kJSClassDefinitionEmpty; + uzbl.js.classdef.staticFunctions = js_static_functions; + + uzbl.js.classref = JSClassCreate(&uzbl.js.classdef); + } +} + + +static void +eval_js(WebKitWebView * web_view, gchar *script, GString *result) { + WebKitWebFrame *frame; + JSGlobalContextRef context; + JSObjectRef globalobject; + JSStringRef var_name; + + JSStringRef js_script; + 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), + kJSClassAttributeNone, NULL); + + /* 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)) { + js_result_string = JSValueToStringCopy(context, js_result, NULL); + js_result_size = JSStringGetMaximumUTF8CStringSize(js_result_string); + + if (js_result_size) { + char js_result_utf8[js_result_size]; + JSStringGetUTF8CString(js_result_string, js_result_utf8, js_result_size); + g_string_assign(result, js_result_utf8); + } + + JSStringRelease(js_result_string); + } + + /* cleanup */ + JSObjectDeleteProperty(context, globalobject, var_name, NULL); + + JSStringRelease(var_name); + JSStringRelease(js_script); +} + static void run_js (WebKitWebView * web_view, GArray *argv, GString *result) { - (void) result; - /* TODO: result! */ + if (argv_idx(argv, 0)) - webkit_web_view_execute_script (web_view, argv_idx(argv, 0)); + eval_js(web_view, argv_idx(argv, 0), result); } static void @@ -796,7 +891,7 @@ run_external_js (WebKitWebView * web_view, GArray *argv, GString *result) { g_free (js); js = newjs; } - webkit_web_view_execute_script (web_view, js); + eval_js (web_view, js, result); g_free (js); g_array_free (lines, TRUE); } diff --git a/uzbl.h b/uzbl.h index 2b36edd..2cf0346 100644 --- a/uzbl.h +++ b/uzbl.h @@ -176,6 +176,12 @@ typedef struct { GHashTable* commands; } Behaviour; +/* javascript */ +typedef struct { + gboolean initialized; + JSClassDefinition classdef; + JSClassRef classref; +} Javascript; /* main uzbl data structure */ typedef struct { @@ -184,6 +190,7 @@ typedef struct { Network net; Behaviour behave; Communication comm; + Javascript js; Window xwin; GScanner *scan; @@ -457,6 +464,9 @@ search_reverse_text (WebKitWebView *page, GArray *argv, GString *result); static void dehilight (WebKitWebView *page, GArray *argv, GString *result); +static void +eval_js(WebKitWebView * web_view, gchar *script, GString *result); + static void run_js (WebKitWebView * web_view, GArray *argv, GString *result); -- cgit v1.2.3 From f1a114c9e201b09eb81ba3e93365440f8e95f956 Mon Sep 17 00:00:00 2001 From: Dequis Date: Sat, 20 Jun 2009 01:20:49 -0300 Subject: Revert "Replaced disable_stdin with uzbl -c -" This reverts commit ed39cbe56f8923407604a1306a179529521ecd26. --- uzbl.c | 9 ++++----- uzbl.h | 1 + 2 files changed, 5 insertions(+), 5 deletions(-) (limited to 'uzbl.h') diff --git a/uzbl.c b/uzbl.c index 8ed8788..751cf6b 100644 --- a/uzbl.c +++ b/uzbl.c @@ -99,6 +99,7 @@ const struct { /* --------------------------------------------------------------------------------------- */ { "uri", PTR(uzbl.state.uri, STR, 1, cmd_load_uri)}, { "verbose", PTR(uzbl.state.verbose, INT, 1, NULL)}, + { "disable_stdin", PTR(uzbl.behave.disable_stdin, INT, 1, NULL)}, { "mode", PTR(uzbl.behave.mode, INT, 0, NULL)}, { "inject_html", PTR(uzbl.behave.inject_html, STR, 0, cmd_inject_html)}, { "base_url", PTR(uzbl.behave.base_url, STR, 1, NULL)}, @@ -2383,11 +2384,6 @@ settings_init () { parse_cmd_line(default_config[i].command, NULL); } - if (g_strcmp0(s->config_file, "-") == 0) { - s->config_file = NULL; - create_stdin(); - } - if (!s->config_file) { s->config_file = find_xdg_file (0, "/uzbl/config"); } @@ -2674,6 +2670,9 @@ main (int argc, char* argv[]) { /* WebInspector */ set_up_inspector(); + if (!uzbl.behave.disable_stdin) + create_stdin(); + if (verbose_override > uzbl.state.verbose) uzbl.state.verbose = verbose_override; diff --git a/uzbl.h b/uzbl.h index 2cf0346..bbbb9b0 100644 --- a/uzbl.h +++ b/uzbl.h @@ -142,6 +142,7 @@ typedef struct { gboolean insert_mode; gboolean status_top; gboolean reset_command_mode; + gboolean disable_stdin; gchar* modkey; guint modmask; guint http_debug; -- cgit v1.2.3 From d854da32ff575ff21dc6ffc0bc63737a76a7f2a6 Mon Sep 17 00:00:00 2001 From: Dequis Date: Sat, 20 Jun 2009 01:21:27 -0300 Subject: Revert "Add disable_stdin config option" This reverts commit 97526404f52875d82d584f18420be72fdc300d93. --- uzbl.c | 6 ++---- uzbl.h | 1 - 2 files changed, 2 insertions(+), 5 deletions(-) (limited to 'uzbl.h') diff --git a/uzbl.c b/uzbl.c index 751cf6b..733fef9 100644 --- a/uzbl.c +++ b/uzbl.c @@ -99,7 +99,6 @@ const struct { /* --------------------------------------------------------------------------------------- */ { "uri", PTR(uzbl.state.uri, STR, 1, cmd_load_uri)}, { "verbose", PTR(uzbl.state.verbose, INT, 1, NULL)}, - { "disable_stdin", PTR(uzbl.behave.disable_stdin, INT, 1, NULL)}, { "mode", PTR(uzbl.behave.mode, INT, 0, NULL)}, { "inject_html", PTR(uzbl.behave.inject_html, STR, 0, cmd_inject_html)}, { "base_url", PTR(uzbl.behave.base_url, STR, 1, NULL)}, @@ -2669,9 +2668,8 @@ main (int argc, char* argv[]) { /* WebInspector */ set_up_inspector(); - - if (!uzbl.behave.disable_stdin) - create_stdin(); + + create_stdin(); if (verbose_override > uzbl.state.verbose) uzbl.state.verbose = verbose_override; diff --git a/uzbl.h b/uzbl.h index bbbb9b0..2cf0346 100644 --- a/uzbl.h +++ b/uzbl.h @@ -142,7 +142,6 @@ typedef struct { gboolean insert_mode; gboolean status_top; gboolean reset_command_mode; - gboolean disable_stdin; gchar* modkey; guint modmask; guint http_debug; -- cgit v1.2.3 From 07a6397dfc1e55b2fc949cfc5ece091f4860945c Mon Sep 17 00:00:00 2001 From: Dequis Date: Mon, 22 Jun 2009 17:16:52 -0300 Subject: Cleanup diff on uzbl.h --- uzbl.h | 136 ++++++++++++++++++++++++++++++++--------------------------------- 1 file changed, 66 insertions(+), 70 deletions(-) (limited to 'uzbl.h') diff --git a/uzbl.h b/uzbl.h index 2cf0346..37b76fa 100644 --- a/uzbl.h +++ b/uzbl.h @@ -223,7 +223,6 @@ XDG_Var XDG[] = { "XDG_DATA_DIRS", "/usr/local/share/:/usr/share/" }, }; - /* Functions */ static void setup_scanner(); @@ -252,6 +251,9 @@ setup_signal(int signe, sigfunc *shandler); static gboolean set_var_value(gchar *name, gchar *val); +static void +print(WebKitWebView *page, GArray *argv, GString *result); + static gboolean new_window_cb (WebKitWebView *web_view, WebKitWebFrame *frame, WebKitNetworkRequest *request, WebKitWebNavigationAction *navigation_action, WebKitWebPolicyDecision *policy_decision, gpointer user_data); @@ -264,6 +266,12 @@ create_web_view_cb (WebKitWebView *web_view, WebKitWebFrame *frame, gpointer us static gboolean download_cb (WebKitWebView *web_view, GObject *download, gpointer user_data); +static void +toggle_zoom_type (WebKitWebView* page, GArray *argv, GString *result); + +static void +toggle_status_cb (WebKitWebView* page, GArray *argv, GString *result); + static void link_hover_cb (WebKitWebView* page, const gchar* title, const gchar* link, gpointer data); @@ -300,13 +308,46 @@ new_action(const gchar *name, const gchar *param); static bool file_exists (const char * filename); +static void +toggle_insert_mode(WebKitWebView *page, GArray *argv, GString *result); + +static void +load_uri (WebKitWebView * web_view, GArray *argv, GString *result); + static void new_window_load_uri (const gchar * uri); +static void +chain (WebKitWebView *page, GArray *argv, GString *result); + +static void +keycmd (WebKitWebView *page, GArray *argv, GString *result); + +static void +keycmd_nl (WebKitWebView *page, GArray *argv, GString *result); + +static void +keycmd_bs (WebKitWebView *page, GArray *argv, GString *result); + +static void +close_uzbl (WebKitWebView *page, GArray *argv, GString *result); + static gboolean run_command(const gchar *command, const guint npre, const gchar **args, const gboolean sync, char **output_stdout); +static void +spawn(WebKitWebView *web_view, GArray *argv, GString *result); + +static void +spawn_sh(WebKitWebView *web_view, GArray *argv, GString *result); + +static void +spawn_sync(WebKitWebView *web_view, GArray *argv, GString *result); + +static void +spawn_sh_sync(WebKitWebView *web_view, GArray *argv, GString *result); + static void parse_command(const char *cmd, const char *param, GString *result); @@ -379,106 +420,61 @@ settings_init (); static void search_text (WebKitWebView *page, GArray *argv, const gboolean forward); -static void handle_cookies (SoupSession *session, - SoupMessage *msg, - gpointer user_data); -static void -save_cookies (SoupMessage *msg, - gpointer user_data); - -static void -act_dump_config(); - -static void -render_html(); - static void -set_timeout(int seconds); - -static void -dump_var_hash(gpointer k, gpointer v, gpointer ud); - -static void -dump_key_hash(gpointer k, gpointer v, gpointer ud); - -static void -dump_config(); - - -/* Commands */ - -typedef void (*Command)(WebKitWebView*, GArray *argv, GString *result); -typedef struct { - Command function; - gboolean no_split; -} CommandInfo; - -static void -print(WebKitWebView *page, GArray *argv, GString *result); - -static void -toggle_zoom_type (WebKitWebView* page, GArray *argv, GString *result); - -static void -toggle_status_cb (WebKitWebView* page, GArray *argv, GString *result); - -static void -toggle_insert_mode(WebKitWebView *page, GArray *argv, GString *result); - -static void -load_uri (WebKitWebView * web_view, GArray *argv, GString *result); - -static void -chain (WebKitWebView *page, GArray *argv, GString *result); - -static void -keycmd (WebKitWebView *page, GArray *argv, GString *result); +search_forward_text (WebKitWebView *page, GArray *argv, GString *result); static void -keycmd_nl (WebKitWebView *page, GArray *argv, GString *result); +search_reverse_text (WebKitWebView *page, GArray *argv, GString *result); static void -keycmd_bs (WebKitWebView *page, GArray *argv, GString *result); +dehilight (WebKitWebView *page, GArray *argv, GString *result); static void -close_uzbl (WebKitWebView *page, GArray *argv, GString *result); +run_js (WebKitWebView * web_view, GArray *argv, GString *result); static void -spawn(WebKitWebView *web_view, GArray *argv, GString *result); +run_external_js (WebKitWebView * web_view, GArray *argv, GString *result); static void -spawn_sh(WebKitWebView *web_view, GArray *argv, GString *result); +eval_js(WebKitWebView * web_view, gchar *script, GString *result); +static void handle_cookies (SoupSession *session, + SoupMessage *msg, + gpointer user_data); static void -spawn_sync(WebKitWebView *web_view, GArray *argv, GString *result); +save_cookies (SoupMessage *msg, + gpointer user_data); static void -spawn_sh_sync(WebKitWebView *web_view, GArray *argv, GString *result); +set_var(WebKitWebView *page, GArray *argv, GString *result); static void -search_forward_text (WebKitWebView *page, GArray *argv, GString *result); +act_bind(WebKitWebView *page, GArray *argv, GString *result); static void -search_reverse_text (WebKitWebView *page, GArray *argv, GString *result); +act_dump_config(); static void -dehilight (WebKitWebView *page, GArray *argv, GString *result); +render_html(); static void -eval_js(WebKitWebView * web_view, gchar *script, GString *result); +set_timeout(int seconds); static void -run_js (WebKitWebView * web_view, GArray *argv, GString *result); +dump_var_hash(gpointer k, gpointer v, gpointer ud); static void -run_external_js (WebKitWebView * web_view, GArray *argv, GString *result); +dump_key_hash(gpointer k, gpointer v, gpointer ud); static void -set_var(WebKitWebView *page, GArray *argv, GString *result); +dump_config(); -static void -act_bind(WebKitWebView *page, GArray *argv, GString *result); +typedef void (*Command)(WebKitWebView*, GArray *argv, GString *result); +typedef struct { + Command function; + gboolean no_split; +} CommandInfo; /* Command callbacks */ static void -- cgit v1.2.3