code: def run(self):
          
          self.tap = Quartz.CGEventTapCreate(
              Quartz.kCGSessionEventTap,
              Quartz.kCGHeadInsertEventTap,
              Quartz.kCGEventTapOptionDefault,
              Quartz.CGEventMaskBit(Quartz.kCGEventKeyDown) |
              Quartz.CGEventMaskBit(Quartz.kCGEventKeyUp) |
              Quartz.CGEventMaskBit(Quartz.kCGEventFlagsChanged),
              self.handler,
              None)
          loopsource = Quartz.CFMachPortCreateRunLoopSource(None, self.tap, 0)
          loop = Quartz.CFRunLoopGetCurrent()
          Quartz.CFRunLoopAddSource(loop, loopsource, Quartz.kCFRunLoopDefaultMode)
          Quartz.CGEventTapEnable(self.tap, True)
  
          while self.listening:
              Quartz.CFRunLoopRunInMode(Quartz.kCFRunLoopDefaultMode, 5, False)
docs: Creates a listener and loops while waiting for an event. Intended to run as
          a background thread.