From 083ed4dc8282de961e1733e1d98a792d79befc5f Mon Sep 17 00:00:00 2001 From: Phil Crosby Date: Sat, 5 May 2012 20:15:27 -0700 Subject: 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. --- lib/keyboard_utils.js | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 lib/keyboard_utils.js (limited to 'lib/keyboard_utils.js') 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. +} -- cgit v1.2.3