diff options
| -rw-r--r-- | content_scripts/vimium_frontend.coffee | 46 | ||||
| -rw-r--r-- | lib/keyboard_utils.coffee | 29 |
2 files changed, 37 insertions, 38 deletions
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() diff --git a/lib/keyboard_utils.coffee b/lib/keyboard_utils.coffee index f123f75a..4c149b48 100644 --- a/lib/keyboard_utils.coffee +++ b/lib/keyboard_utils.coffee @@ -66,6 +66,35 @@ KeyboardUtils = @getKeyChar event keyChar.length == 1 + # Return the Vimium key representation for this keyboard event. Return a falsy value (the empty string or + # undefined) when no Vimium representation is appropriate. + getKeyCharString: (event) -> + switch event.type + when "keypress" + # Ignore modifier keys by themselves. + if 31 < event.keyCode + String.fromCharCode event.charCode + + when "keydown" + # 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 = @getKeyChar event + # Again, ignore just modifiers. Maybe this should replace the keyCode>31 condition. + if 0 < keyChar.length + modifiers = [] + + keyChar = keyChar.toUpperCase() if event.shiftKey + modifiers.push "m" if event.metaKey + modifiers.push "c" if event.ctrlKey + modifiers.push "a" if event.altKey + + keyChar = [modifiers..., keyChar].join "-" + keyChar = "<#{keyChar}>" if 1 < keyChar.length + keyChar + KeyboardUtils.init() root = exports ? window |
