old_contents: # event system
  
  EVENT_CALLBACKS = {}
  
  def add_listener(event, callback, priority = 5):
      if event not in EVENT_CALLBACKS:
          EVENT_CALLBACKS[event] = []
  
      if (priority, callback) not in EVENT_CALLBACKS[event]:
          EVENT_CALLBACKS[event].append((priority, callback))
          EVENT_CALLBACKS[event].sort(key = lambda x: x[0])
  
  def remove_listener(event, callback, priority = 5):
      if event in EVENT_CALLBACKS and (priority, callback) in EVENT_CALLBACKS[event]:
          EVENT_CALLBACKS[event].remove((priority, callback))
  
  
  class Event:
      def __init__(self, name, data):
          self.stop_processing = False
          self.prevent_default = False
          self.name = name
          self.data = data
  
      def dispatch(self, *args):
          if self.name not in EVENT_CALLBACKS:
              return True
  
          for item in list(EVENT_CALLBACKS[self.name]):
              item[1](self, *args)
              if self.stop_processing:
                  break
  
          return not self.prevent_default
  
  # vim: set expandtab:sw=4:ts=4:
  
new_contents: # event system
  
  EVENT_CALLBACKS = {}
  
  def add_listener(event, callback, priority = 5):
      if event not in EVENT_CALLBACKS:
          EVENT_CALLBACKS[event] = []
  
      if (priority, callback) not in EVENT_CALLBACKS[event]:
          EVENT_CALLBACKS[event].append((priority, callback))
          EVENT_CALLBACKS[event].sort(key = lambda x: x[0])
  
  def remove_listener(event, callback, priority = 5):
      if event in EVENT_CALLBACKS and (priority, callback) in EVENT_CALLBACKS[event]:
          EVENT_CALLBACKS[event].remove((priority, callback))
  
      if event in EVENT_CALLBACKS and not EVENT_CALLBACKS[event]:
          del EVENT_CALLBACKS[event]
  
  class Event:
      def __init__(self, name, data):
          self.stop_processing = False
          self.prevent_default = False
          self.name = name
          self.data = data
  
      def dispatch(self, *args):
          if self.name not in EVENT_CALLBACKS:
              return True
  
          for item in list(EVENT_CALLBACKS[self.name]):
              item[1](self, *args)
              if self.stop_processing:
                  break
  
          return not self.prevent_default
  
  # vim: set expandtab:sw=4:ts=4:
  
subject: Make events.remove_listener remove empty lists as well