]> git.gir.st - VimFx.git/blob - extension/packages/key-utils.coffee
Merge pull request #147 from lydell/bugfixes
[VimFx.git] / extension / packages / key-utils.coffee
1 { interfaces: Ci } = Components
2
3 KE = Ci.nsIDOMKeyEvent
4
5 # Extract keyChar from keyCode taking into account the shift modifier
6 keyCharFromCode = (keyCode, shiftKey = false) ->
7 keyChar = undefined
8 if keyCode >= KE.DOM_VK_A and keyCode <= KE.DOM_VK_Z
9 keyChar = String.fromCharCode(keyCode)
10 if shiftKey
11 keyChar = keyChar.toUpperCase()
12 else
13 keyChar = keyChar.toLowerCase()
14 else
15 fn = (code, codeWithShift, char, charWithShift) ->
16 if keyCode == code
17 return if shiftKey then charWithShift else char
18 else if keyCode == codeWithShift
19 return charWithShift
20
21 options = [
22 [ KE.DOM_VK_ESCAPE, KE.DOM_VK_ESCAPE, 'Esc', 'Shift-Esc' ],
23 [ KE.DOM_VK_BACK_SPACE, KE.DOM_VK_BACK_SPACE, 'Backspace', 'Shift-Backspace' ],
24 [ KE.DOM_VK_SPACE, KE.DOM_VK_SPACE, 'Space', 'Shift-Space' ],
25 [ KE.DOM_VK_TAB, KE.DOM_VK_TAB, 'Tab', 'Shift-Tab' ],
26 [ KE.DOM_VK_RETURN, KE.DOM_VK_RETURN, 'Return', 'Shift-Return' ],
27
28 [ KE.DOM_VK_1, KE.DOM_VK_EXCLAMATION, '1', '!' ],
29 [ KE.DOM_VK_2, KE.DOM_VK_AT, '2', '@' ],
30 [ KE.DOM_VK_3, KE.DOM_VK_HASH, '3', '#' ],
31 [ KE.DOM_VK_4, KE.DOM_VK_DOLLAR, '4', '$' ],
32 [ KE.DOM_VK_5, KE.DOM_VK_PERCENT, '5', '%' ],
33 [ KE.DOM_VK_6, KE.DOM_VK_CIRCUMFLEX, '6', '^' ],
34 [ KE.DOM_VK_7, KE.DOM_VK_AMPERSAND, '7', '&' ],
35 [ KE.DOM_VK_8, KE.DOM_VK_ASTERISK, '8', '*' ],
36 [ KE.DOM_VK_9, KE.DOM_VK_OPEN_PAREN, '9', '(' ],
37 [ KE.DOM_VK_0, KE.DOM_VK_CLOSE_PAREN, '0', ')' ],
38
39 [ KE.DOM_VK_OPEN_BRACKET, KE.DOM_VK_OPEN_CURLY_BRACKET, '[', '{' ],
40 [ KE.DOM_VK_CLOSE_BRACKET, KE.DOM_VK_CLOSE_CURLY_BRACKET, ']', '}' ],
41 [ KE.DOM_VK_SEMICOLON, KE.DOM_VK_COLON, ';', ':' ],
42 [ KE.DOM_VK_QUOTE, KE.DOM_VK_DOUBLEQUOTE, "'", '"' ],
43 [ KE.DOM_VK_BACK_QUOTE, KE.DOM_VK_TILDE, '`', '~' ],
44 [ KE.DOM_VK_BACK_SLASH, KE.DOM_VK_PIPE, '\\', '|' ],
45 [ KE.DOM_VK_COMMA, KE.DOM_VK_LESS_THAN, ',', '<' ],
46 [ KE.DOM_VK_PERIOD, KE.DOM_VK_GREATER_THAN, '.', '>' ],
47 [ KE.DOM_VK_SLASH, KE.DOM_VK_QUESTION_MARK, '/', '?' ],
48 [ KE.DOM_VK_HYPHEN_MINUS, KE.DOM_VK_UNDERSCORE, '-', '_' ],
49 [ KE.DOM_VK_EQUALS, KE.DOM_VK_PLUS, '=', '+' ],
50 ]
51
52 for opt in options
53 if char = fn(opt...)
54 keyChar = char
55 break
56
57 return keyChar
58
59 # Format keyChar that arrives during `keypress` into keyStr
60 applyModifiers = (keyChar, ctrlKey = false, altKey = false, metaKey = false) ->
61 if not keyChar
62 return keyChar
63
64 modifier = ''
65 modifier += 'c' if ctrlKey
66 modifier += 'm' if metaKey
67 modifier += 'a' if altKey
68
69 if modifier.length > 0
70 return "#{ modifier }-#{ keyChar }"
71 else
72 return keyChar
73
74 exports.keyCharFromCode = keyCharFromCode
75 exports.applyModifiers = applyModifiers
Imprint / Impressum