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 add_handlers(handlers)
56 for event, handler in pairs(handlers) do
57 add_handler(event, handler);
60 local function remove_handlers(handlers)
61 for event, handler in pairs(handlers) do
62 remove_handler(event, handler);
65 local function _fire_event(event_name, event_data)
66 local h = handlers[event_name];
69 local ret = h[i](event_data);
70 if ret ~= nil then return ret; end
74 local function fire_event(event_name, event_data)
75 local w = wrappers[event_name] or global_wrappers;
77 local curr_wrapper = #w;
78 local function c(event_name, event_data)
79 curr_wrapper = curr_wrapper - 1;
80 if curr_wrapper == 0 then
81 if global_wrappers == nil or w == global_wrappers then
82 return _fire_event(event_name, event_data);
84 w, curr_wrapper = global_wrappers, #global_wrappers;
85 return w[curr_wrapper](c, event_name, event_data);
87 return w[curr_wrapper](c, event_name, event_data);
90 return w[curr_wrapper](c, event_name, event_data);
92 return _fire_event(event_name, event_data);
94 local function add_wrapper(event_name, wrapper)
96 if event_name == false then
103 w = wrappers[event_name];
106 wrappers[event_name] = w;
111 local function remove_wrapper(event_name, wrapper)
113 if event_name == false then
116 w = wrappers[event_name];
118 if not w then return; end
120 if w[i] == wrapper then
125 if event_name == nil then
126 global_wrappers = nil;
128 wrappers[event_name] = nil;
133 add_handler = add_handler;
134 remove_handler = remove_handler;
135 add_handlers = add_handlers;
136 remove_handlers = remove_handlers;
138 add_handler = add_wrapper;
139 remove_handler = remove_wrapper;
141 add_wrapper = add_wrapper;
142 remove_wrapper = remove_wrapper;
143 fire_event = fire_event;
144 _handlers = handlers;
145 _event_map = event_map;