aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rwxr-xr-xexamples/data/uzbl/scripts/event_manager.py48
-rw-r--r--uzbl-core.c84
-rw-r--r--uzbl-core.h9
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
};