diff options
Diffstat (limited to 'qutebrowser/keyinput/keyutils.py')
-rw-r--r-- | qutebrowser/keyinput/keyutils.py | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/qutebrowser/keyinput/keyutils.py b/qutebrowser/keyinput/keyutils.py index dfe4fb3ff..a56efeab8 100644 --- a/qutebrowser/keyinput/keyutils.py +++ b/qutebrowser/keyinput/keyutils.py @@ -48,11 +48,19 @@ def _assert_plain_modifier(key): assert not key & ~Qt.KeyboardModifierMask, hex(key) -def is_printable(key): +def _is_printable(key): _assert_plain_key(key) return key <= 0xff and key not in [Qt.Key_Space, 0x0] +def is_special(key, modifiers): + """Check whether this key requires special key syntax.""" + _assert_plain_key(key) + _assert_plain_modifier(modifiers) + return not (_is_printable(key) and + modifiers in [Qt.ShiftModifier, Qt.NoModifier]) + + def is_modifier_key(key): """Test whether the given key is a modifier. @@ -277,7 +285,7 @@ class KeyInfo: if self.key in _MODIFIER_MAP: # Don't return e.g. <Shift+Shift> modifiers &= ~_MODIFIER_MAP[self.key] - elif is_printable(self.key): + elif _is_printable(self.key): # "normal" binding if not key_string: # pragma: no cover raise ValueError("Got empty string for key 0x{:x}!" @@ -285,14 +293,17 @@ class KeyInfo: assert len(key_string) == 1, key_string if self.modifiers == Qt.ShiftModifier: + assert not is_special(self.key, self.modifiers) return key_string.upper() elif self.modifiers == Qt.NoModifier: + assert not is_special(self.key, self.modifiers) return key_string.lower() else: # Use special binding syntax, but <Ctrl-a> instead of <Ctrl-A> key_string = key_string.lower() # "special" binding + assert is_special(self.key, self.modifiers) modifier_string = _modifiers_to_string(modifiers) return '<{}{}>'.format(modifier_string, key_string) @@ -309,7 +320,7 @@ class KeyInfo: if self.key in control: return control[self.key] - elif not is_printable(self.key): + elif not _is_printable(self.key): return '' text = QKeySequence(self.key).toString() @@ -490,7 +501,7 @@ class KeySequence: # In addition, Shift also *is* relevant when other modifiers are # involved. Shift-Ctrl-X should not be equivalent to Ctrl-X. if (modifiers == Qt.ShiftModifier and - is_printable(ev.key()) and + _is_printable(ev.key()) and not ev.text().isupper()): modifiers = Qt.KeyboardModifiers() |