summaryrefslogtreecommitdiff
path: root/qutebrowser/keyinput/keyutils.py
diff options
context:
space:
mode:
Diffstat (limited to 'qutebrowser/keyinput/keyutils.py')
-rw-r--r--qutebrowser/keyinput/keyutils.py19
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()