diff options
-rwxr-xr-x | examples/data/uzbl/scripts/event_manager.py | 48 | ||||
-rw-r--r-- | uzbl-core.c | 84 | ||||
-rw-r--r-- | uzbl-core.h | 9 |
3 files changed, 83 insertions, 58 deletions
diff --git a/examples/data/uzbl/scripts/event_manager.py b/examples/data/uzbl/scripts/event_manager.py index 65089c1..0332178 100755 --- a/examples/data/uzbl/scripts/event_manager.py +++ b/examples/data/uzbl/scripts/event_manager.py @@ -45,7 +45,6 @@ import sys import select import re import types -import pprint import socket from traceback import print_exc @@ -83,13 +82,13 @@ config = { # Define some globals. _VALIDSETKEY = re.compile("^[a-zA-Z][a-zA-Z0-9_]*$").match _SCRIPTNAME = os.path.basename(sys.argv[0]) - +_TYPECONVERT = {'int': int, 'float': float, 'str': str} def echo(msg): '''Prints only if the verbose flag has been set.''' if config['verbose']: - sys.stderr.write("%s: %s\n" % (_SCRIPTNAME, msg)) + sys.stdout.write("%s: %s\n" % (_SCRIPTNAME, msg)) def counter(): @@ -177,12 +176,13 @@ class PluginManager(dict): if not hasattr(plugin, 'init'): raise ImportError('plugin missing main "init" function.') - print "Loaded plugin: %r" % name - except: print_exc() self._unload_plugin(name) + if len(self.keys()): + echo("loaded plugin(s): %s" % ', '.join(self.keys())) + def reload_plugins(self): '''Unload all loaded plugins then run load_plugins() again. @@ -214,6 +214,16 @@ class UzblInstance: '''Updates the config dict and relays any changes back to the uzbl instance via the set function.''' + if type(value) == types.BooleanType: + value = int(value) + + if key in self.keys() and type(value) != type(self[key]): + raise TypeError("%r for %r" % (type(value), key)) + + else: + # All custom variables are strings. + value = "" if value is None else str(value) + self._setcmd(key, value) dict.__setitem__(self, key, value) @@ -280,8 +290,6 @@ class UzblInstance: def _init_plugins(self): '''Call the init() function in every plugin.''' - pprint.pprint(self.plugins) - for plugin in self.plugins.keys(): try: self.plugins[plugin].init(self) @@ -344,7 +352,7 @@ class UzblInstance: d = {'handler': handler, 'args': args, 'kargs': kargs} self.handlers[event][id] = d - print "Added handler:", event, d + echo("added handler for %s: %r" % (event, d)) # The unique id is returned so that the newly created event handler can # be destroyed if need be. @@ -356,7 +364,7 @@ class UzblInstance: for event in self.handlers.keys(): if id in self.handlers[event].keys(): - print "Removed handler:", self.handlers[event][id] + echo("removed handler %d" % id) del self.handlers[event][id] @@ -377,7 +385,7 @@ class UzblInstance: if not cmd: if glob in self.binds.keys(): - print "Deleted bind:", self.binds[glob] + echo("deleted bind: %r" % self.binds[glob]) del self.binds[glob] d = {'glob': glob, 'once': True, 'hasargs': True, 'cmd': cmd} @@ -394,7 +402,7 @@ class UzblInstance: d['hasargs'] = False self.binds[glob] = d - print "Added bind:", d + echo("added bind: %r" % d) def set(self, key, value): @@ -453,20 +461,19 @@ class UzblInstance: def handle_event(self, event, args): '''Handle uzbl events internally before dispatch.''' + print event, args + if event == 'VARIABLE_SET': - l = args.split(' ', 1) - if len(l) == 1: + l = args.split(' ', 2) + if len(l) == 2: l.append("") - key, value = l - dict.__setitem__(self._config, key, value) + key, type, value = l + dict.__setitem__(self._config, key, _TYPECONVERT[type](value)) elif event == 'FIFO_SET': self.fifo_socket = args - # Workaround until SOCKET_SET is implemented. - self.socket_file = args.replace("fifo", "socket") - elif event == 'SOCKET_SET': self.socket_file = args @@ -477,12 +484,10 @@ class UzblInstance: def dispatch_event(self, event, args): '''Now send the event to any event handlers added with the connect function. In other words: handle plugin's event hooks.''' - unhandled = True if event in self.handlers.keys(): for hid in self.handlers[event]: try: - unhandled = False handler = self.handlers[event][hid] print "Executing handler:", event, handler self.exc_handler(handler, args) @@ -490,9 +495,6 @@ class UzblInstance: except: print_exc() - if unhandled: - print "Unhandled event:", event, args - def exc_handler(self, d, args): '''Handle handler.''' diff --git a/uzbl-core.c b/uzbl-core.c index ad7dd56..9541cfa 100644 --- a/uzbl-core.c +++ b/uzbl-core.c @@ -192,29 +192,29 @@ const struct var_name_to_ptr_t { }; /* Event id to name mapping - * Event names must be in the same + * Event names must be in the same * order as in 'enum event_type' * * TODO: Add more useful events */ const char *event_table[LAST_EVENT] = { - "LOAD_START" , - "LOAD_COMMIT" , - "LOAD_FINISH" , - "LOAD_ERROR" , + "LOAD_START" , + "LOAD_COMMIT" , + "LOAD_FINISH" , + "LOAD_ERROR" , "KEY_PRESS" , "KEY_RELEASE" , - "DOWNLOAD_REQUEST" , + "DOWNLOAD_REQUEST" , "COMMAND_EXECUTED" , "LINK_HOVER" , "TITLE_CHANGED" , "GEOMETRY_CHANGED" , "WEBINSPECTOR" , - "COOKIE" , "NEW_WINDOW" , "SELECTION_CHANGED", "VARIABLE_SET", - "FIFO_SET" + "FIFO_SET", + "SOCKET_SET" }; @@ -1966,23 +1966,35 @@ set_var_value(const gchar *name, gchar *val) { if( (c = g_hash_table_lookup(uzbl.comm.proto_var, name)) ) { if(!c->writeable) return FALSE; + if (uzbl.state.config_loaded) + msg = g_string_new(name); + /* check for the variable type */ if (c->type == TYPE_STR) { buf = expand(val, 0); g_free(*c->ptr.s); *c->ptr.s = buf; - msg = g_string_new(name); - g_string_append_printf(msg, " %s", buf); - send_event(VARIABLE_SET, msg->str); - g_string_free(msg,TRUE); + if (uzbl.state.config_loaded) + g_string_append_printf(msg, " str %s", buf); + } else if(c->type == TYPE_INT) { buf = expand(val, 0); *c->ptr.i = (int)strtoul(buf, &endp, 10); g_free(buf); + if (uzbl.state.config_loaded) + g_string_append_printf(msg, " int %d", *c->ptr.i); + } else if (c->type == TYPE_FLOAT) { buf = expand(val, 0); *c->ptr.f = strtod(buf, &endp); g_free(buf); + if (uzbl.state.config_loaded) + g_string_append_printf(msg, " float %f", *c->ptr.f); + } + + if (uzbl.state.config_loaded) { + send_event(VARIABLE_SET, msg->str); + g_string_free(msg,TRUE); } /* invoke a command specific function */ @@ -2006,6 +2018,13 @@ set_var_value(const gchar *name, gchar *val) { *c->ptr.s = buf; g_hash_table_insert(uzbl.comm.proto_var, g_strdup(name), (gpointer) c); + + if (uzbl.state.config_loaded) { + msg = g_string_new(name); + g_string_append_printf(msg, " str %s", buf); + send_event(VARIABLE_SET, msg->str); + g_string_free(msg,TRUE); + } } return TRUE; } @@ -2235,6 +2254,7 @@ init_socket(gchar *dir) { /* return dir or, on error, free dir and return NULL * if( (chan = g_io_channel_unix_new(sock)) ) { g_io_add_watch(chan, G_IO_IN|G_IO_HUP, (GIOFunc) control_socket, chan); uzbl.comm.socket_path = path; + send_event(SOCKET_SET, path); return dir; } } else g_warning ("init_socket: could not open in %s: %s\n", path, strerror(errno)); @@ -2292,7 +2312,7 @@ configure_event_cb(GtkWidget* window, GdkEventConfigure* event) { (void) event; retrieve_geometry(); - send_event(GEOMETRY_CHANGED, uzbl.gui.geometry); + send_event(GEOMETRY_CHANGED, uzbl.gui.geometry); return FALSE; } @@ -2331,7 +2351,7 @@ key_press_cb (GtkWidget* window, GdkEventKey* event) void run_keycmd(const gboolean key_ret) { - + /* run the keycmd immediately if it isn't incremental and doesn't take args */ Action *act; gchar *tmp; @@ -2641,6 +2661,8 @@ void settings_init () { State *s = &uzbl.state; Network *n = &uzbl.net; + uzbl.state.config_loaded = FALSE; + int i; for (i = 0; default_config[i].command != NULL; i++) { parse_cmd_line(default_config[i].command, NULL); @@ -2671,6 +2693,11 @@ settings_init () { printf ("No configuration file loaded.\n"); } + /* The config has now been loaded so dump the complete hash table for the + * event manager to parse */ + uzbl.state.config_loaded = TRUE; + dump_config(); + g_signal_connect_after(n->soup_session, "request-started", G_CALLBACK(handle_cookies), NULL); } @@ -2686,7 +2713,6 @@ void handle_cookies (SoupSession *session, SoupMessage *msg, gpointer user_data) g_string_printf(s, "GET '%s' '%s' '%s'", soup_uri->scheme, soup_uri->host, soup_uri->path); if(uzbl.behave.cookie_handler) run_handler(uzbl.behave.cookie_handler, s->str); - send_event(COOKIE, s->str); if(uzbl.behave.cookie_handler && uzbl.comm.sync_stdout && strcmp (uzbl.comm.sync_stdout, "") != 0) { @@ -2712,7 +2738,6 @@ save_cookies (SoupMessage *msg, gpointer user_data){ GString *s = g_string_new (""); g_string_printf(s, "PUT '%s' '%s' '%s' '%s'", soup_uri->scheme, soup_uri->host, soup_uri->path, cookie); run_handler(uzbl.behave.cookie_handler, s->str); - send_event(COOKIE, s->str); g_free (cookie); g_string_free(s, TRUE); } @@ -2818,31 +2843,28 @@ void dump_var_hash(gpointer k, gpointer v, gpointer ud) { (void) ud; uzbl_cmdprop *c = v; + GString *msg; if(!c->dump) return; - if(c->type == TYPE_STR) - printf("set %s = %s\n", (char *)k, *c->ptr.s ? *c->ptr.s : " "); - else if(c->type == TYPE_INT) - printf("set %s = %d\n", (char *)k, *c->ptr.i); - else if(c->type == TYPE_FLOAT) - printf("set %s = %f\n", (char *)k, *c->ptr.f); -} - -void -dump_key_hash(gpointer k, gpointer v, gpointer ud) { - (void) ud; - Action *a = v; + /* 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); + } - printf("bind %s = %s %s\n", (char *)k , - (char *)a->name, a->param?(char *)a->param:""); + send_event(VARIABLE_SET, msg->str); + g_string_free(msg, TRUE); } void dump_config() { g_hash_table_foreach(uzbl.comm.proto_var, dump_var_hash, NULL); - g_hash_table_foreach(uzbl.bindings, dump_key_hash, NULL); } void diff --git a/uzbl-core.h b/uzbl-core.h index 010cbe5..bde1e43 100644 --- a/uzbl-core.h +++ b/uzbl-core.h @@ -70,6 +70,7 @@ typedef struct { gchar* keycmd; gchar* searchtx; gboolean verbose; + gboolean config_loaded; } State; @@ -188,10 +189,10 @@ typedef void sigfunc(int); enum event_type { LOAD_START, LOAD_COMMIT, LOAD_FINISH, LOAD_ERROR, KEY_PRESS, KEY_RELEASE, DOWNLOAD_REQ, COMMAND_EXECUTED, - LINK_HOVER, TITLE_CHANGED, GEOMETRY_CHANGED, - WEBINSPECTOR, COOKIE, NEW_WINDOW, SELECTION_CHANGED, - VARIABLE_SET, FIFO_SET, - + LINK_HOVER, TITLE_CHANGED, GEOMETRY_CHANGED, + WEBINSPECTOR, NEW_WINDOW, SELECTION_CHANGED, + VARIABLE_SET, FIFO_SET, SOCKET_SET, + /* must be last entry */ LAST_EVENT }; |