aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content_scripts/vimium_frontend.coffee46
-rw-r--r--lib/keyboard_utils.coffee29
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