diff options
Diffstat (limited to 'lib/keyboard_utils.coffee')
| -rw-r--r-- | lib/keyboard_utils.coffee | 51 | 
1 files changed, 33 insertions, 18 deletions
| diff --git a/lib/keyboard_utils.coffee b/lib/keyboard_utils.coffee index 10b5f46e..364ab949 100644 --- a/lib/keyboard_utils.coffee +++ b/lib/keyboard_utils.coffee @@ -4,7 +4,7 @@ KeyboardUtils =      f12: 123, tab: 9, downArrow: 40, upArrow: 38 }    keyNames: -    { 37: "left", 38: "up", 39: "right", 40: "down" } +    { 37: "left", 38: "up", 39: "right", 40: "down", 32: "space" }    # This is a mapping of the incorrect keyIdentifiers generated by Webkit on Windows during keydown events to    # the correct identifiers, which are correctly generated on Mac. We require this mapping to properly handle @@ -30,7 +30,27 @@ KeyboardUtils =      else        @platform = "Windows" +  # We are migrating from using event.keyIdentifier to using event.key.  For some period of time, we must +  # support both.  This wrapper can be removed once Chrome 52 is considered too old to support.    getKeyChar: (event) -> +    if event.key? +      @getKeyCharUsingKey event +    else +      @getKeyCharUsingKeyIdentifier event + +  getKeyCharUsingKey: (event) -> +    if event.keyCode of @keyNames +      @keyNames[event.keyCode] +    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 +      "" + +  getKeyCharUsingKeyIdentifier: (event) ->      # Not a letter      if (event.keyIdentifier.slice(0, 2) != "U+")        return @keyNames[event.keyCode] if (@keyNames[event.keyCode]) @@ -76,23 +96,18 @@ KeyboardUtils =            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 "-" -            if 1 < keyChar.length then "<#{keyChar}>" else keyChar +        # Handle special keys and normal input keys with modifiers being pressed. +        keyChar = @getKeyChar event +        if 1 < keyChar.length or (keyChar.length == 1 and (event.metaKey or event.ctrlKey or event.altKey)) +          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 "-" +          if 1 < keyChar.length then "<#{keyChar}>" else keyChar  KeyboardUtils.init() | 
