aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Blott2016-10-09 16:31:23 +0100
committerStephen Blott2016-10-09 16:31:23 +0100
commit9c1012ad3a731b015b8a70b58828fbcd0acb7db0 (patch)
treeedb48cc06710408e082f59619779080051640b46
parent6596e30392a1ca053223825eda5cde060394a4aa (diff)
downloadvimium-9c1012ad3a731b015b8a70b58828fbcd0acb7db0.tar.bz2
Extend key translation to include Escape.
Here, these map to escape: translate x <c-[> translate <c-c> <c-[>
-rw-r--r--content_scripts/mode_key_handler.coffee6
-rw-r--r--lib/keyboard_utils.coffee35
-rw-r--r--lib/utils.coffee7
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 =