Multiple keymaps and mousetrap (#2412)

* WIP

* WIP

* Wip

* Wip

* wip

* Refactor without normalize and plugin

* Replace extendKeymaps by decorateKeymaps

* WIP

* Add mousetrap

* Add first command over rpc

* More commands

* Add all commands

* Begin to hook commands

* Working multiple keymaps

* Use redux action to trigger command

* Use forked version of Mousetrap to capture key events

* Fix lint

* Add command in redux action to debug purpose

* ExecCommand from menu click

* Remove unused files

* Fix xterm should ignore catched events

* Re-enable IntelliSense checking

* Remove unused runes dep
This commit is contained in:
CHaBou 2017-11-03 03:51:18 +01:00 committed by Guillermo Rauch
parent 95f52e20e1
commit 2af575c3c0
31 changed files with 441 additions and 1068 deletions

View file

@ -1,8 +1,8 @@
// Packages
const {app, dialog} = require('electron');
const {app, dialog, Menu} = require('electron');
// Utilities
const {getKeymaps, getConfig} = require('../config');
const {getConfig} = require('../config');
const {icon} = require('../config/paths');
const viewMenu = require('./menus/view');
const shellMenu = require('./menus/shell');
@ -11,13 +11,22 @@ const pluginsMenu = require('./menus/plugins');
const windowMenu = require('./menus/window');
const helpMenu = require('./menus/help');
const darwinMenu = require('./menus/darwin');
const {getDecoratedKeymaps} = require('../plugins');
const {execCommand} = require('../commands');
const appName = app.getName();
const appVersion = app.getVersion();
module.exports = (createWindow, updatePlugins, getLoadedPluginVersions) => {
let menu_ = [];
exports.createMenu = (createWindow, getLoadedPluginVersions) => {
const config = getConfig();
const {commands} = getKeymaps();
// We take only first shortcut in array for each command
const allCommandKeys = getDecoratedKeymaps();
const commandKeys = Object.keys(allCommandKeys).reduce((result, command) => {
result[command] = allCommandKeys[command][0];
return result;
}, {});
let updateChannel = 'stable';
@ -39,14 +48,19 @@ module.exports = (createWindow, updatePlugins, getLoadedPluginVersions) => {
});
};
const menu = [
...(process.platform === 'darwin' ? [darwinMenu(commands, showAbout)] : []),
shellMenu(commands, createWindow),
editMenu(commands),
viewMenu(commands),
pluginsMenu(commands, updatePlugins),
windowMenu(commands),
helpMenu(commands, showAbout)
...(process.platform === 'darwin' ? [darwinMenu(commandKeys, showAbout)] : []),
shellMenu(commandKeys, execCommand),
editMenu(commandKeys, execCommand),
viewMenu(commandKeys, execCommand),
pluginsMenu(commandKeys, execCommand),
windowMenu(commandKeys, execCommand),
helpMenu(commandKeys, showAbout)
];
return menu;
};
exports.buildMenu = template => {
menu_ = Menu.buildFromTemplate(template);
return menu_;
};

View file

