Fix handling of key release events.
Fixes #593. It seems Qt "re-uses" existing keyevents, so we have to save and compare the data instead.
This commit is contained in:
parent
16ffafb769
commit
431257d380
@ -32,6 +32,33 @@ from qutebrowser.commands import cmdexc, cmdutils
|
|||||||
from qutebrowser.utils import usertypes, log, objreg, utils
|
from qutebrowser.utils import usertypes, log, objreg, utils
|
||||||
|
|
||||||
|
|
||||||
|
class KeyEvent:
|
||||||
|
|
||||||
|
"""A small wrapper over a QKeyEvent storing its data.
|
||||||
|
|
||||||
|
This is needed because Qt apparently mutates existing events with new data.
|
||||||
|
It doesn't store the modifiers because they can be different for a key
|
||||||
|
press/release.
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
key: A Qt.Key member (QKeyEvent::key).
|
||||||
|
text: A string (QKeyEvent::text).
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, keyevent):
|
||||||
|
self.key = keyevent.key()
|
||||||
|
self.text = keyevent.text()
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return utils.get_repr(self, key=self.key, text=self.text)
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
return self.key == other.key and self.text == other.text
|
||||||
|
|
||||||
|
def __hash__(self):
|
||||||
|
return hash((self.key, self.text))
|
||||||
|
|
||||||
|
|
||||||
class NotInModeError(Exception):
|
class NotInModeError(Exception):
|
||||||
|
|
||||||
"""Exception raised when we want to leave a mode we're not in."""
|
"""Exception raised when we want to leave a mode we're not in."""
|
||||||
@ -143,7 +170,7 @@ class ModeManager(QObject):
|
|||||||
_win_id: The window ID of this ModeManager
|
_win_id: The window ID of this ModeManager
|
||||||
_handlers: A dictionary of modes and their handlers.
|
_handlers: A dictionary of modes and their handlers.
|
||||||
_forward_unbound_keys: If we should forward unbound keys.
|
_forward_unbound_keys: If we should forward unbound keys.
|
||||||
_releaseevents_to_pass: A list of keys where the keyPressEvent was
|
_releaseevents_to_pass: A set of KeyEvents where the keyPressEvent was
|
||||||
passed through, so the release event should as
|
passed through, so the release event should as
|
||||||
well.
|
well.
|
||||||
|
|
||||||
@ -166,7 +193,7 @@ class ModeManager(QObject):
|
|||||||
self._handlers = {}
|
self._handlers = {}
|
||||||
self.passthrough = []
|
self.passthrough = []
|
||||||
self.mode = usertypes.KeyMode.normal
|
self.mode = usertypes.KeyMode.normal
|
||||||
self._releaseevents_to_pass = []
|
self._releaseevents_to_pass = set()
|
||||||
self._forward_unbound_keys = config.get(
|
self._forward_unbound_keys = config.get(
|
||||||
'input', 'forward-unbound-keys')
|
'input', 'forward-unbound-keys')
|
||||||
objreg.get('config').changed.connect(self.set_forward_unbound_keys)
|
objreg.get('config').changed.connect(self.set_forward_unbound_keys)
|
||||||
@ -207,7 +234,7 @@ class ModeManager(QObject):
|
|||||||
filter_this = True
|
filter_this = True
|
||||||
|
|
||||||
if not filter_this:
|
if not filter_this:
|
||||||
self._releaseevents_to_pass.append(event)
|
self._releaseevents_to_pass.add(KeyEvent(event))
|
||||||
|
|
||||||
if curmode != usertypes.KeyMode.insert:
|
if curmode != usertypes.KeyMode.insert:
|
||||||
log.modes.debug("handled: {}, forward-unbound-keys: {}, "
|
log.modes.debug("handled: {}, forward-unbound-keys: {}, "
|
||||||
@ -228,10 +255,9 @@ class ModeManager(QObject):
|
|||||||
True if event should be filtered, False otherwise.
|
True if event should be filtered, False otherwise.
|
||||||
"""
|
"""
|
||||||
# handle like matching KeyPress
|
# handle like matching KeyPress
|
||||||
if event in self._releaseevents_to_pass:
|
keyevent = KeyEvent(event)
|
||||||
# remove all occurrences
|
if keyevent in self._releaseevents_to_pass:
|
||||||
self._releaseevents_to_pass = [
|
self._releaseevents_to_pass.remove(keyevent)
|
||||||
e for e in self._releaseevents_to_pass if e != event]
|
|
||||||
filter_this = False
|
filter_this = False
|
||||||
else:
|
else:
|
||||||
filter_this = True
|
filter_this = True
|
||||||
|
Loading…
Reference in New Issue
Block a user