From daa357f1a753fd4c17427f68e0f0c3338e9d668b Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Tue, 9 Feb 2016 16:51:20 +0000 Subject: PassNextKey; initial implementation. This implements a passNextKey command (initially for normal mode only), as discussed in #1955. --- content_scripts/mode_insert.coffee | 27 +++++++++++++++++++++++++++ content_scripts/vimium_frontend.coffee | 3 +++ 2 files changed, 30 insertions(+) (limited to 'content_scripts') diff --git a/content_scripts/mode_insert.coffee b/content_scripts/mode_insert.coffee index 0b040e5d..8dd02530 100644 --- a/content_scripts/mode_insert.coffee +++ b/content_scripts/mode_insert.coffee @@ -98,5 +98,32 @@ class InsertMode extends Mode @suppressedEvent: null @suppressEvent: (event) -> @suppressedEvent = event +# This implements the pasNexKey command. +class PassNextKeyMode extends Mode + constructor: (count = 1) -> + seenKeyDown = false + keyDownCount = 0 + + super + name: "pass-next-key" + indicator: "Pass next key." + # We exit on blur because, once we lose the focus, we can no longer track key events. + exitOnBlur: window + keypress: => + @stopBubblingAndTrue + + keydown: => + seenKeyDown = true + keyDownCount += 1 + @stopBubblingAndTrue + + keyup: => + if seenKeyDown + unless 0 < --keyDownCount + unless 0 < --count + @exit() + @stopBubblingAndTrue + root = exports ? window root.InsertMode = InsertMode +root.PassNextKeyMode = PassNextKeyMode diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index f78b79b0..01bd4ebc 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -368,6 +368,9 @@ extend window, enterVisualLineMode: -> new VisualLineMode + passNextKey: (count) -> + new PassNextKeyMode count + focusInput: do -> # Track the most recently focused input element. recentlyFocusedElement = null -- cgit v1.2.3 From aaccc059b2cbf47ee4d5290f8cf608b0ab318d92 Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Wed, 10 Feb 2016 13:27:45 +0000 Subject: PassNextKey; move key parsing to keyboard_utils.coffee. Previously, key event parsing was embedded in the normal-mode key handlers. Here, we move it to a new function (getKeyCharString) in KeyboardUtils so that it can also be used from elsewhere... In particular for detecting the pass-next-key key in insertmode. --- content_scripts/vimium_frontend.coffee | 46 ++++++---------------------------- 1 file changed, 8 insertions(+), 38 deletions(-) (limited to 'content_scripts') diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index 01bd4ebc..0e3b4c69 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -489,50 +489,20 @@ handlerStack.push # # @/this, here, is the the normal-mode Mode object. onKeypress = (event) -> - keyChar = "" + keyChar = KeyboardUtils.getKeyCharString event + if keyChar + if currentCompletionKeys.indexOf(keyChar) != -1 or isValidFirstKey keyChar + DomUtils.suppressEvent(event) + keyPort.postMessage keyChar:keyChar, frameId:frameId + return @stopBubblingAndTrue - # Ignore modifier keys by themselves. - if (event.keyCode > 31) - keyChar = String.fromCharCode(event.charCode) - - if (keyChar) - if currentCompletionKeys.indexOf(keyChar) != -1 or isValidFirstKey(keyChar) - DomUtils.suppressEvent(event) - keyPort.postMessage({ keyChar:keyChar, frameId:frameId }) - return @stopBubblingAndTrue - - keyPort.postMessage({ keyChar:keyChar, frameId:frameId }) + keyPort.postMessage keyChar:keyChar, frameId:frameId return @continueBubbling # @/this, here, is the the normal-mode Mode object. onKeydown = (event) -> - keyChar = "" - - # handle special keys, and normal input keys with modifiers being pressed. don't handle shiftKey alone (to - # avoid / being interpreted as ? - if (((event.metaKey || event.ctrlKey || event.altKey) && event.keyCode > 31) || ( - # TODO(philc): some events don't have a keyidentifier. How is that possible? - event.keyIdentifier && event.keyIdentifier.slice(0, 2) != "U+")) - keyChar = KeyboardUtils.getKeyChar(event) - # Again, ignore just modifiers. Maybe this should replace the keyCode>31 condition. - if (keyChar != "") - modifiers = [] - - if (event.shiftKey) - keyChar = keyChar.toUpperCase() - if (event.metaKey) - modifiers.push("m") - if (event.ctrlKey) - modifiers.push("c") - if (event.altKey) - modifiers.push("a") - - for own i of modifiers - keyChar = modifiers[i] + "-" + keyChar - - if (modifiers.length > 0 || keyChar.length > 1) - keyChar = "<" + keyChar + ">" + keyChar = KeyboardUtils.getKeyCharString event if (HelpDialog.showing && KeyboardUtils.isEscape(event)) HelpDialog.hide() -- cgit v1.2.3 From 02adaa7ad0c7921ebab5752470ff7f773802634c Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Wed, 10 Feb 2016 13:44:41 +0000 Subject: PassNextKey; handle pass-next-key in insert mode. (First "fully" functional version.) --- content_scripts/mode_insert.coffee | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'content_scripts') diff --git a/content_scripts/mode_insert.coffee b/content_scripts/mode_insert.coffee index 8dd02530..391e8c95 100644 --- a/content_scripts/mode_insert.coffee +++ b/content_scripts/mode_insert.coffee @@ -10,6 +10,13 @@ class InsertMode extends Mode handleKeyEvent = (event) => return @continueBubbling unless @isActive event + + # Check for the pass-next-key key. + keyChar = KeyboardUtils.getKeyCharString event + if keyChar and keyChar == Settings.get "passNextKeyKey" + new PassNextKeyMode + return false + return @stopBubblingAndTrue unless event.type == 'keydown' and KeyboardUtils.isEscape event DomUtils.suppressKeyupAfterEscape handlerStack target = event.srcElement -- cgit v1.2.3 From 201b51e1690bb993aa25a1c11f59afda6eab8747 Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Wed, 10 Feb 2016 13:52:43 +0000 Subject: PassNextKey; allow multiple mappings. This allows: map a passNextKey map b passNextKey (Previously, we only picked up the first mapping.) --- content_scripts/mode_insert.coffee | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'content_scripts') diff --git a/content_scripts/mode_insert.coffee b/content_scripts/mode_insert.coffee index 391e8c95..a35633ac 100644 --- a/content_scripts/mode_insert.coffee +++ b/content_scripts/mode_insert.coffee @@ -11,9 +11,8 @@ class InsertMode extends Mode handleKeyEvent = (event) => return @continueBubbling unless @isActive event - # Check for the pass-next-key key. - keyChar = KeyboardUtils.getKeyCharString event - if keyChar and keyChar == Settings.get "passNextKeyKey" + # Check for a pass-next-key key. + if KeyboardUtils.getKeyCharString(event) in Settings.get "passNextKeyKeys" new PassNextKeyMode return false -- cgit v1.2.3 From 251b5885c1fdb0ac8013f228ec383d0c3972d09c Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Wed, 10 Feb 2016 13:57:02 +0000 Subject: PassNextKey; fix tests. Oversight from 116ac2c2a279f8497ffd5396f43ac4fd7fd5de67. --- content_scripts/vimium_frontend.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'content_scripts') diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index 0e3b4c69..eb52e4ee 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -530,7 +530,7 @@ onKeydown = (event) -> # Subject to internationalization issues since we're using keyIdentifier instead of charCode (in keypress). # # TOOD(ilya): Revisit this. Not sure it's the absolute best approach. - if keyChar == "" && + if not keyChar && (currentCompletionKeys.indexOf(KeyboardUtils.getKeyChar(event)) != -1 || isValidFirstKey(KeyboardUtils.getKeyChar(event))) DomUtils.suppressPropagation(event) -- cgit v1.2.3