]> git.gir.st - VimFx.git/blob - extension/packages/key-utils.coffee
Add gulp release task
[VimFx.git] / extension / packages / key-utils.coffee
1 ###
2 # Copyright Anton Khodakivskiy 2012.
3 # Copyright Simon Lydell 2013, 2014.
4 #
5 # This file is part of VimFx.
6 #
7 # VimFx is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # VimFx is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with VimFx. If not, see <http://www.gnu.org/licenses/>.
19 ###
20
21 { interfaces: Ci } = Components
22
23 KE = Ci.nsIDOMKeyEvent
24
25 # Extract keyChar from keyCode taking into account the shift modifier
26 keyCharFromCode = (keyCode, shiftKey = false) ->
27 keyChar = undefined
28 if keyCode >= KE.DOM_VK_A and keyCode <= KE.DOM_VK_Z
29 keyChar = String.fromCharCode(keyCode)
30 if shiftKey
31 keyChar = keyChar.toUpperCase()
32 else
33 keyChar = keyChar.toLowerCase()
34 else
35 fn = (code, codeWithShift, char, charWithShift) ->
36 if keyCode == code
37 return if shiftKey then charWithShift else char
38 else if keyCode == codeWithShift
39 return charWithShift
40
41 options = [
42 [KE.DOM_VK_ESCAPE, KE.DOM_VK_ESCAPE, 'Esc', 'Shift-Esc' ]
43 [KE.DOM_VK_BACK_SPACE, KE.DOM_VK_BACK_SPACE, 'Backspace', 'Shift-Backspace']
44 [KE.DOM_VK_SPACE, KE.DOM_VK_SPACE, 'Space', 'Shift-Space' ]
45 [KE.DOM_VK_TAB, KE.DOM_VK_TAB, 'Tab', 'Shift-Tab' ]
46 [KE.DOM_VK_RETURN, KE.DOM_VK_RETURN, 'Return', 'Shift-Return' ]
47 [KE.DOM_VK_LEFT, KE.DOM_VK_LEFT, 'Left', 'Shift-Left' ]
48 [KE.DOM_VK_RIGHT, KE.DOM_VK_RIGHT, 'Right', 'Shift-Right' ]
49 [KE.DOM_VK_UP, KE.DOM_VK_UP, 'Up', 'Shift-Up' ]
50 [KE.DOM_VK_DOWN, KE.DOM_VK_DOWN, 'Down', 'Shift-Down' ]
51
52 [KE.DOM_VK_1, KE.DOM_VK_EXCLAMATION, '1', '!']
53 [KE.DOM_VK_2, KE.DOM_VK_AT, '2', '@']
54 [KE.DOM_VK_3, KE.DOM_VK_HASH, '3', '#']
55 [KE.DOM_VK_4, KE.DOM_VK_DOLLAR, '4', '$']
56 [KE.DOM_VK_5, KE.DOM_VK_PERCENT, '5', '%']
57 [KE.DOM_VK_6, KE.DOM_VK_CIRCUMFLEX, '6', '^']
58 [KE.DOM_VK_7, KE.DOM_VK_AMPERSAND, '7', '&']
59 [KE.DOM_VK_8, KE.DOM_VK_ASTERISK, '8', '*']
60 [KE.DOM_VK_9, KE.DOM_VK_OPEN_PAREN, '9', '(']
61 [KE.DOM_VK_0, KE.DOM_VK_CLOSE_PAREN, '0', ')']
62
63 [KE.DOM_VK_OPEN_BRACKET, KE.DOM_VK_OPEN_CURLY_BRACKET, '[', '{']
64 [KE.DOM_VK_CLOSE_BRACKET, KE.DOM_VK_CLOSE_CURLY_BRACKET, ']', '}']
65 [KE.DOM_VK_SEMICOLON, KE.DOM_VK_COLON, ';', ':']
66 [KE.DOM_VK_QUOTE, KE.DOM_VK_DOUBLEQUOTE, "'", '"']
67 [KE.DOM_VK_BACK_QUOTE, KE.DOM_VK_TILDE, '`', '~']
68 [KE.DOM_VK_BACK_SLASH, KE.DOM_VK_PIPE, '\\','|']
69 [KE.DOM_VK_COMMA, KE.DOM_VK_LESS_THAN, ',', '<']
70 [KE.DOM_VK_PERIOD, KE.DOM_VK_GREATER_THAN, '.', '>']
71 [KE.DOM_VK_SLASH, KE.DOM_VK_QUESTION_MARK, '/', '?']
72 [KE.DOM_VK_HYPHEN_MINUS, KE.DOM_VK_UNDERSCORE, '-', '_']
73 [KE.DOM_VK_EQUALS, KE.DOM_VK_PLUS, '=', '+']
74 ]
75
76 for opt in options
77 if char = fn(opt...)
78 keyChar = char
79 break
80
81 return keyChar
82
83 # Format keyChar that arrives during `keypress` into keyStr.
84 applyModifiers = (keyChar, ctrlKey = false, altKey = false, metaKey = false) ->
85 if not keyChar
86 return keyChar
87
88 modifier = ''
89 modifier += 'c' if ctrlKey
90 modifier += 'm' if metaKey
91 modifier += 'a' if altKey
92
93 if modifier.length > 0
94 return "#{ modifier }-#{ keyChar }"
95 else
96 return keyChar
97
98 exports.keyCharFromCode = keyCharFromCode
99 exports.applyModifiers = applyModifiers
Imprint / Impressum