macOS: Fix undo redo not working on macOS.

The default API provided by Electron doesn't work
as expected. More info here -
https://github.com/electron/electron/issues/15728

Fixes: #866.
This commit is contained in:
Akash Nimare
2020-03-10 00:32:05 +05:30
committed by GitHub
parent 7ac35cc087
commit 01f6e77237
2 changed files with 30 additions and 9 deletions

View File

@@ -372,10 +372,20 @@ function getDarwinTpl(props: any): Electron.MenuItemConstructorOptions[] {
label: t.__('Edit'), label: t.__('Edit'),
submenu: [{ submenu: [{
label: t.__('Undo'), label: t.__('Undo'),
role: 'undo' accelerator: 'Cmd+Z',
click(_item: any, focusedWindow: any) {
if (focusedWindow) {
sendAction('undo');
}
}
}, { }, {
label: t.__('Redo'), label: t.__('Redo'),
role: 'redo' accelerator: 'Cmd+Shift+Z',
click(_item: any, focusedWindow: any) {
if (focusedWindow) {
sendAction('redo');
}
}
}, { }, {
type: 'separator' type: 'separator'
}, { }, {

View File

@@ -711,10 +711,8 @@ class ServerManagerView {
} }
updateGeneralSettings(setting: string, value: any): void { updateGeneralSettings(setting: string, value: any): void {
const selector = 'webview:not([class*=disabled])'; if (this.getActiveWebview()) {
const webview: Electron.WebviewTag = document.querySelector(selector); const webContents = this.getActiveWebview().getWebContents();
if (webview) {
const webContents = webview.getWebContents();
webContents.send(setting, value); webContents.send(setting, value);
} }
} }
@@ -738,6 +736,12 @@ class ServerManagerView {
return !(url.endsWith('/login/') || this.tabs[tabIndex].webview.loading); return !(url.endsWith('/login/') || this.tabs[tabIndex].webview.loading);
} }
getActiveWebview(): Electron.WebviewTag {
const selector = 'webview:not(.disabled)';
const webview: Electron.WebviewTag = document.querySelector(selector);
return webview;
}
addContextMenu($serverImg: HTMLImageElement, index: number): void { addContextMenu($serverImg: HTMLImageElement, index: number): void {
$serverImg.addEventListener('contextmenu', e => { $serverImg.addEventListener('contextmenu', e => {
e.preventDefault(); e.preventDefault();
@@ -909,9 +913,7 @@ class ServerManagerView {
ipcRenderer.on('toggle-dnd', (event: Event, state: boolean, newSettings: SettingsOptions) => { ipcRenderer.on('toggle-dnd', (event: Event, state: boolean, newSettings: SettingsOptions) => {
this.toggleDNDButton(state); this.toggleDNDButton(state);
ipcRenderer.send('forward-message', 'toggle-silent', newSettings.silent); ipcRenderer.send('forward-message', 'toggle-silent', newSettings.silent);
const selector = 'webview:not([class*=disabled])'; const webContents = this.getActiveWebview().getWebContents();
const webview: Electron.WebviewTag = document.querySelector(selector);
const webContents = webview.getWebContents();
webContents.send('toggle-dnd', state, newSettings); webContents.send('toggle-dnd', state, newSettings);
}); });
@@ -1016,6 +1018,15 @@ class ServerManagerView {
this.openSettings('AddServer'); this.openSettings('AddServer');
}); });
// Redo and undo functionality since the default API doesn't work on macOS
ipcRenderer.on('undo', () => {
return this.getActiveWebview().undo();
});
ipcRenderer.on('redo', () => {
return this.getActiveWebview().redo();
});
ipcRenderer.on('set-active', () => { ipcRenderer.on('set-active', () => {
const webviews: NodeListOf<Electron.WebviewTag> = document.querySelectorAll('webview'); const webviews: NodeListOf<Electron.WebviewTag> = document.querySelectorAll('webview');
webviews.forEach(webview => { webviews.forEach(webview => {