def handle(self, e, *, dry_run=False): """Handle a new keypress. Separate the keypress into count/command, then check if it matches any possible command, and either run the command, ignore it, or display an error. Args: e: the KeyPressEvent from Qt. dry_run: Don't actually execute anything, only check whether there would be a match. Return: A QKeySequence match. """ key = e.key() txt = str(keyutils.KeyInfo.from_event(e)) self._debug_log("Got key: 0x{:x} / modifiers: 0x{:x} / text: '{}' / " "dry_run {}".format(key, int(e.modifiers()), txt, dry_run)) if keyutils.is_modifier_key(key): self._debug_log("Ignoring, only modifier") return QKeySequence.NoMatch try: sequence = self._sequence.append_event(e) except keyutils.KeyParseError as ex: self._debug_log("{} Aborting keychain.".format(ex)) self.clear_keystring() return QKeySequence.NoMatch match, binding = self._match_key(sequence) if match == QKeySequence.NoMatch: match, binding, sequence = self._match_without_modifiers(sequence) if match == QKeySequence.NoMatch: match, binding, sequence = self._match_key_mapping(sequence) if match == QKeySequence.NoMatch: was_count = self._match_count(sequence, dry_run) if was_count: return QKeySequence.ExactMatch if dry_run: return match self._sequence = sequence if match == QKeySequence.ExactMatch: self._debug_log("Definitive match for '{}'.".format( sequence)) count = int(self._count) if self._count else None self.clear_keystring() self.execute(binding, count) elif match == QKeySequence.PartialMatch: self._debug_log("No match for '{}' (added {})".format( sequence, txt)) self.keystring_updated.emit(self._count + str(sequence)) elif match == QKeySequence.NoMatch: self._debug_log("Giving up with '{}', no matches".format( sequence)) self.clear_keystring() else: raise utils.Unreachable("Invalid match value {!r}".format(match)) return match
def test_is_modifier_key(key, ismodifier): assert keyutils.is_modifier_key(key) == ismodifier
def test_is_modifier_key(key, ismodifier): assert keyutils.is_modifier_key(key) == ismodifier
def handle(self, e: QKeyEvent, *, dry_run: bool = False) -> QKeySequence.SequenceMatch: """Handle a new keypress. Separate the keypress into count/command, then check if it matches any possible command, and either run the command, ignore it, or display an error. Args: e: the KeyPressEvent from Qt. dry_run: Don't actually execute anything, only check whether there would be a match. Return: A QKeySequence match. """ key = Qt.Key(e.key()) txt = str(keyutils.KeyInfo.from_event(e)) self._debug_log("Got key: 0x{:x} / modifiers: 0x{:x} / text: '{}' / " "dry_run {}".format(key, int(e.modifiers()), txt, dry_run)) if keyutils.is_modifier_key(key): self._debug_log("Ignoring, only modifier") return QKeySequence.NoMatch try: sequence = self._sequence.append_event(e) except keyutils.KeyParseError as ex: self._debug_log("{} Aborting keychain.".format(ex)) self.clear_keystring() return QKeySequence.NoMatch result = self._match_key(sequence) del sequence # Enforce code below to use the modified result.sequence if result.match_type == QKeySequence.NoMatch: result = self._match_without_modifiers(result.sequence) if result.match_type == QKeySequence.NoMatch: result = self._match_key_mapping(result.sequence) if result.match_type == QKeySequence.NoMatch: was_count = self._match_count(result.sequence, dry_run) if was_count: return QKeySequence.ExactMatch if dry_run: return result.match_type self._sequence = result.sequence if result.match_type == QKeySequence.ExactMatch: assert result.command is not None self._debug_log("Definitive match for '{}'.".format( result.sequence)) count = int(self._count) if self._count else None self.clear_keystring() self.execute(result.command, count) elif result.match_type == QKeySequence.PartialMatch: self._debug_log("No match for '{}' (added {})".format( result.sequence, txt)) self.keystring_updated.emit(self._count + str(result.sequence)) elif result.match_type == QKeySequence.NoMatch: self._debug_log("Giving up with '{}', no matches".format( result.sequence)) self.clear_keystring() else: raise utils.Unreachable("Invalid match value {!r}".format( result.match_type)) return result.match_type
def handle(self, e, *, dry_run=False): """Handle a new keypress. Separate the keypress into count/command, then check if it matches any possible command, and either run the command, ignore it, or display an error. Args: e: the KeyPressEvent from Qt. dry_run: Don't actually execute anything, only check whether there would be a match. Return: A QKeySequence match. """ key = e.key() txt = str(keyutils.KeyInfo.from_event(e)) self._debug_log("Got key: 0x{:x} / modifiers: 0x{:x} / text: '{}' / " "dry_run {}".format(key, int(e.modifiers()), txt, dry_run)) if keyutils.is_modifier_key(key): self._debug_log("Ignoring, only modifier") return QKeySequence.NoMatch try: sequence = self._sequence.append_event(e) except keyutils.KeyParseError as ex: self._debug_log("{} Aborting keychain.".format(ex)) self.clear_keystring() return QKeySequence.NoMatch # First, try a straightforward match match, binding = self._match_key(sequence) # If that doesn't match, try a key_mapping if match == QKeySequence.NoMatch: mapped = sequence.with_mappings(config.val.bindings.key_mappings) if sequence != mapped: self._debug_log("Mapped {} -> {}".format(sequence, mapped)) match, binding = self._match_key(mapped) sequence = mapped # If that doesn't match either, try treating it as count. if (match == QKeySequence.NoMatch and txt.isdigit() and self._supports_count and not (not self._count and txt == '0')): assert len(txt) == 1, txt if not dry_run: self._count += txt self.keystring_updated.emit(self._count + str(self._sequence)) return QKeySequence.ExactMatch if dry_run: return match self._sequence = sequence if match == QKeySequence.ExactMatch: self._debug_log("Definitive match for '{}'.".format(sequence)) count = int(self._count) if self._count else None self.clear_keystring() self.execute(binding, count) elif match == QKeySequence.PartialMatch: self._debug_log("No match for '{}' (added {})".format( sequence, txt)) self.keystring_updated.emit(self._count + str(sequence)) elif match == QKeySequence.NoMatch: self._debug_log("Giving up with '{}', no matches".format(sequence)) self.clear_keystring() else: raise utils.Unreachable("Invalid match value {!r}".format(match)) return match