diff options
author | 2020-02-24 09:04:39 -0500 | |
---|---|---|
committer | 2020-02-24 09:04:39 -0500 | |
commit | e0316d39489aa02c547fdf747aeca4c07735afba (patch) | |
tree | 13c8115aa493925173d2f9aff7ea5158153c90dd /core/events.lua | |
parent | c26b98733225c36ef21d0d3818979dcaa6197acd (diff) | |
download | textadept-e0316d39489aa02c547fdf747aeca4c07735afba.tar.gz textadept-e0316d39489aa02c547fdf747aeca4c07735afba.zip |
Fixed skipping of next event handler after disconnecting the current one.
Also removed localization for undefined event name. It was confusing, and anyone
connecting to or emitting events should be comfortable with the error message,
as it's consistent with Lua's type error messages.
Diffstat (limited to 'core/events.lua')
-rw-r--r-- | core/events.lua | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/core/events.lua b/core/events.lua index 6857b7e7..34f90bf7 100644 --- a/core/events.lua +++ b/core/events.lua @@ -294,7 +294,10 @@ local M = {} -- Emitted by [`buffer.zoom_in()`]() and [`buffer.zoom_out()`](). module('events')]] -local handlers = {} +local handlers = setmetatable({}, {__index = function(t, k) + t[k] = {} + return t[k] +end}) --- -- Adds function *f* to the set of event handlers for event *event* at position @@ -308,9 +311,7 @@ local handlers = {} -- @see disconnect -- @name connect function M.connect(event, f, index) - -- Note: cannot assert() here since _L is undefined early in init process. - if not event then error(_L['Undefined event name']) end - if not handlers[event] then handlers[event] = {} end + assert(type(event) == 'string', 'string expected') M.disconnect(event, f) -- in case it already exists table.insert(handlers[event], index or #handlers[event] + 1, f) end @@ -322,7 +323,6 @@ end -- @see connect -- @name disconnect function M.disconnect(event, f) - if not handlers[event] then return end for i = 1, #handlers[event] do if handlers[event][i] == f then table.remove(handlers[event], i) break end end @@ -344,22 +344,22 @@ local error_emitted = false -- @usage events.emit('my_event', 'my message') -- @name emit function M.emit(event, ...) - assert(event, _L['Undefined event name']) - local h = handlers[event] - if not h then return end - for i = 1, #h do - if not h[i] then break end -- M.disconnect() for this event was called - local ok, result = pcall(h[i], ...) + assert(type(event) == 'string', 'string expectd') + local i = 1 + while i <= #handlers[event] do + local handler = handlers[event][i] + local ok, result = pcall(handler, ...) if not ok then if not error_emitted then error_emitted = true M.emit(events.ERROR, result) error_emitted = false else - io.stderr:write(result) + io.stderr:write(result) -- prevent infinite loop end end if type(result) == 'boolean' then return result end + if handlers[event][i] == handler then i = i + 1 end -- unless M.disconnect() end end |