summaryrefslogtreecommitdiff
path: root/urwid
diff options
context:
space:
mode:
authorIan Ward <ian@excess.org>2013-12-26 11:32:55 -0500
committerIan Ward <ian@excess.org>2013-12-26 11:33:13 -0500
commit3ec2a2ca76b96a98e36fe317be2766d7323a48a8 (patch)
tree1b33d46dd5816f45ee6a112329ce648cda666514 /urwid
parentab6e278967cdb30602545e99e95e65d47d3b0931 (diff)
downloadurwid-3ec2a2ca76b96a98e36fe317be2766d7323a48a8.tar.gz
fix signal emit order:use list for handlers
Diffstat (limited to 'urwid')
-rw-r--r--urwid/signals.py22
1 files changed, 10 insertions, 12 deletions
diff --git a/urwid/signals.py b/urwid/signals.py
index 64859e8..4c9d4c6 100644
--- a/urwid/signals.py
+++ b/urwid/signals.py
@@ -158,7 +158,7 @@ class Signals(object):
key = Key()
signals = setdefaultattr(obj, self._signal_attr, {})
- handlers = signals.setdefault(name, {})
+ handlers = signals.setdefault(name, [])
# Remove the signal handler when any of the weakref'd arguments
# are garbage collected. Note that this means that the handlers
@@ -180,7 +180,7 @@ class Signals(object):
pass
user_args = self._prepare_user_args(weak_args, user_args, weakref_callback)
- handlers[key] = (callback, user_arg, user_args)
+ handlers.append((key, callback, user_arg, user_args))
return key
@@ -219,9 +219,9 @@ class Signals(object):
user_args = self._prepare_user_args(weak_args, user_args)
# Remove the given handler
- for key, value in handlers.items():
- if value == (callback, user_arg, user_args):
- return self.disconnect_by_key(obj, name, key)
+ for h in handlers:
+ if h[1:] == (callback, user_arg, user_args):
+ return self.disconnect_by_key(obj, name, h[0])
def disconnect_by_key(self, obj, name, key):
"""
@@ -241,11 +241,8 @@ class Signals(object):
function will simply do nothing.
"""
signals = setdefaultattr(obj, self._signal_attr, {})
- try:
- del signals[name][key]
- except KeyError:
- # Don't error out if the handler is already disconnected.
- pass
+ handlers = signals.get(name, [])
+ handlers[:] = [h for h in handlers if h[0] is not key]
def emit(self, obj, name, *args):
"""
@@ -262,8 +259,9 @@ class Signals(object):
This function returns True if any of the callbacks returned True.
"""
result = False
- d = getattr(obj, self._signal_attr, {})
- for callback, user_arg, user_args in d.get(name, {}).values():
+ signals = getattr(obj, self._signal_attr, {})
+ handlers = signals.get(name, [])
+ for key, callback, user_arg, user_args in handlers:
result |= self._call_callback(callback, user_arg, user_args, args)
return result