@ -1,9 +1,8 @@
// This menu label is overrided by OSX to be the appName
// The label is set to appName here so it matches actual behavior
const {app} = require('electron');
const {openConfig} = require('../../config');
module.exports = (commands, showAbout) => {
module.exports = (commandKeys, showAbout) => {
return {
label: `${app.getName()}`,
submenu: [
@ -18,10 +17,7 @@ module.exports = (commands, showAbout) => {
},
{
label: 'Preferences...',
accelerator: commands['window:preferences'],
click() {
openConfig();
}
accelerator: commandKeys['window:preferences']
},
{
type: 'separator'

View file

@ -1,44 +1,41 @@
const {openConfig} = require('../../config');
module.exports = commands => {
module.exports = (commandKeys, execCommand) => {
const submenu = [
{
role: 'undo',
accelerator: commands['editor:undo']
accelerator: commandKeys['editor:undo']
},
{
role: 'redo',
accelerator: commands['editor:redo']
accelerator: commandKeys['editor:redo']
},
{
type: 'separator'
},
{
role: 'cut',
accelerator: commands['editor:cut']
accelerator: commandKeys['editor:cut']
},
{
role: 'copy',
accelerator: commands['editor:copy']
command: 'editor:copy',
accelerator: commandKeys['editor:copy']
},
{
role: 'paste',
accelerator: commands['editor:paste']
accelerator: commandKeys['editor:paste']
},
{
role: 'selectall',
accelerator: commands['editor:selectAll']
accelerator: commandKeys['editor:selectAll']
},
{
type: 'separator'
},
{
label: 'Clear Buffer',
accelerator: commands['editor:clearBuffer'],
accelerator: commandKeys['editor:clearBuffer'],
click(item, focusedWindow) {
if (focusedWindow) {
focusedWindow.rpc.emit('session clear req');
}
execCommand('editor:clearBuffer', focusedWindow);
}
}
];
@ -48,10 +45,7 @@ module.exports = commands => {
{type: 'separator'},
{
label: 'Preferences...',
accelerator: commands['window:preferences'],
click() {
openConfig();
}
accelerator: commandKeys['window:preferences']
}
);
}

View file

@ -1,4 +1,4 @@
module.exports = (commands, createWindow) => {
module.exports = (commandKeys, execCommand) => {
const isMac = process.platform === 'darwin';
return {
@ -6,20 +6,16 @@ module.exports = (commands, createWindow) => {
submenu: [
{
label: 'New Window',
accelerator: commands['window:new'],
click() {
createWindow();
accelerator: commandKeys['window:new'],
click(item, focusedWindow) {
execCommand('window:new', focusedWindow);
}
},
{
label: 'New Tab',
accelerator: commands['tab:new'],
accelerator: commandKeys['tab:new'],
click(item, focusedWindow) {
if (focusedWindow) {
focusedWindow.rpc.emit('termgroup add req');
} else {
createWindow();
}
execCommand('tab:new', focusedWindow);
}
},
{
@ -27,20 +23,16 @@ module.exports = (commands, createWindow) => {
},
{
label: 'Split Vertically',
accelerator: commands['pane:splitVertical'],
accelerator: commandKeys['pane:splitVertical'],
click(item, focusedWindow) {
if (focusedWindow) {
focusedWindow.rpc.emit('split request vertical');
}
execCommand('pane:splitVertical', focusedWindow);
}
},
{
label: 'Split Horizontally',
accelerator: commands['pane:splitHorizontal'],
accelerator: commandKeys['pane:splitHorizontal'],
click(item, focusedWindow) {
if (focusedWindow) {
focusedWindow.rpc.emit('split request horizontal');
}
execCommand('pane:splitHorizontal', focusedWindow);
}
},
{
@ -48,17 +40,15 @@ module.exports = (commands, createWindow) => {
},
{
label: 'Close Session',
accelerator: commands['pane:close'],
accelerator: commandKeys['pane:close'],
click(item, focusedWindow) {
if (focusedWindow) {
focusedWindow.rpc.emit('termgroup close req');
}
execCommand('pane:close', focusedWindow);
}
},
{
label: isMac ? 'Close Window' : 'Quit',
role: 'close',
accelerator: commands['window:close']
accelerator: commandKeys['window:close']
}
]
};

View file

@ -1,37 +1,26 @@
module.exports = commands => {
module.exports = (commandKeys, execCommand) => {
return {
label: 'View',
submenu: [
{
label: 'Reload',
accelerator: commands['window:reload'],
accelerator: commandKeys['window:reload'],
click(item, focusedWindow) {
if (focusedWindow) {
focusedWindow.rpc.emit('reload');
}
execCommand('window:reload', focusedWindow);
}
},
{
label: 'Full Reload',
accelerator: commands['window:reloadFull'],
accelerator: commandKeys['window:reloadFull'],
click(item, focusedWindow) {
if (focusedWindow) {
focusedWindow.reload();
}
execCommand('window:reloadFull', focusedWindow);
}
},
{
label: 'Developer Tools',
accelerator: commands['window:devtools'],
click(item, focusedWindow) {
if (focusedWindow) {
const webContents = focusedWindow.webContents;
if (webContents.isDevToolsOpened()) {
webContents.closeDevTools();
} else {
webContents.openDevTools({mode: 'detach'});
}
}
accelerator: commandKeys['window:devtools'],
click: (item, focusedWindow) => {
execCommand('window:reloadFull', focusedWindow);
}
},
{
@ -39,29 +28,23 @@ module.exports = commands => {
},
{
label: 'Reset Zoom Level',
accelerator: commands['zoom:reset'],
accelerator: commandKeys['zoom:reset'],
click(item, focusedWindow) {
if (focusedWindow) {
focusedWindow.rpc.emit('reset fontSize req');
}
execCommand('zoom:reset', focusedWindow);
}
},
{
label: 'Zoom In',
accelerator: commands['zoom:in'],
accelerator: commandKeys['zoom:in'],
click(item, focusedWindow) {
if (focusedWindow) {
focusedWindow.rpc.emit('increase fontSize req');
}
execCommand('zoom:in', focusedWindow);
}
},
{
label: 'Zoom Out',
accelerator: commands['zoom:out'],
accelerator: commandKeys['zoom:out'],
click(item, focusedWindow) {
if (focusedWindow) {
focusedWindow.rpc.emit('decrease fontSize req');
}
execCommand('zoom:out', focusedWindow);
}
}
]

View file

@ -1,18 +1,12 @@
module.exports = commands => {
module.exports = (commandKeys, execCommand) => {
// Generating tab:jump array
const tabJump = [];
for (let i = 1; i <= 9; i++) {
// 9 is a special number because it means 'last'
const label = i === 9 ? 'Last' : `${i}`;
const tabIndex = i === 9 ? 'last' : i - 1;
tabJump.push({
label: label,
accelerator: commands[`tab:jump:${label.toLowerCase()}`],
click(item, focusedWindow) {
if (focusedWindow) {
focusedWindow.rpc.emit('move jump req', tabIndex);
}
}
accelerator: commandKeys[`tab:jump:${label.toLowerCase()}`]
});
}
@ -21,7 +15,7 @@ module.exports = commands => {
submenu: [
{
role: 'minimize',
accelerator: commands['window:minimize']
accelerator: commandKeys['window:minimize']
},
{
type: 'separator'
@ -29,27 +23,23 @@ module.exports = commands => {
{
// It's the same thing as clicking the green traffc-light on macOS
role: 'zoom',
accelerator: commands['window:zoom']
accelerator: commandKeys['window:zoom']
},
{
label: 'Select Tab',
submenu: [
{
label: 'Previous',
accelerator: commands['tab:prev'],
click(item, focusedWindow) {
if (focusedWindow) {
focusedWindow.rpc.emit('move left req');
}
accelerator: commandKeys['tab:prev'],
click: (item, focusedWindow) => {
execCommand('tab:prev', focusedWindow);
}
},
{
label: 'Next',
accelerator: commands['tab:next'],
click(item, focusedWindow) {
if (focusedWindow) {
focusedWindow.rpc.emit('move right req');
}
accelerator: commandKeys['tab:next'],
click: (item, focusedWindow) => {
execCommand('tab:next', focusedWindow);
}
},
{
@ -66,20 +56,16 @@ module.exports = commands => {
submenu: [
{
label: 'Previous',
accelerator: commands['pane:prev'],
click(item, focusedWindow) {
if (focusedWindow) {
focusedWindow.rpc.emit('prev pane req');
}
accelerator: commandKeys['pane:prev'],
click: (item, focusedWindow) => {
execCommand('pane:prev', focusedWindow);
}
},
{
label: 'Next',
accelerator: commands['pane:next'],
click(item, focusedWindow) {
if (focusedWindow) {
focusedWindow.rpc.emit('next pane req');
}
accelerator: commandKeys['pane:next'],
click: (item, focusedWindow) => {
execCommand('pane:next', focusedWindow);
}
}
]
@ -92,7 +78,7 @@ module.exports = commands => {
},
{
role: 'togglefullscreen',
accelerators: commands['window:toggleFullScreen']
accelerators: commandKeys['window:toggleFullScreen']
}
]
};