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_sort = table.sort;
13 local setmetatable = setmetatable;
20 local global_wrappers;
23 local function _rebuild_index(handlers, event)
24 local _handlers = event_map[event];
25 if not _handlers or next(_handlers) == nil then return; end
27 for handler in pairs(_handlers) do
28 t_insert(index, handler);
30 t_sort(index, function(a, b) return _handlers[a] > _handlers[b]; end);
31 handlers[event] = index;
34 setmetatable(handlers, { __index = _rebuild_index });
35 local function add_handler(event, handler, priority)
36 local map = event_map[event];
38 map[handler] = priority or 0;
40 map = {[handler] = priority or 0};
41 event_map[event] = map;
43 handlers[event] = nil;
45 local function remove_handler(event, handler)
46 local map = event_map[event];
49 handlers[event] = nil;
50 if next(map) == nil then
51 event_map[event] = nil;
55 local function get_handlers(event)
56 return handlers[event];
58 local function add_handlers(handlers)
59 for event, handler in pairs(handlers) do
60 add_handler(event, handler);
63 local function remove_handlers(handlers)
64 for event, handler in pairs(handlers) do
65 remove_handler(event, handler);
68 local function _fire_event(event_name, event_data)
69 local h = handlers[event_name];
72 local ret = h[i](event_data);
73 if ret ~= nil then return ret; end
77 local function fire_event(event_name, event_data)
78 local w = wrappers[event_name] or global_wrappers;
80 local curr_wrapper = #w;
81 local function c(event_name, event_data)
82 curr_wrapper = curr_wrapper - 1;
83 if curr_wrapper == 0 then
84 if global_wrappers == nil or w == global_wrappers then
85 return _fire_event(event_name, event_data);
87 w, curr_wrapper = global_wrappers, #global_wrappers;
88 return w[curr_wrapper](c, event_name, event_data);
90 return w[curr_wrapper](c, event_name, event_data);
93 return w[curr_wrapper](c, event_name, event_data);
95 return _fire_event(event_name, event_data);
97 local function add_wrapper(event_name, wrapper)
99 if event_name == false then
106 w = wrappers[event_name];
109 wrappers[event_name] = w;
114 local function remove_wrapper(event_name, wrapper)
116 if event_name == false then
119 w = wrappers[event_name];
121 if not w then return; end
123 if w[i] == wrapper then
128 if event_name == nil then
129 global_wrappers = nil;
131 wrappers[event_name] = nil;
136 add_handler = add_handler;
137 remove_handler = remove_handler;
138 add_handlers = add_handlers;
139 remove_handlers = remove_handlers;
140 get_handlers = get_handlers;
142 add_handler = add_wrapper;
143 remove_handler = remove_wrapper;
145 add_wrapper = add_wrapper;
146 remove_wrapper = remove_wrapper;
147 fire_event = fire_event;
148 _handlers = handlers;
149 _event_map = event_map;