diff options
| author | Stephen Blott | 2015-01-03 18:32:47 +0000 |
|---|---|---|
| committer | Stephen Blott | 2015-01-03 18:33:33 +0000 |
| commit | 7537736a0898f736d689092b9bd350886f327ab0 (patch) | |
| tree | 78cc0cd10b1576b01c17c73b1c6b4e69c19a6858 | |
| parent | 6a817e575d55daec146203e7ef8929fdfd81bace (diff) | |
| download | vimium-7537736a0898f736d689092b9bd350886f327ab0.tar.bz2 | |
Modes; add ConstrainedMode.
| -rw-r--r-- | content_scripts/mode.coffee | 19 | ||||
| -rw-r--r-- | content_scripts/mode_visual.coffee | 6 |
2 files changed, 22 insertions, 3 deletions
diff --git a/content_scripts/mode.coffee b/content_scripts/mode.coffee index a19c3df0..e4e2679d 100644 --- a/content_scripts/mode.coffee +++ b/content_scripts/mode.coffee @@ -83,7 +83,26 @@ class MultiMode extends Mode exit: -> mode.exit() for mode in modes +# When the user clicks anywhere outside of the given element, the mode is exited. +class ConstrainedMode extends Mode + constructor: (@element, options) -> + options.name = if options.name? then "constrained-#{options.name}" else "constrained" + super options + + @handlers.push handlerStack.push + "click": (event) => + @exit() unless @isDOMDescendant @element, event.srcElement + @continueBubbling + + isDOMDescendant: (parent, child) -> + node = child + while (node != null) + return true if (node == parent) + node = node.parentNode + false + root = exports ? window root.Mode = Mode root.SingletonMode = SingletonMode root.MultiMode = MultiMode +root.ConstrainedMode = ConstrainedMode diff --git a/content_scripts/mode_visual.coffee b/content_scripts/mode_visual.coffee index 67f485a0..07530e94 100644 --- a/content_scripts/mode_visual.coffee +++ b/content_scripts/mode_visual.coffee @@ -1,12 +1,12 @@ -class VisualMode extends Mode +class VisualMode extends ConstrainedMode # Proposal... The visual selection must stay within element. This will become relevant if we ever get so # far as implementing a vim-like editing mode for text areas/content editable. # constructor: (element=document.body) -> - super - name: "Visual" + super element, + name: "visual" badge: "V" keydown: (event) => |
