diff options
author | Ian Ward <ian@excess.org> | 2013-12-26 11:32:55 -0500 |
---|---|---|
committer | Ian Ward <ian@excess.org> | 2013-12-26 11:33:13 -0500 |
commit | 3ec2a2ca76b96a98e36fe317be2766d7323a48a8 (patch) | |
tree | 1b33d46dd5816f45ee6a112329ce648cda666514 /urwid | |
parent | ab6e278967cdb30602545e99e95e65d47d3b0931 (diff) | |
download | urwid-3ec2a2ca76b96a98e36fe317be2766d7323a48a8.tar.gz |
fix signal emit order:use list for handlers
Diffstat (limited to 'urwid')
-rw-r--r-- | urwid/signals.py | 22 |
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 |