def callback(proxy, event_type, event, reference): SUPPRESS_EVENT = None PASS_EVENT_THROUGH = event # Don't pass on meta events meant for this event tap. is_unexpected_event = event_type not in self._KEYBOARD_EVENTS if is_unexpected_event: if event_type == kCGEventTapDisabledByTimeout: # Re-enable the tap and hope we act faster next time CGEventTapEnable(self._tap, True) plover.log.warning( "Keystrokes may have been missed. " + "Keyboard event tap has been re-enabled. ") return SUPPRESS_EVENT # Don't intercept the event if it has modifiers, allow # Fn and Numeric flags so we can suppress the arrow and # extended (home, end, etc...) keys. suppressible_modifiers = (kCGEventFlagMaskNumericPad | kCGEventFlagMaskSecondaryFn | kCGEventFlagMaskNonCoalesced) has_nonsupressible_modifiers = \ CGEventGetFlags(event) & ~suppressible_modifiers if has_nonsupressible_modifiers: return PASS_EVENT_THROUGH keycode = CGEventGetIntegerValueField( event, kCGKeyboardEventKeycode) key = KEYCODE_TO_KEY.get(keycode) self._async_dispatch(key, event_type) if key in self._suppressed_keys: return SUPPRESS_EVENT return PASS_EVENT_THROUGH
def callback(proxy, event_type, event, reference): # Don't pass on meta events meant for this event tap. if event_type not in self._KEYBOARD_EVENTS: return None # Don't intercept events from this module. if (CGEventGetIntegerValueField(event, kCGEventSourceStateID) == MY_EVENT_SOURCE_ID): return event # Don't intercept the event if it has modifiers. if CGEventGetFlags(event) & ~kCGEventFlagMaskNonCoalesced: return event keycode = CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode) if keycode not in KEYCODE_TO_CHAR: return event char = KEYCODE_TO_CHAR[keycode] handler_name = 'key_up' if event_type == kCGEventKeyUp else 'key_down' handler = getattr(self, handler_name, lambda event: None) handler(KeyboardEvent(char)) return None if self.is_keyboard_suppressed() else event
def callback(proxy, event_type, event, reference): # Don't pass on meta events meant for this event tap. if event_type not in self._KEYBOARD_EVENTS: return None # Don't intercept the event if it has modifiers, allow # Fn and Numeric flags so we can suppress the arrow and # extended (home, end, etc...) keys. if CGEventGetFlags(event) & ~(kCGEventFlagMaskNumericPad | kCGEventFlagMaskSecondaryFn | kCGEventFlagMaskNonCoalesced): return event keycode = CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode) key = KEYCODE_TO_KEY.get(keycode) if key is not None: handler = self.key_up if event_type == kCGEventKeyUp else self.key_down handler(key) if key in self._suppressed_keys: # Suppress event. event = None return event
def callback(proxy, type, event, refcon): if self.pid == CGEventGetIntegerValueField( event, kCGEventTargetUnixProcessID): CGEventPostToPid(pid, event) return event