9136ebd321
make sure that for a given event (widget/object/module, whatever), only a *single* input event per button can be registered at one time. the problem otherwise is with modules that re-register their widgets with the same IDs (cmus, spotify, etc.): Each time the widget is re-created (each intervall, typically), it re-registers an input event, creating an always longer list of callbacks being executed when the button is clicked (not speaking of the memory leak this introduces). fixes #668
32 lines
643 B
Python
32 lines
643 B
Python
__callbacks = {}
|
|
|
|
|
|
def register(event, callback, *args, **kwargs):
|
|
cb = callback
|
|
if args or kwargs:
|
|
cb = lambda: callback(*args, **kwargs)
|
|
|
|
__callbacks.setdefault(event, []).append(cb)
|
|
|
|
def unregister(event):
|
|
if event in __callbacks:
|
|
del __callbacks[event]
|
|
|
|
def clear():
|
|
__callbacks.clear()
|
|
|
|
|
|
def trigger(event, *args, **kwargs):
|
|
cb = __callbacks.get(event, [])
|
|
if len(cb) == 0:
|
|
return False
|
|
|
|
for callback in cb:
|
|
if args or kwargs:
|
|
callback(*args, **kwargs)
|
|
else:
|
|
callback()
|
|
return True
|
|
|
|
|
|
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
|