From 3d658d9c10809ec4ec76fb557535a2f6383cff45 Mon Sep 17 00:00:00 2001 From: keis Date: Sat, 15 Jan 2011 22:15:29 +0100 Subject: quote and escape strings in events --- src/callbacks.c | 8 ++--- src/events.c | 19 ++++++++--- src/uzbl-core.c | 99 ++++++++++++++++++++++++++++++++++++--------------------- src/uzbl-core.h | 5 +-- 4 files changed, 83 insertions(+), 48 deletions(-) (limited to 'src') diff --git a/src/callbacks.c b/src/callbacks.c index 12bbc14..78a5090 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -569,9 +569,9 @@ button_press_cb (GtkWidget* window, GdkEventButton* event) { /* left click */ if(event->button == 1) { if((context & WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE)) - send_event(FORM_ACTIVE, NULL, TYPE_STR, "button1", NULL); + send_event(FORM_ACTIVE, NULL, TYPE_NAME, "button1", NULL); else if((context & WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT)) - send_event(ROOT_ACTIVE, NULL, TYPE_STR, "button1", NULL); + send_event(ROOT_ACTIVE, NULL, TYPE_NAME, "button1", NULL); } else if(event->button == 2 && !(context & WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE)) { sendev = TRUE; @@ -584,7 +584,7 @@ button_press_cb (GtkWidget* window, GdkEventButton* event) { if(sendev) { details = g_strdup_printf("Button%d", event->button); - send_event(KEY_PRESS, NULL, TYPE_STR, details, NULL); + send_event(KEY_PRESS, NULL, TYPE_NAME, details, NULL); g_free (details); } } @@ -613,7 +613,7 @@ button_release_cb (GtkWidget* window, GdkEventButton* event) { if(sendev) { details = g_strdup_printf("Button%d", event->button); - send_event(KEY_RELEASE, NULL, TYPE_STR, details, NULL); + send_event(KEY_RELEASE, NULL, TYPE_NAME, details, NULL); g_free (details); } } diff --git a/src/events.c b/src/events.c index b9b5a18..e8c42a3 100644 --- a/src/events.c +++ b/src/events.c @@ -5,6 +5,7 @@ #include "uzbl-core.h" #include "events.h" +#include "util.h" UzblCore uzbl; @@ -140,6 +141,7 @@ send_event_stdout(GString *msg) { void vsend_event(int type, const gchar *custom_event, va_list vargs) { GString *event_message = g_string_sized_new (512); + if (type >= LAST_EVENT) return; const gchar *event = custom_event ? custom_event : event_table[type]; @@ -149,16 +151,23 @@ vsend_event(int type, const gchar *custom_event, va_list vargs) { uzbl.state.instance_name, event); while ((next = va_arg (vargs, int)) != 0) { + g_string_append_c(event_message, ' '); switch(next) { case TYPE_INT: - g_string_append_printf (event_message, " %d", va_arg (vargs, int)); + g_string_append_printf (event_message, "%d", va_arg (vargs, int)); break; case TYPE_STR: - g_string_append_printf (event_message, " %s", va_arg (vargs, char*)); + g_string_append_c (event_message, '\''); + append_escaped (event_message, va_arg (vargs, char*)); + g_string_append_c (event_message, '\''); + break; + case TYPE_FORMATTEDSTR: + case TYPE_NAME: + g_string_append (event_message, va_arg (vargs, char*)); break; case TYPE_FLOAT: // ‘float’ is promoted to ‘double’ when passed through ‘...’ - g_string_append_printf (event_message, " %.2g", va_arg (vargs, double)); + g_string_append_printf (event_message, "%.2f", va_arg (vargs, double)); break; } } @@ -202,12 +211,12 @@ key_to_event(guint keyval, gint mode) { ucs[ulen] = 0; send_event(mode == GDK_KEY_PRESS ? KEY_PRESS : KEY_RELEASE, - NULL, TYPE_STR, ucs, NULL); + NULL, TYPE_FORMATTEDSTR, ucs, NULL); } /* send keysym for non-printable chars */ else { send_event(mode == GDK_KEY_PRESS ? KEY_PRESS : KEY_RELEASE, - NULL, TYPE_STR, gdk_keyval_name(keyval), NULL); + NULL, TYPE_NAME, gdk_keyval_name(keyval), NULL); } } diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 7c0e2c3..ca936c1 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -337,7 +337,7 @@ expand(const char* s, guint recurse) { void clean_up(void) { if (uzbl.info.pid_str) { - send_event (INSTANCE_EXIT, NULL, TYPE_STR, uzbl.info.pid_str, NULL); + send_event (INSTANCE_EXIT, NULL, TYPE_INT, getpid(), NULL); g_free(uzbl.info.pid_str); uzbl.info.pid_str = NULL; } @@ -597,7 +597,7 @@ event(WebKitWebView *page, GArray *argv, GString *result) { else return; - send_event(0, event_name->str, TYPE_STR, split[1] ? split[1] : "", NULL); + send_event(0, event_name->str, TYPE_FORMATTEDSTR, split[1] ? split[1] : "", NULL); g_string_free(event_name, TRUE); g_strfreev(split); @@ -1110,8 +1110,8 @@ run_parsed_command(const CommandInfo *c, GArray *a, GString *result) { while ((p = argv_idx(a, i++))) g_string_append_printf(param, " '%s'", p); send_event(COMMAND_EXECUTED, NULL, - TYPE_STR, c->key, - TYPE_STR, param->str, + TYPE_NAME, c->key, + TYPE_FORMATTEDSTR, param->str, NULL); g_string_free(param, TRUE); } @@ -1153,7 +1153,9 @@ parse_command_parts(const gchar *line, GArray *a) { c = g_hash_table_lookup(uzbl.behave.commands, tokens[0]); if(!c) { - send_event(COMMAND_ERROR, exp_line, NULL); + send_event(COMMAND_ERROR, NULL, + TYPE_STR, exp_line, + NULL); g_free(exp_line); g_strfreev(tokens); return NULL; @@ -1182,7 +1184,7 @@ parse_command(const char *cmd, const char *params, GString *result) { g_array_free (a, TRUE); } else { send_event(COMMAND_ERROR, NULL, - TYPE_STR, cmd, + TYPE_NAME, cmd, TYPE_STR, params ? params : "", NULL); } @@ -1220,32 +1222,41 @@ set_var_value(const gchar *name, gchar *val) { char *endp = NULL; char *buf = NULL; char *invalid_chars = "\t^°!\"§$%&/()=?'`'+~*'#-:,;@<>| \\{}[]¹²³¼½"; - GString *msg; if( (c = g_hash_table_lookup(uzbl.comm.proto_var, name)) ) { if(!c->writeable) return FALSE; - msg = g_string_new(name); - - /* check for the variable type */ - if (c->type == TYPE_STR) { + switch(c->type) { + case TYPE_STR: buf = g_strdup(val); g_free(*c->ptr.s); *c->ptr.s = buf; - g_string_append_printf(msg, " str %s", buf); - - } else if(c->type == TYPE_INT) { + send_event (VARIABLE_SET, NULL, + TYPE_NAME, name, + TYPE_NAME, "str", + TYPE_STR, *c->ptr.s ? *c->ptr.s : " ", + NULL); + break; + case TYPE_INT: *c->ptr.i = (int)strtoul(val, &endp, 10); - g_string_append_printf(msg, " int %d", *c->ptr.i); - - } else if (c->type == TYPE_FLOAT) { + send_event (VARIABLE_SET, NULL, + TYPE_NAME, name, + TYPE_NAME, "int", + TYPE_INT, *c->ptr.i, + NULL); + break; + case TYPE_FLOAT: *c->ptr.f = strtod(val, &endp); - g_string_append_printf(msg, " float %f", *c->ptr.f); + send_event (VARIABLE_SET, NULL, + TYPE_NAME, name, + TYPE_NAME, "float", + TYPE_FLOAT, *c->ptr.f, + NULL); + break; + default: + g_assert_not_reached(); } - send_event(VARIABLE_SET, NULL, TYPE_STR, msg->str, NULL); - g_string_free(msg,TRUE); - /* invoke a command specific function */ if(c->func) c->func(); } else { @@ -1268,10 +1279,11 @@ set_var_value(const gchar *name, gchar *val) { g_hash_table_insert(uzbl.comm.proto_var, g_strdup(name), (gpointer) c); - msg = g_string_new(name); - g_string_append_printf(msg, " str %s", buf); - send_event(VARIABLE_SET, NULL, TYPE_STR, msg->str, NULL); - g_string_free(msg,TRUE); + send_event (VARIABLE_SET, NULL, + TYPE_NAME, name, + TYPE_NAME, "str", + TYPE_STR, buf, + NULL); } update_title(); return TRUE; @@ -1561,23 +1573,36 @@ void dump_var_hash_as_event(gpointer k, gpointer v, gpointer ud) { (void) ud; uzbl_cmdprop *c = v; - GString *msg; if(!c->dump) return; /* check for the variable type */ - msg = g_string_new((char *)k); - if (c->type == TYPE_STR) { - g_string_append_printf(msg, " str %s", *c->ptr.s ? *c->ptr.s : " "); - } else if(c->type == TYPE_INT) { - g_string_append_printf(msg, " int %d", *c->ptr.i); - } else if (c->type == TYPE_FLOAT) { - g_string_append_printf(msg, " float %f", *c->ptr.f); + switch(c->type) { + case TYPE_STR: + send_event (VARIABLE_SET, NULL, + TYPE_NAME, (char*)k, + TYPE_NAME, "str", + TYPE_STR, *c->ptr.s ? *c->ptr.s : " ", + NULL); + break; + case TYPE_INT: + send_event (VARIABLE_SET, NULL, + TYPE_NAME, (char*)k, + TYPE_NAME, "int", + TYPE_INT, *c->ptr.i, + NULL); + break; + case TYPE_FLOAT: + send_event (VARIABLE_SET, NULL, + TYPE_NAME, (char*)k, + TYPE_NAME, "float", + TYPE_FLOAT, *c->ptr.f, + NULL); + break; + default: + g_assert_not_reached(); } - - send_event(VARIABLE_SET, NULL, TYPE_STR, msg->str, NULL); - g_string_free(msg, TRUE); } void @@ -1784,7 +1809,7 @@ main (int argc, char* argv[]) { uzbl.info.pid_str = g_strdup_printf("%d", getpid()); g_setenv("UZBL_PID", uzbl.info.pid_str, TRUE); - send_event(INSTANCE_START, NULL, TYPE_STR, uzbl.info.pid_str, NULL); + send_event(INSTANCE_START, NULL, TYPE_INT, getpid(), NULL); if (uzbl.state.plug_mode) { send_event(PLUG_CREATED, NULL, TYPE_INT, gtk_plug_get_id (uzbl.gui.plug), NULL); diff --git a/src/uzbl-core.h b/src/uzbl-core.h index 649f159..9e72511 100644 --- a/src/uzbl-core.h +++ b/src/uzbl-core.h @@ -241,8 +241,9 @@ extern UzblCore uzbl; /* Main Uzbl object */ typedef void sigfunc(int); /* Uzbl variables */ -/* uzbl variables */ -enum ptr_type {TYPE_INT = 1, TYPE_STR, TYPE_FLOAT}; +enum ptr_type {TYPE_INT = 1, TYPE_STR, TYPE_FLOAT, + TYPE_NAME, TYPE_FORMATTEDSTR // used by send_event +}; typedef struct { enum ptr_type type; union { -- cgit v1.2.3