diff options
| author | Stephen Blott | 2015-01-22 05:04:21 +0000 |
|---|---|---|
| committer | Stephen Blott | 2015-01-22 05:04:21 +0000 |
| commit | 7044838e934e5f717335bdd73c91823807463071 (patch) | |
| tree | 1b4f2531ed9e210d72c4f39cfce8f1f6784e240c /content_scripts | |
| parent | c4735264f46fdc62020c81bd8ff6f67ebd1dad9a (diff) | |
| download | vimium-7044838e934e5f717335bdd73c91823807463071.tar.bz2 | |
Visual/edit modes: refactor.
Diffstat (limited to 'content_scripts')
| -rw-r--r-- | content_scripts/mode_movement.coffee | 93 | ||||
| -rw-r--r-- | content_scripts/mode_visual.coffee | 39 |
2 files changed, 69 insertions, 63 deletions
diff --git a/content_scripts/mode_movement.coffee b/content_scripts/mode_movement.coffee index c81b698a..5f35449c 100644 --- a/content_scripts/mode_movement.coffee +++ b/content_scripts/mode_movement.coffee @@ -1,5 +1,51 @@ -class Movement extends Mode +# This prevents unmapped printable characters from being passed through to underlying page. +class SuppressPrintable extends Mode + constructor: (options) -> + + handler = (event) => + if KeyboardUtils.isPrintable event + if event.type == "keydown" + DomUtils. suppressPropagation + @stopBubblingAndTrue + else + @suppressEvent + else + @stopBubblingAndTrue + + @suppressPrintableHandlerId = handlerStack.push + _name: "movement/suppress-printable" + keydown: handler + keypress: handler + keyup: handler + + super options + @onExit => handlerStack.remove @suppressPrintableHandlerId + +# This watches keyboard events, and maintains @countPrefix as count-prefic and other keys are pressed. +class MaintainCount extends SuppressPrintable + constructor: (options) -> + @countPrefix = "" + super options + + isNumberKey = (keyChar) -> + keyChar and keyChar.length == 1 and "0" <= keyChar <= "9" + + @push + _name: "movement/maintain-count" + keypress: (event) => + @alwaysContinueBubbling => + unless event.metaKey or event.ctrlKey or event.altKey + keyChar = String.fromCharCode event.charCode + @countPrefix = if isNumberKey keyChar then @countPrefix + keyChar else "" + + countPrefixTimes: (func) -> + countPrefix = if 0 < @countPrefix.length then parseInt @countPrefix else 1 + @countPrefix = "" + func() for [0...countPrefix] + +# This implements movement commands with count prefixes (using MaintainCount) for visual and edit modes. +class Movement extends MaintainCount movements: h: "backward character" l: "forward character" @@ -9,42 +55,21 @@ class Movement extends Mode e: "forward word" constructor: (options) -> - @countPrefix = "" - @alterMethod = options.alterMethod + @alterMethod = options.alterMethod || "extend" super options - isNumberKey = (keyChar) -> - keyChar.length == 1 and "0" <= keyChar <= "9" - @push - keydown: (event) => @alwaysContinueBubbling => - unless event.metaKey or event.ctrlKey or event.altKey - keyChar = KeyboardUtils.getKeyChar event - @countPrefix += keyChar if isNumberKey keyChar - keyup: (event) => @alwaysContinueBubbling => - # FIXME(smblott). Need to revisit these test. They do not cover all cases correctly. - unless event.metaKey or event.ctrlKey or event.altKey or event.keyCode == keyCodes.shiftKey - keyChar = KeyboardUtils.getKeyChar event - if keyChar and not isNumberKey keyChar - @countPrefix = "" - - move: (keyChar) -> - if @movements[keyChar] - Utils.suppressor.suppress Movement, => - countPrefix = if 0 < @countPrefix.length then parseInt @countPrefix else 1 - @countPrefix = "" - for [0...countPrefix] - if "string" == typeof @movements[keyChar] - window.getSelection().modify @alterMethod, @movements[keyChar].split(/\s+/)... - else if "function" == typeof @movements[keyChar] - @movements[keyChar]() - Utils.suppressor.unlessSuppressed Movement, => @postMove?() - - isMoveChar: (event, keyChar) -> - return false if event.metaKey or event.ctrlKey or event.altKey - @movements[keyChar] - -# setTimeout (-> new Movement {}), 500 + _name: "movement" + keypress: (event) => + @alwaysContinueBubbling => + unless event.metaKey or event.ctrlKey or event.altKey + keyChar = String.fromCharCode event.charCode + if @movements[keyChar] + @countPrefixTimes => + if "string" == typeof @movements[keyChar] + window.getSelection().modify @alterMethod, @movements[keyChar].split(/\s+/)... + else if "function" == typeof @movements[keyChar] + @movements[keyChar]() root = exports ? window root.Movement = Movement diff --git a/content_scripts/mode_visual.coffee b/content_scripts/mode_visual.coffee index 36501f3e..64463a67 100644 --- a/content_scripts/mode_visual.coffee +++ b/content_scripts/mode_visual.coffee @@ -8,38 +8,19 @@ class VisualMode extends Movement exitOnBlur: options.targetElement alterMethod: "extend" - keydown: (event) => @handleKeyEvent event, KeyboardUtils.getKeyChar event - keyup: (event) => @handleKeyEvent event, KeyboardUtils.getKeyChar event keypress: (event) => - keyChar = String.fromCharCode event.charCode - @handleKeyEvent event, keyChar, => @move keyChar + @alwaysContinueBubbling => + unless event.metaKey or event.ctrlKey or event.altKey + switch String.fromCharCode event.charCode + when "y" + chrome.runtime.sendMessage + handler: "copyToClipboard" + data: window.getSelection().toString() + @exit() + # TODO(smblott). Suppress next keyup. super extend defaults, options - - handleKeyEvent: (event, keyChar, func = ->) -> - if event.metaKey or event.ctrlKey or event.altKey - @stopBubblingAndTrue - else if event.type == "keypress" and @isMoveChar event, keyChar - func keyChar - @suppressEvent - else if @handleVisualModeKey(keyChar) or @isMoveChar event, keyChar - DomUtils.suppressPropagation - @stopBubblingAndTrue - else if KeyboardUtils.isPrintable event - @suppressEvent - else - @stopBubblingAndTrue - - handleVisualModeKey: (keyChar) -> - switch keyChar - when "y" - chrome.runtime.sendMessage - handler: "copyToClipboard" - data: window.getSelection().toString() - @exit() - true - else - false + @debug = true root = exports ? window root.VisualMode = VisualMode |
