diff options
| author | Stephen Blott | 2016-02-29 06:07:01 +0000 |
|---|---|---|
| committer | Stephen Blott | 2016-03-05 05:39:33 +0000 |
| commit | 9cfa00bc7db3e07c3abbeb09e483d9fdf20bbc17 (patch) | |
| tree | 36582874bbf16741cc097613527e55065328ae8a /content_scripts | |
| parent | f2bced459457dcc962d4bafe2fdf2e6245506ee3 (diff) | |
| download | vimium-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')
| -rw-r--r-- | content_scripts/mode_key_handler.coffee | 42 | ||||
| -rw-r--r-- | content_scripts/mode_passkeys.coffee | 23 | ||||
| -rw-r--r-- | content_scripts/vimium_frontend.coffee | 4 |
3 files changed, 27 insertions, 42 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 diff --git a/content_scripts/mode_passkeys.coffee b/content_scripts/mode_passkeys.coffee deleted file mode 100644 index 7efa559c..00000000 --- a/content_scripts/mode_passkeys.coffee +++ /dev/null @@ -1,23 +0,0 @@ - -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: => ([_, @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. - handleKeyChar: (event, keyChar) -> - 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 - @nextKeyup = @stopBubblingAndTrue - -root = exports ? window -root.PassKeysMode = PassKeysMode diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index ec666a23..46b21ed0 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -98,6 +98,7 @@ class NormalMode extends KeyHandlerMode super extend options, name: "normal" indicator: false # There is no mode indicator in normal mode. + trackState: true # Maintain @passKeys. commandHandler: @commandHandler.bind this chrome.storage.local.get "normalModeKeyStateMapping", (items) => @@ -127,8 +128,7 @@ class NormalMode extends KeyHandlerMode window.initializeModes = (args...) -> # Install the permanent modes. The permanently-installed insert mode tracks focus/blur events, and # activates/deactivates itself accordingly. - normalMode = new NormalMode args... - new PassKeysMode normalMode + new NormalMode args... new InsertMode permanent: true Scroller.init() |
