From 91bcedbf4aebbd2691ef68ca96094206a942a1b8 Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Wed, 2 Mar 2016 08:44:42 +0000 Subject: Key bindings; simplify pass-key logic. --- content_scripts/mode_key_handler.coffee | 45 +++++++++++++++------------------ 1 file changed, 20 insertions(+), 25 deletions(-) (limited to 'content_scripts') diff --git a/content_scripts/mode_key_handler.coffee b/content_scripts/mode_key_handler.coffee index 397e64c8..fc4d485e 100644 --- a/content_scripts/mode_key_handler.coffee +++ b/content_scripts/mode_key_handler.coffee @@ -42,32 +42,29 @@ class KeyHandlerMode extends Mode @reset() false # Suppress event. else if @keyCharIsMapped keyChar - @unlessKeyCharIsPassKey keyChar, => - @keydownEvents[event.keyCode] = true - @handleKeyChar event, keyChar + @keydownEvents[event.keyCode] = true + @handleKeyChar event, keyChar else if not keyChar and (keyChar = KeyboardUtils.getKeyChar event) and (@keyCharIsMapped(keyChar) or @isCountKey keyChar) # We will possibly be handling a subsequent keypress event, so suppress propagation of this event to # prevent triggering page event listeners (e.g. Google instant Search). - @unlessKeyCharIsPassKey keyChar, => - @keydownEvents[event.keyCode] = true - DomUtils.suppressPropagation event - @stopBubblingAndTrue + @keydownEvents[event.keyCode] = true + DomUtils.suppressPropagation event + @stopBubblingAndTrue else @continueBubbling onKeypress: (event) -> keyChar = KeyboardUtils.getKeyCharString event - @unlessKeyCharIsPassKey keyChar, => - if @keyCharIsMapped keyChar - @handleKeyChar event, keyChar - else if @isCountKey keyChar - digit = parseInt keyChar - @reset if @keyState.length == 1 then @countPrefix * 10 + digit else digit - false # Suppress event. - else - @reset() - @continueBubbling + if @keyCharIsMapped keyChar + @handleKeyChar event, keyChar + else if @isCountKey keyChar + digit = parseInt keyChar + @reset if @keyState.length == 1 then @countPrefix * 10 + digit else digit + false # Suppress event. + else + @reset() + @continueBubbling onKeyup: (event) -> return @continueBubbling unless event.keyCode of @keydownEvents @@ -75,9 +72,9 @@ class KeyHandlerMode extends Mode DomUtils.suppressPropagation event @stopBubblingAndTrue - # This tests whether there is a mapping of keyChar in the current key state. + # This tests whether there is a mapping of keyChar in the current key state (and accounts for pass keys). keyCharIsMapped: (keyChar) -> - (mapping for mapping in @keyState when keyChar of mapping)[0]? + (mapping for mapping in @keyState when keyChar of mapping)[0]? and not @isPassKey keyChar handleKeyChar: (event, keyChar) -> bgLog "Handling key #{keyChar}, mode=#{@name}." @@ -93,15 +90,13 @@ class KeyHandlerMode extends Mode false # Suppress event. isCountKey: (keyChar) -> - keyChar?.length == 1 and (if 0 < @countPrefix then '0' else '1') <= keyChar <= '9' + keyChar?.length == 1 and (if 0 < @countPrefix then '0' else '1') <= keyChar <= '9' and + not @isPassKey keyChar # Keystrokes are *never* considered passKeys if the user has begun entering a command. So, for example, if # 't' is a passKey, then the "t"-s of 'gt' and '99t' are neverthless handled as regular keys. - unlessKeyCharIsPassKey: (keyChar, nonPassKeyCallback) -> - if @countPrefix == 0 and @keyState.length == 1 and keyChar in (@passKeys ? "") - @stopBubblingAndTrue - else - nonPassKeyCallback() + isPassKey: (keyChar) -> + @countPrefix == 0 and @keyState.length == 1 and keyChar in (@passKeys ? "") root = exports ? window root.KeyHandlerMode = KeyHandlerMode -- cgit v1.2.3