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 add_handlers(handlers)
57 for event, handler in pairs(handlers) do
58 add_handler(event, handler);
61 local function remove_handlers(handlers)
62 for event, handler in pairs(handlers) do
63 remove_handler(event, handler);
66 local function _fire_event(event_name, event_data)
67 local h = handlers[event_name];
70 local ret = h[i](event_data);
71 if ret ~= nil then return ret; end
75 local function fire_event(event_name, event_data)
76 local w = wrappers[event_name] or global_wrappers;
78 local curr_wrapper = #w;
79 local function c(event_name, event_data)
80 curr_wrapper = curr_wrapper - 1;
81 if curr_wrapper == 0 then
82 if global_wrappers == nil or w == global_wrappers then
83 return _fire_event(event_name, event_data);
85 w, curr_wrapper = global_wrappers, #global_wrappers;
86 return w[curr_wrapper](c, event_name, event_data);
88 return w[curr_wrapper](c, event_name, event_data);
91 return w[curr_wrapper](c, event_name, event_data);
93 return _fire_event(event_name, event_data);
95 local function add_wrapper(event_name, wrapper)
97 if event_name == false then
104 w = wrappers[event_name];
107 wrappers[event_name] = w;
112 local function remove_wrapper(event_name, wrapper)
114 if event_name == false then
117 w = wrappers[event_name];
119 if not w then return; end
121 if w[i] == wrapper then
126 if event_name == nil then
127 global_wrappers = nil;
129 wrappers[event_name] = nil;
134 add_handler = add_handler;
135 remove_handler = remove_handler;
136 add_handlers = add_handlers;
137 remove_handlers = remove_handlers;
139 add_handler = add_wrapper;
140 remove_handler = remove_wrapper;
142 add_wrapper = add_wrapper;
143 remove_wrapper = remove_wrapper;
144 fire_event = fire_event;
145 _handlers = handlers;
146 _event_map = event_map;