diff --git a/dev/External/SquireUI.js b/dev/External/SquireUI.js
index 909ff3ddb..b24327422 100644
--- a/dev/External/SquireUI.js
+++ b/dev/External/SquireUI.js
@@ -9,7 +9,7 @@ const
i18n = (str, def) => rl.i18n(str) || def,
- ctrlKey = shortcuts.getMetaKey().replace('meta','⌘') + ' + ',
+ ctrlKey = shortcuts.getMetaKey() + ' + ',
tpl = doc.createElement('template'),
clr = doc.createElement('input'),
diff --git a/dev/View/Popup/Compose.js b/dev/View/Popup/Compose.js
index 3ca57a8aa..e3fb1ff7e 100644
--- a/dev/View/Popup/Compose.js
+++ b/dev/View/Popup/Compose.js
@@ -1213,8 +1213,8 @@ class ComposePopupView extends AbstractViewPopup {
shortcuts.add('q', 'meta', Scope.Compose, ()=>false);
shortcuts.add('w', 'meta', Scope.Compose, ()=>false);
- shortcuts.add('m,contextmenu', '', Scope.Compose, e => this.popupMenu(e));
- shortcuts.add('m', 'ctrl', Scope.Compose, e => this.popupMenu(e));
+ shortcuts.add('contextmenu', '', Scope.Compose, e => this.popupMenu(e));
+ shortcuts.add('m', 'meta', Scope.Compose, e => this.popupMenu(e));
shortcuts.add('escape,close', '', Scope.Compose, () => {
this.skipCommand();
@@ -1229,7 +1229,7 @@ class ComposePopupView extends AbstractViewPopup {
this.saveCommand();
return false;
});
- shortcuts.add('save', Scope.Compose, () => {
+ shortcuts.add('save', '', Scope.Compose, () => {
this.saveCommand();
return false;
});
diff --git a/dev/View/Popup/KeyboardShortcutsHelp.js b/dev/View/Popup/KeyboardShortcutsHelp.js
index 26765d4c4..644b5c1b7 100644
--- a/dev/View/Popup/KeyboardShortcutsHelp.js
+++ b/dev/View/Popup/KeyboardShortcutsHelp.js
@@ -2,9 +2,10 @@ import { Scope } from 'Common/Enums';
import { AbstractViewPopup } from 'Knoin/AbstractViews';
-class KeyboardShortcutsHelpPopupView extends AbstractViewPopup {
+export class KeyboardShortcutsHelpPopupView extends AbstractViewPopup {
constructor() {
super('KeyboardShortcutsHelp');
+ this.metaKey = shortcuts.getMetaKey();
}
onBuild(dom) {
@@ -49,5 +50,3 @@ class KeyboardShortcutsHelpPopupView extends AbstractViewPopup {
);
}
}
-
-export { KeyboardShortcutsHelpPopupView, KeyboardShortcutsHelpPopupView as default };
diff --git a/dev/View/Popup/Plugin.js b/dev/View/Popup/Plugin.js
index 2734f9b48..d2f27688b 100644
--- a/dev/View/Popup/Plugin.js
+++ b/dev/View/Popup/Plugin.js
@@ -99,9 +99,8 @@ class PluginPopupView extends AbstractViewPopup {
shortcuts.add('escape', '', Scope.All, () => {
if (this.modalVisibility()) {
this.tryToClosePopup();
+ return false;
}
-
- return false;
});
}
}
diff --git a/dev/bootstrap.js b/dev/bootstrap.js
index 46686092b..234a1b8f3 100644
--- a/dev/bootstrap.js
+++ b/dev/bootstrap.js
@@ -5,27 +5,6 @@ import { root } from 'Common/Links';
export default App => {
- addEventListener('keydown', event => {
- event = event || window.event;
- if (event && event.ctrlKey && !event.shiftKey && !event.altKey) {
- if ('S' == event.key) {
- event.preventDefault();
- } else if ('A' == event.key) {
- const sender = event.target;
- if (
- sender &&
- ('true' === '' + sender.contentEditable || (sender.matches && sender.matches('INPUT,TEXTAREA')))
- ) {
- return;
- }
-
- getSelection().removeAllRanges();
-
- event.preventDefault();
- }
- }
- });
-
addEventListener('click', ()=>rl.Dropdowns.detectVisibility());
rl.app = App;
diff --git a/dev/shortcuts.js b/dev/shortcuts.js
index 02ab1c3e4..c11b1ceda 100644
--- a/dev/shortcuts.js
+++ b/dev/shortcuts.js
@@ -1,20 +1,63 @@
(win => {
+let
+ scope = {},
+ _scope = 'all';
+
const
doc = document,
+ // On Mac we use ⌘ else the Ctrl key
meta = /Mac OS X/.test(navigator.userAgent) ? 'meta' : 'ctrl',
_scopes = {
all: {}
},
toArray = v => Array.isArray(v) ? v : v.split(/\s*,\s*/),
+ // ignore keydown in any element that supports keyboard input
+ filter = node => !(!node.closest || node.closest('input,select,textarea,[contenteditable]')),
+
+ shortcuts = {
+ on: () => doc.addEventListener('keydown', keydown),
+ off: () => doc.removeEventListener('keydown', keydown),
+ add: (keys, modifiers, scopes, method) => {
+ if (method === undefined) {
+ method = scopes;
+ scopes = 'all';
+ }
+ toArray(scopes).forEach(scope => {
+ if (!_scopes[scope]) {
+ _scopes[scope] = {};
+ }
+ toArray(keys).forEach(key => {
+ key = key.toLowerCase();
+ if (!_scopes[scope][key]) {
+ _scopes[scope][key] = {};
+ }
+ modifiers = toArray(modifiers)
+ .map(key => 'meta' == key ? meta : key)
+ .unique().sort().join('+');
+ if (!_scopes[scope][key][modifiers]) {
+ _scopes[scope][key][modifiers] = [];
+ }
+ _scopes[scope][key][modifiers].push(method);
+ });
+ });
+ },
+ setScope: value => {
+ _scope = value || 'all';
+ scope = _scopes[_scope] || {};
+ },
+ getScope: () => _scope,
+ getMetaKey: () => 'meta' === meta ? '⌘' : 'Ctrl'
+ },
+
keydown = event => {
let key = (event.key || '').toLowerCase().replace(' ','space'),
scopes = [];
scope[key] && scopes.push(scope[key]);
_scope !== 'all' && _scopes.all[key] && scopes.push(_scopes.all[key]);
- if (scopes.length && win.shortcuts.filter(event.target)) {
+ if (scopes.length && filter(event.target)) {
let modifiers = ['alt','ctrl','meta','shift'].filter(v => event[v+'Key']).join('+');
scopes.forEach(actions => {
// for each potential shortcut
@@ -33,47 +76,8 @@ const
}
};
-let
- scope = {},
- _scope = 'all';
+win.shortcuts = shortcuts;
-win.shortcuts = {
- on: () => doc.addEventListener('keydown', keydown),
- off: () => doc.removeEventListener('keydown', keydown),
- add: (keys, modifiers, scopes, method) => {
- if (method === undefined) {
- method = scopes;
- scopes = 'all';
- }
- toArray(scopes).forEach(scope => {
- if (!_scopes[scope]) {
- _scopes[scope] = {};
- }
- toArray(keys).forEach(key => {
- key = key.toLowerCase();
- if (!_scopes[scope][key]) {
- _scopes[scope][key] = {};
- }
- modifiers = toArray(modifiers)
- .map(key => 'meta' == key ? meta : key)
- .unique().sort().join('+');
- if (!_scopes[scope][key][modifiers]) {
- _scopes[scope][key][modifiers] = [];
- }
- _scopes[scope][key][modifiers].push(method);
- });
- });
- },
- setScope: value => {
- _scope = value || 'all';
- scope = _scopes[_scope] || {};
- },
- getScope: () => _scope,
- getMetaKey: () => meta,
- // ignore keydown in any element that supports keyboard input
- filter: node => !(!node.closest || node.closest('input,select,textarea,[contenteditable]'))
-};
-
-win.shortcuts.on();
+shortcuts.on();
})(this);
diff --git a/snappymail/v/0.0.0/app/templates/Views/Common/PopupsKeyboardShortcutsHelp.html b/snappymail/v/0.0.0/app/templates/Views/Common/PopupsKeyboardShortcutsHelp.html
index f607b8dd6..92ffee0cd 100644
--- a/snappymail/v/0.0.0/app/templates/Views/Common/PopupsKeyboardShortcutsHelp.html
+++ b/snappymail/v/0.0.0/app/templates/Views/Common/PopupsKeyboardShortcutsHelp.html
@@ -37,7 +37,7 @@
- | ☑ | | Ctrl + A, ⌘ + A |
+ | ☑ | | + A |
| | Z |
| 🗑 | | Delete, Shift + Delete |
| | T |
@@ -60,7 +60,7 @@
| Enter, Open |
| B |
- | Ctrl + P, ⌘ + P |
+ | + P |
| Esc, Close |
| Esc, Close |
| Shift + Tab, Esc |
@@ -73,9 +73,9 @@
| W, C, New |
- | M, Menu, Ctrl + M, ⌘ + M |
- | Ctrl + S, ⌘ + S, Save |
- | Send, Ctrl + Enter, ⌘ + Enter |
+ | Menu, + M |
+ | + S, Save |
+ | Send, + Enter |
| Esc, Close |
| Shift + Esc, Shift + Close |