aboutsummaryrefslogtreecommitdiff
path: root/core/events.lua
diff options
context:
space:
mode:
authormitchell <70453897+667e-11@users.noreply.github.com>2020-02-24 09:04:39 -0500
committermitchell <70453897+667e-11@users.noreply.github.com>2020-02-24 09:04:39 -0500
commite0316d39489aa02c547fdf747aeca4c07735afba (patch)
tree13c8115aa493925173d2f9aff7ea5158153c90dd /core/events.lua
parentc26b98733225c36ef21d0d3818979dcaa6197acd (diff)
downloadtextadept-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.lua24
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