diff --git a/internal_packages/preferences/lib/tabs/preferences-keymaps.jsx b/internal_packages/preferences/lib/tabs/preferences-keymaps.jsx index 33e1aacc6..892dca05b 100644 --- a/internal_packages/preferences/lib/tabs/preferences-keymaps.jsx +++ b/internal_packages/preferences/lib/tabs/preferences-keymaps.jsx @@ -196,8 +196,11 @@ class PreferencesKeymaps extends React.Component { _renderKeystrokes = (keystrokes, idx) => { const elements = []; const splitKeystrokes = keystrokes.split(' '); - splitKeystrokes.forEach((keystroke) => { + splitKeystrokes.forEach((keystroke, kidx) => { elements.push({this._formatKeystrokes(keystroke)}); + if (kidx < splitKeystrokes.length - 1) { + elements.push( then ); + } }); return ( {elements} diff --git a/internal_packages/preferences/stylesheets/preferences.less b/internal_packages/preferences/stylesheets/preferences.less index 71db78837..9136c3d9b 100644 --- a/internal_packages/preferences/stylesheets/preferences.less +++ b/internal_packages/preferences/stylesheets/preferences.less @@ -173,6 +173,11 @@ font-family: monospace; font-weight: 600; color: @text-color; + + .then { + font-size:0.9em; + color: @text-color-very-subtle; + } &:after { content: ", " } diff --git a/keymaps/base.json b/keymaps/base.json index ca9c75ba7..71767362e 100644 --- a/keymaps/base.json +++ b/keymaps/base.json @@ -22,7 +22,7 @@ "core:print-thread": "mod+p", "core:focus-item": "enter", - "core:remove-from-view": "backspace", + "core:remove-from-view": ["backspace", "delete"], "core:pop-sheet": "escape", "core:messages-page-up": "pageup", @@ -54,9 +54,9 @@ "contenteditable:quote": "mod+(", "contenteditable:outdent": "mod+[", "contenteditable:indent": "mod+]", - "contenteditable:align-left": "mod+L", - "contenteditable:align-center": "mod+E", - "contenteditable:align-right": "mod+R", + "contenteditable:align-left": "mod+shift+l", + "contenteditable:align-center": "mod+shift+e", + "contenteditable:align-right": "mod+shift+r", "contenteditable:set-left-to-right": "mod+.", "contenteditable:remove-formatting": "mod+\\", "contenteditable:previous-font": "mod+%", diff --git a/keymaps/templates/Gmail.json b/keymaps/templates/Gmail.json index ad32c6b8b..ee3482037 100644 --- a/keymaps/templates/Gmail.json +++ b/keymaps/templates/Gmail.json @@ -30,13 +30,13 @@ "message-list:expand-all": ";", "message-list:collapse-all": ":", - "application:new-message": "mod+n", + "application:new-message": ["c", "d", "mod+n"], "application:more-actions": ".", "application:open-help": "?", "core:mute-conversation": "m", "core:focus-search": "/", - "core:change-category": "v", + "core:change-category": ["l", "v"], "core:focus-toolbar": ",", "core:star-item": "s", "core:gmail-remove-from-view": "y", @@ -44,17 +44,18 @@ "core:report-as-spam": "!", "core:delete-item": "#", - "core:reply": "mod+r", + "core:reply": ["r", "mod+r"], "core:reply-new-window": "shift+r", - "core:reply-all": "mod+shift+r", + "core:reply-all": ["a", "mod+shift+r"], "core:reply-all-new-window": "shift+a", - "core:forward": "mod+shift+f", + "core:forward": ["f", "mod+shift+f"], "core:forward-new-window": "shift+f", - "core:remove-and-previous": "}", - "core:remove-and-next": "{", + + "core:remove-and-previous": ["}", "]"], + "core:remove-and-next": ["{", "["], "core:mark-as-read": "shift+i", - "core:mark-as-unread": "_", - "core:mark-important": "=", + "core:mark-as-unread": ["shift+u", "_"], + "core:mark-important": ["+", "="], "core:mark-unimportant": "-" } diff --git a/keymaps/templates/Inbox by Gmail.json b/keymaps/templates/Inbox by Gmail.json index d755e48a2..f2a6d4322 100644 --- a/keymaps/templates/Inbox by Gmail.json +++ b/keymaps/templates/Inbox by Gmail.json @@ -1,5 +1,5 @@ { - "application:new-message": "mod+n", + "application:new-message": ["c", "mod+n"], "navigation:go-to-inbox": "i", "multiselect-list:select-all": "shift+x", @@ -21,14 +21,16 @@ "core:gmail-remove-from-view": "y", "core:archive-item": "e", "core:report-as-spam": "!", - "core:delete-item": "//", - "core:reply": "mod+r", + "core:delete-item": "#", + + "core:reply": ["r", "mod+r"], "core:reply-new-window": "shift+r", - "core:reply-all": "mod+shift+r", + "core:reply-all": ["a", "mod+shift+r"], "core:reply-all-new-window": "shift+a", - "core:forward": "mod+shift+f", + "core:forward": ["f", "mod+shift+f"], "core:forward-new-window": "shift+f", - "core:remove-and-previous": "}", - "core:remove-and-next": "{", + + "core:remove-and-previous": ["}", "]"], + "core:remove-and-next": ["{", "["], "core:undo": "z" } diff --git a/keymaps/templates/Outlook.json b/keymaps/templates/Outlook.json index bfb21487b..4fdfb2c04 100644 --- a/keymaps/templates/Outlook.json +++ b/keymaps/templates/Outlook.json @@ -1,13 +1,13 @@ { "core:change-category": "mod+shift+v", - "core:focus-search": "mod+e", + "core:focus-search": ["f3", "mod+e"], "core:forward": "mod+f", "core:delete-item": "mod+d", "core:undo": "alt+backspace", "composer:send-message": "alt+s", "core:reply": "mod+r", "core:reply-all": "mod+shift+r", - "application:new-message": "mod+shift+m", + "application:new-message": ["mod+n", "mod+shift+m"], "send": "mod+enter", "core:find-in-thread": "f4", "core:find-in-thread-next": "shift+f4", diff --git a/src/components/evented-iframe.cjsx b/src/components/evented-iframe.cjsx index 27ac65740..a5a908f46 100644 --- a/src/components/evented-iframe.cjsx +++ b/src/components/evented-iframe.cjsx @@ -80,7 +80,9 @@ class EventedIFrame extends React.Component doc = node.contentDocument return unless doc doc.removeEventListener('click', @_onIFrameClick) - doc.removeEventListener('keydown', @_onIFrameKeydown) + doc.removeEventListener('keydown', @_onIFrameKeyEvent) + doc.removeEventListener('keypress', @_onIFrameKeyEvent) + doc.removeEventListener('keyup', @_onIFrameKeyEvent) doc.removeEventListener('mousedown', @_onIFrameMouseEvent) doc.removeEventListener('mousemove', @_onIFrameMouseEvent) doc.removeEventListener('mouseup', @_onIFrameMouseEvent) @@ -95,7 +97,9 @@ class EventedIFrame extends React.Component doc = node.contentDocument _.defer => doc.addEventListener("click", @_onIFrameClick) - doc.addEventListener("keydown", @_onIFrameKeydown) + doc.addEventListener("keydown", @_onIFrameKeyEvent) + doc.addEventListener("keypress", @_onIFrameKeyEvent) + doc.addEventListener("keyup", @_onIFrameKeyEvent) doc.addEventListener("mousedown", @_onIFrameMouseEvent) doc.addEventListener("mousemove", @_onIFrameMouseEvent) doc.addEventListener("mouseup", @_onIFrameMouseEvent) @@ -182,9 +186,16 @@ class EventedIFrame extends React.Component pageY: event.pageY + nodeRect.top }))) - _onIFrameKeydown: (event) => + _onIFrameKeyEvent: (event) => return if event.metaKey or event.altKey or event.ctrlKey - ReactDOM.findDOMNode(@).dispatchEvent(new KeyboardEvent(event.type, event)) + + attrs = ['key', 'code','location', 'ctrlKey', 'shiftKey', 'altKey', 'metaKey', 'repeat', 'isComposing', 'charCode', 'keyCode', 'which'] + eventInit = Object.assign({bubbles: true}, _.pick(event, attrs)) + eventInParentDoc = new KeyboardEvent(event.type, eventInit) + + Object.defineProperty(eventInParentDoc, 'which', {value: event.which}) + + ReactDOM.findDOMNode(@).dispatchEvent(eventInParentDoc) _onIFrameContextualMenu: (event) => # Build a standard-looking contextual menu with options like "Copy Link", diff --git a/src/keymap-manager.coffee b/src/keymap-manager.coffee index f126ecd33..d1406a42a 100644 --- a/src/keymap-manager.coffee +++ b/src/keymap-manager.coffee @@ -93,7 +93,7 @@ class KeymapManager forEachInKeymaps: (keymaps, cb) => Object.keys(keymaps).forEach (command) => keystrokesArray = keymaps[command] - keystrokesArray = [keystrokesArray] unless keystrokes instanceof Array + keystrokesArray = [keystrokesArray] unless keystrokesArray instanceof Array for keystrokes in keystrokesArray cb(command, keystrokes)