aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar keis <keijser@gmail.com>2011-01-15 22:15:29 +0100
committerGravatar keis <keijser@gmail.com>2011-02-15 21:17:10 +0100
commit3d658d9c10809ec4ec76fb557535a2f6383cff45 (patch)
tree574c914ee860e5a758e2f2743c85417cc1d65ffa /src
parent2b7539061d8d437ef1507a8cf68d9b565d07c66e (diff)
quote and escape strings in events
Diffstat (limited to 'src')
-rw-r--r--src/callbacks.c8
-rw-r--r--src/events.c19
-rw-r--r--src/uzbl-core.c99
-rw-r--r--src/uzbl-core.h5
4 files changed, 83 insertions, 48 deletions
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 {