def _setup_mask(self): mask = array(b'B', b'\xff' * 32) if self._keys_to_ignore >= self.IGNORE_MODIFIER_KEYS: modifier_mappings = xlib.get_modifier_mapping(self.display) for modifier_keys in modifier_mappings: for keycode in modifier_keys: mask[keycode // 8] &= ~(1 << (keycode % 8)) return mask
def __init__(self, parent=None): AbstractKeyboardMonitor.__init__(self, parent) self.display = Display.from_qt() # this timer is started on every keyboard event, its timeout signals, # that the keyboard is to be considered inactive again self._idle_timer = QTimer(self) self._idle_timer.setInterval(self.DEFAULT_IDLETIME) self._idle_timer.timeout.connect(self.typingStopped) self._idle_timer.setSingleShot(True) # this object records events self._recorder = EventRecorder(self) self._recorder.keyPressed.connect(self._key_pressed) self._recorder.keyReleased.connect(self._key_released) self._recorder.started.connect(self.started) self._recorder.finished.connect(self.stopped) # a set of all known modifier keycodes modifier_mapping = xlib.get_modifier_mapping(self.display) self._modifiers = frozenset(keycode for modifiers in modifier_mapping for keycode in modifiers if keycode != 0) # a set holding all pressed, but not yet released modifier keys self._pressed_modifiers = set() # the value of keys to ignore self._keys_to_ignore = self.IGNORE_NO_KEYS