diff options
| author | Phil Crosby | 2012-05-05 20:15:27 -0700 |
|---|---|---|
| committer | Phil Crosby | 2012-05-05 20:24:33 -0700 |
| commit | 083ed4dc8282de961e1733e1d98a792d79befc5f (patch) | |
| tree | 30eb6fef963d3a70204c53c6a4c22c2893326a6c /lib/keyboard_utils.js | |
| parent | 6cec158a79263067e14ba9a8efef7bd2626203ad (diff) | |
| download | vimium-083ed4dc8282de961e1733e1d98a792d79befc5f.tar.bz2 | |
Put content scripts and background scripts in separate directories, so the purpose and execution mode are more clear.
Sorry if you had patches in your local copies and this breaks them -- these renames were
a long time coming, and now is better than later.
Diffstat (limited to 'lib/keyboard_utils.js')
| -rw-r--r-- | lib/keyboard_utils.js | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/lib/keyboard_utils.js b/lib/keyboard_utils.js new file mode 100644 index 00000000..52544c73 --- /dev/null +++ b/lib/keyboard_utils.js @@ -0,0 +1,66 @@ +var keyCodes = { + ESC: 27, backspace: 8, deleteKey: 46, enter: 13, space: 32, shiftKey: 16, f1: 112, f12: 123, tab: 9 +}; +var keyNames = { 37: "left", 38: "up", 39: "right", 40: "down" } + +// 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 +// these keys on Windows. See https://bugs.webkit.org/show_bug.cgi?id=19906 for more details. +var keyIdentifierCorrectionMap = { + "U+00C0": ["U+0060", "U+007E"], // `~ + "U+00BD": ["U+002D", "U+005F"], // -_ + "U+00BB": ["U+003D", "U+002B"], // =+ + "U+00DB": ["U+005B", "U+007B"], // [{ + "U+00DD": ["U+005D", "U+007D"], // ]} + "U+00DC": ["U+005C", "U+007C"], // \| + "U+00BA": ["U+003B", "U+003A"], // ;: + "U+00DE": ["U+0027", "U+0022"], // '" + "U+00BC": ["U+002C", "U+003C"], // ,< + "U+00BE": ["U+002E", "U+003E"], // .> + "U+00BF": ["U+002F", "U+003F"] // /? +}; + +var platform; +if (navigator.userAgent.indexOf("Mac") != -1) + platform = "Mac"; +else if (navigator.userAgent.indexOf("Linux") != -1) + platform = "Linux"; +else + platform = "Windows"; + +function getKeyChar(event) { + // Not a letter + if (event.keyIdentifier.slice(0, 2) != "U+") { + // Named key + if (keyNames[event.keyCode]) { + return keyNames[event.keyCode]; + } + // F-key + if (event.keyCode >= keyCodes.f1 && event.keyCode <= keyCodes.f12) { + return "f" + (1 + event.keyCode - keyCodes.f1); + } + return ""; + } + var keyIdentifier = event.keyIdentifier; + // On Windows, the keyIdentifiers for non-letter keys are incorrect. See + // https://bugs.webkit.org/show_bug.cgi?id=19906 for more details. + if ((platform == "Windows" || platform == "Linux") && keyIdentifierCorrectionMap[keyIdentifier]) { + correctedIdentifiers = keyIdentifierCorrectionMap[keyIdentifier]; + keyIdentifier = event.shiftKey ? correctedIdentifiers[1] : correctedIdentifiers[0]; + } + var unicodeKeyInHex = "0x" + keyIdentifier.substring(2); + var character = String.fromCharCode(parseInt(unicodeKeyInHex)).toLowerCase(); + return event.shiftKey ? character.toUpperCase() : character; +} + +function isPrimaryModifierKey(event) { + if (platform == "Mac") + return event.metaKey; + else + return event.ctrlKey; +} + +function isEscape(event) { + return event.keyCode == keyCodes.ESC || + (event.ctrlKey && getKeyChar(event) == '['); // c-[ is mapped to ESC in Vim by default. +} |
