diff options
| -rw-r--r-- | content_scripts/mode_key_handler.coffee | 6 | ||||
| -rw-r--r-- | lib/keyboard_utils.coffee | 35 | ||||
| -rw-r--r-- | lib/utils.coffee | 7 |
3 files changed, 31 insertions, 17 deletions
diff --git a/content_scripts/mode_key_handler.coffee b/content_scripts/mode_key_handler.coffee index 7904d801..9f8206fb 100644 --- a/content_scripts/mode_key_handler.coffee +++ b/content_scripts/mode_key_handler.coffee @@ -34,11 +34,7 @@ class KeyHandlerMode extends Mode blur: (event) => @alwaysContinueBubbling => @keydownEvents = {} if event.target == window @keyTranslationRegistry = {} - chrome.storage.local.get "keyTranslationRegistry", (obj) => - @keyTranslationRegistry = obj.keyTranslationRegistry - chrome.storage.onChanged.addListener (changes, area) => - if area == "local" and changes.keyTranslationRegistry?.newValue? - @keyTranslationRegistry = changes.keyTranslationRegistry.newValue + Utils.monitorChromeStorage "keyTranslationRegistry", (value) => @keyTranslationRegistry = value onKeydown: (event) -> keyChar = KeyboardUtils.getKeyCharString event diff --git a/lib/keyboard_utils.coffee b/lib/keyboard_utils.coffee index f0e791d4..7f48d69e 100644 --- a/lib/keyboard_utils.coffee +++ b/lib/keyboard_utils.coffee @@ -79,10 +79,18 @@ KeyboardUtils = isPrimaryModifierKey: (event) -> if (@platform == "Mac") then event.metaKey else event.ctrlKey - isEscape: (event) -> - # c-[ is mapped to ESC in Vim by default. - (event.keyCode == @keyCodes.ESC) || - (event.ctrlKey && @getKeyChar(event) == '[' and not event.metaKey and not event.altKey) + isEscape: do -> + keyTranslationRegistry = {} + # NOTE: "?" here for the tests. + Utils?.monitorChromeStorage "keyTranslationRegistry", (value) => keyTranslationRegistry = value + + (event) -> + event.keyCode == @keyCodes.ESC || do => + keyChar = @getKeyChar event + keyChar.length == 1 and do => + keyChar = @getModifiedKeyChar keyChar, event + keyChar = keyTranslationRegistry[keyChar] ? keyChar + keyChar == "<c-[>" # TODO. This is probably a poor way of detecting printable characters. However, it shouldn't incorrectly # identify any of chrome's own keyboard shortcuts as printable. @@ -108,16 +116,19 @@ KeyboardUtils = # 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 = [] + @getModifiedKeyChar keyChar, event + + getModifiedKeyChar: (keyChar, event) -> + modifiers = [] - keyChar = keyChar.toUpperCase() if event.shiftKey - # These must be in alphabetical order (to match the sorted modifier order in Commands.normalizeKey). - modifiers.push "a" if event.altKey - modifiers.push "c" if event.ctrlKey - modifiers.push "m" if event.metaKey + keyChar = keyChar.toUpperCase() if event.shiftKey + # These must be in alphabetical order (to match the sorted modifier order in Commands.normalizeKey). + modifiers.push "a" if event.altKey + modifiers.push "c" if event.ctrlKey + modifiers.push "m" if event.metaKey - keyChar = [modifiers..., keyChar].join "-" - if 1 < keyChar.length then "<#{keyChar}>" else keyChar + keyChar = [modifiers..., keyChar].join "-" + if 1 < keyChar.length then "<#{keyChar}>" else keyChar KeyboardUtils.init() diff --git a/lib/utils.coffee b/lib/utils.coffee index c06d8ac5..5a028186 100644 --- a/lib/utils.coffee +++ b/lib/utils.coffee @@ -209,6 +209,13 @@ Utils = makeIdempotent: (func) -> (args...) -> ([previousFunc, func] = [func, null])[0]? args... + monitorChromeStorage: (key, setter) -> + # NOTE: "?" here for the tests. + chrome?.storage.local.get key, (obj) => + setter obj[key] if obj[key]? + chrome.storage.onChanged.addListener (changes, area) => + setter changes[key].newValue if changes[key]?.newValue? + # Utility for parsing and using the custom search-engine configuration. We re-use the previous parse if the # search-engine configuration is unchanged. SearchEngines = |
