2 -- Copyright (C) 2008-2010 Matthew Wild
3 -- Copyright (C) 2008-2010 Waqas Hussain
5 -- This project is MIT/X11 licensed. Please see the
6 -- COPYING file in the source package for more information.
11 local t_insert = table.insert;
12 local t_remove = table.remove;
13 local t_sort = table.sort;
14 local setmetatable = setmetatable;
21 local global_wrappers;
24 local function _rebuild_index(handlers, event)
25 local _handlers = event_map[event];
26 if not _handlers or next(_handlers) == nil then return; end
28 for handler in pairs(_handlers) do
29 t_insert(index, handler);
31 t_sort(index, function(a, b) return _handlers[a] > _handlers[b]; end);
32 handlers[event] = index;
35 setmetatable(handlers, { __index = _rebuild_index });
36 local function add_handler(event, handler, priority)
37 local map = event_map[event];
39 map[handler] = priority or 0;
41 map = {[handler] = priority or 0};
42 event_map[event] = map;
44 handlers[event] = nil;
46 local function remove_handler(event, handler)
47 local map = event_map[event];
50 handlers[event] = nil;
51 if next(map) == nil then
52 event_map[event] = nil;
56 local function get_handlers(event)
57 return handlers[event];
59 local function add_handlers(handlers)
60 for event, handler in pairs(handlers) do
61 add_handler(event, handler);
64 local function remove_handlers(handlers)
65 for event, handler in pairs(handlers) do
66 remove_handler(event, handler);
69 local function _fire_event(event_name, event_data)
70 local h = handlers[event_name];
73 local ret = h[i](event_data);
74 if ret ~= nil then return ret; end
78 local function fire_event(event_name, event_data)
79 local w = wrappers[event_name] or global_wrappers;
81 local curr_wrapper = #w;
82 local function c(event_name, event_data)
83 curr_wrapper = curr_wrapper - 1;
84 if curr_wrapper == 0 then
85 if global_wrappers == nil or w == global_wrappers then
86 return _fire_event(event_name, event_data);
88 w, curr_wrapper = global_wrappers, #global_wrappers;
89 return w[curr_wrapper](c, event_name, event_data);
91 return w[curr_wrapper](c, event_name, event_data);
94 return w[curr_wrapper](c, event_name, event_data);
96 return _fire_event(event_name, event_data);
98 local function add_wrapper(event_name, wrapper)
100 if event_name == false then
107 w = wrappers[event_name];
110 wrappers[event_name] = w;
115 local function remove_wrapper(event_name, wrapper)
117 if event_name == false then
120 w = wrappers[event_name];
122 if not w then return; end
124 if w[i] == wrapper then
129 if event_name == nil then
130 global_wrappers = nil;
132 wrappers[event_name] = nil;
137 add_handler = add_handler;
138 remove_handler = remove_handler;
139 add_handlers = add_handlers;
140 remove_handlers = remove_handlers;
141 get_handlers = get_handlers;
143 add_handler = add_wrapper;
144 remove_handler = remove_wrapper;
146 add_wrapper = add_wrapper;
147 remove_wrapper = remove_wrapper;
148 fire_event = fire_event;
149 _handlers = handlers;
150 _event_map = event_map;