From 9cfa00bc7db3e07c3abbeb09e483d9fdf20bbc17 Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Mon, 29 Feb 2016 06:07:01 +0000 Subject: Key bindings; refactor passKeys. Previously, the key-handling logic (keyQueue, etc) was and the backend whereas passKeys were handled in the content scripts - so they were a long way apart. Now that they're in the same place, it makes more sense to integrate passKey handling into the regular key handling, because they depend upon the same data structures. --- content_scripts/mode_key_handler.coffee | 42 ++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 17 deletions(-) (limited to 'content_scripts/mode_key_handler.coffee') diff --git a/content_scripts/mode_key_handler.coffee b/content_scripts/mode_key_handler.coffee index 567552c0..60633895 100644 --- a/content_scripts/mode_key_handler.coffee +++ b/content_scripts/mode_key_handler.coffee @@ -24,30 +24,33 @@ class KeyHandlerMode extends Mode @reset() false # Suppress event. else if keyChar and @mappingForKeyChar keyChar - @keydownEvents[event.keyCode] = true - @handleKeyChar event, keyChar + @unlessKeyCharIsPassKey keyChar, => + @keydownEvents[event.keyCode] = true + @handleKeyChar event, keyChar else if keyChar @continueBubbling else if (keyChar = KeyboardUtils.getKeyChar event) and (@mappingForKeyChar(keyChar) or @isCountKey keyChar) # We will probably be handling a subsequent keypress event, so suppress propagation of this event to # prevent triggering page event listeners (e.g. Google instant Search). - @keydownEvents[event.keyCode] = true - DomUtils.suppressPropagation event - @stopBubblingAndTrue + @unlessKeyCharIsPassKey keyChar, => + @keydownEvents[event.keyCode] = true + DomUtils.suppressPropagation event + @stopBubblingAndTrue else @continueBubbling onKeypress: (event) -> keyChar = KeyboardUtils.getKeyCharString event - if keyChar and @mappingForKeyChar keyChar - @handleKeyChar event, keyChar - else if keyChar and @isCountKey keyChar - digit = parseInt keyChar - @reset if @keyState.length == 1 then @countPrefix * 10 + digit else digit - false # Suppress event. - else - @reset() - @continueBubbling + @unlessKeyCharIsPassKey keyChar, => + if keyChar and @mappingForKeyChar keyChar + @handleKeyChar event, keyChar + else if keyChar and @isCountKey keyChar + digit = parseInt keyChar + @reset if @keyState.length == 1 then @countPrefix * 10 + digit else digit + false # Suppress event. + else + @reset() + @continueBubbling onKeyup: (event) -> if event.keyCode of @keydownEvents @@ -87,9 +90,14 @@ class KeyHandlerMode extends Mode isCountKey: (keyChar) -> keyChar.length == 1 and (if 0 < @countPrefix then '0' else '1') <= keyChar <= '9' - # This tests whether keyChar would be the very first character of a command mapping. - isFirstKeyChar: (keyChar) -> - @countPrefix == 0 and (@mappingForKeyChar(keyChar) == @keyMapping or @isCountKey keyChar) + # 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 handled as regular keys. + unlessKeyCharIsPassKey: (keyChar, nonPassKeyCallback) -> + if (@passKeys? and keyChar?.length == 1 and 0 <= @passKeys.indexOf(keyChar) and + @countPrefix == 0 and @keyState.length == 1) + @stopBubblingAndTrue + else + nonPassKeyCallback() root = exports ? window root.KeyHandlerMode = KeyHandlerMode -- cgit v1.2.3