aboutsummaryrefslogtreecommitdiffstats
path: root/content_scripts
diff options
context:
space:
mode:
authorStephen Blott2015-01-22 05:04:21 +0000
committerStephen Blott2015-01-22 05:04:21 +0000
commit7044838e934e5f717335bdd73c91823807463071 (patch)
tree1b4f2531ed9e210d72c4f39cfce8f1f6784e240c /content_scripts
parentc4735264f46fdc62020c81bd8ff6f67ebd1dad9a (diff)
downloadvimium-7044838e934e5f717335bdd73c91823807463071.tar.bz2
Visual/edit modes: refactor.
Diffstat (limited to 'content_scripts')
-rw-r--r--content_scripts/mode_movement.coffee93
-rw-r--r--content_scripts/mode_visual.coffee39
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