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:
parent
95f52e20e1
commit
2af575c3c0
31 changed files with 441 additions and 1068 deletions
|
|
@ -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_;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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']
|
||||
}
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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']
|
||||
}
|
||||
]
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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']
|
||||
}
|
||||
]
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue