diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/keyboard_utils.coffee | 60 | ||||
| -rw-r--r-- | lib/settings.coffee | 4 | 
2 files changed, 54 insertions, 10 deletions
| diff --git a/lib/keyboard_utils.coffee b/lib/keyboard_utils.coffee index 5f37ddd0..e14e8b3e 100644 --- a/lib/keyboard_utils.coffee +++ b/lib/keyboard_utils.coffee @@ -16,17 +16,32 @@ KeyboardUtils =        @platform = "Windows"    getKeyChar: (event) -> -    if event.key of @keyNames -      @keyNames[event.key] -    # It appears that event.key is not always defined (see #2453). -    else if not event.key? +    unless Settings.get "ignoreKeyboardLayout" +      key = event.key +    else if event.code[...6] == "Numpad" +      # We cannot correctly emulate the numpad, so fall back to event.key; see #2626. +      key = event.key +    else +      # The logic here is from the vim-like-key-notation project (https://github.com/lydell/vim-like-key-notation). +      key = event.code +      key = key[3..] if key[...3] == "Key" +      # Translate some special keys to event.key-like strings and handle <Shift>. +      if @enUsTranslations[key] +        key = if event.shiftKey then @enUsTranslations[key][1] else @enUsTranslations[key][0] +      else if key.length == 1 and not event.shiftKey +        key = key.toLowerCase() + +    if key of @keyNames +      @keyNames[key] +    # It appears that key is not always defined (see #2453). +    else if not key?        "" -    else if event.key.length == 1 -      event.key -    else if event.key.length == 2 and "F1" <= event.key <= "F9" -      event.key.toLowerCase() # F1 to F9. -    else if event.key.length == 3 and "F10" <= event.key <= "F12" -      event.key.toLowerCase() # F10 to F12. +    else if key.length == 1 +      key +    else if key.length == 2 and "F1" <= key <= "F9" +      key.toLowerCase() # F1 to F9. +    else if key.length == 3 and "F10" <= key <= "F12" +      key.toLowerCase() # F10 to F12.      else        "" @@ -55,6 +70,31 @@ KeyboardUtils =    isPrintable: (event) ->      @getKeyCharString(event)?.length == 1 +  enUsTranslations: +    "Backquote":     ["`", "~"] +    "Minus":         ["-", "_"] +    "Equal":         ["=", "+"] +    "Backslash":     ["\\","|"] +    "IntlBackslash": ["\\","|"] +    "BracketLeft":   ["[", "{"] +    "BracketRight":  ["]", "}"] +    "Semicolon":     [";", ":"] +    "Quote":         ["'", '"'] +    "Comma":         [",", "<"] +    "Period":        [".", ">"] +    "Slash":         ["/", "?"] +    "Space":         [" ", " "] +    "Digit1":        ["1", "!"] +    "Digit2":        ["2", "@"] +    "Digit3":        ["3", "#"] +    "Digit4":        ["4", "$"] +    "Digit5":        ["5", "%"] +    "Digit6":        ["6", "^"] +    "Digit7":        ["7", "&"] +    "Digit8":        ["8", "*"] +    "Digit9":        ["9", "("] +    "Digit0":        ["0", ")"] +  KeyboardUtils.init()  root = exports ? window diff --git a/lib/settings.coffee b/lib/settings.coffee index 62dc09e7..38718990 100644 --- a/lib/settings.coffee +++ b/lib/settings.coffee @@ -10,6 +10,9 @@  #  # In all cases except Settings.defaults, values are stored as jsonified strings. +# If the current frame is the Vomnibar or the HUD, then we'll need our Chrome stubs for the tests. +window.chrome ?= window.top?.chrome +  storageArea = if chrome.storage.sync? then "sync" else "local"  Settings = @@ -193,6 +196,7 @@ Settings =      helpDialog_showAdvancedCommands: false      optionsPage_showAdvancedOptions: false      passNextKeyKeys: [] +    ignoreKeyboardLayout: false  Settings.init() | 
