From 520b63cb1d64fb5a293988122007bd05bacc49db Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Sun, 28 Feb 2016 14:01:16 +0000 Subject: Key bindings; fix tests... ... and fix two bugs: - not suppressing keyup event after keyChar matched in keydown. - we cannot check the passKeys keyChar in keyup because the key state has changed; so we track what the next keyup response should be. --- content_scripts/mode_passkeys.coffee | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'content_scripts/mode_passkeys.coffee') diff --git a/content_scripts/mode_passkeys.coffee b/content_scripts/mode_passkeys.coffee index a68fe3be..7efa559c 100644 --- a/content_scripts/mode_passkeys.coffee +++ b/content_scripts/mode_passkeys.coffee @@ -1,12 +1,15 @@ class PassKeysMode extends Mode constructor: (@normalMode) -> + @nextKeyup = @continueBubbling super name: "passkeys" trackState: true # Maintain @passKeys. keydown: (event) => @handleKeyChar event, KeyboardUtils.getKeyChar event keypress: (event) => @handleKeyChar event, String.fromCharCode event.charCode - keyup: (event) => @handleKeyChar event, KeyboardUtils.getKeyChar event + keyup: => ([_, @nextKeyup] = [@nextKeyup, @continueBubbling])[0] + # We cannot track keyup events if we lose the focus. + blur: (event) => @alwaysContinueBubbling => @nextKeyup = @continueBubbling if event.target == window # Keystrokes are *never* considered passKeys if the user has begun entering a command. So, for example, if # 't' is a passKey, then 'gt' and '99t' are neverthless be handled by Vimium. @@ -14,7 +17,7 @@ class PassKeysMode extends Mode return @continueBubbling if event.altKey or event.ctrlKey or event.metaKey return @continueBubbling unless keyChar and @normalMode.isFirstKeyChar keyChar return @continueBubbling unless keyChar.length == 1 and 0 <= @passKeys.indexOf keyChar - @stopBubblingAndTrue + @nextKeyup = @stopBubblingAndTrue root = exports ? window root.PassKeysMode = PassKeysMode -- cgit v1.2.3