aboutsummaryrefslogtreecommitdiffstats
path: root/content_scripts/mode_key_handler.coffee
diff options
context:
space:
mode:
authorStephen Blott2016-02-29 06:07:01 +0000
committerStephen Blott2016-03-05 05:39:33 +0000
commit9cfa00bc7db3e07c3abbeb09e483d9fdf20bbc17 (patch)
tree36582874bbf16741cc097613527e55065328ae8a /content_scripts/mode_key_handler.coffee
parentf2bced459457dcc962d4bafe2fdf2e6245506ee3 (diff)
downloadvimium-9cfa00bc7db3e07c3abbeb09e483d9fdf20bbc17.tar.bz2
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.
Diffstat (limited to 'content_scripts/mode_key_handler.coffee')
-rw-r--r--content_scripts/mode_key_handler.coffee42
1 files changed, 25 insertions, 17 deletions
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