From b2e29a22474b725e5e0f5679dcb5a6296bb8dc2d Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Sun, 9 Aug 2026 18:14:39 -0700 Subject: [PATCH] Fix Ctrl+Z in Windows and Linux terminals (#13398) * fix(terminal): preserve Windows undo chords * fix(terminal): keep undo menu hints unregistered --- src/main/menu/register-app-menu.test.ts | 20 ++++++++++++++++++++ src/main/menu/register-app-menu.ts | 8 ++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/main/menu/register-app-menu.test.ts b/src/main/menu/register-app-menu.test.ts index 82d1bc184de..08b5a489a9c 100644 --- a/src/main/menu/register-app-menu.test.ts +++ b/src/main/menu/register-app-menu.test.ts @@ -259,6 +259,26 @@ describe('registerAppMenu', () => { } ) + it.each(['darwin', 'linux', 'win32'] as const)( + 'preserves terminal undo and redo chords on %s', + (platform) => { + vi.spyOn(process, 'platform', 'get').mockReturnValue(platform) + registerAppMenu(buildMenuOptions()) + + const editSubmenu = getSubmenu(getTemplate(), 'Edit') + const expectedRegistration = platform === 'darwin' ? undefined : false + const undoItem = editSubmenu.find((item) => item.role === 'undo') + const redoItem = editSubmenu.find((item) => item.role === 'redo') + + expect(undoItem?.accelerator).toBeUndefined() + expect(redoItem?.accelerator).toBeUndefined() + expect(undoItem && 'registerAccelerator' in undoItem).toBe(platform !== 'darwin') + expect(redoItem && 'registerAccelerator' in redoItem).toBe(platform !== 'darwin') + expect(undoItem?.registerAccelerator).toBe(expectedRegistration) + expect(redoItem?.registerAccelerator).toBe(expectedRegistration) + } + ) + it('keeps selection actions native in a focused guest webview', () => { const send = vi.fn() const guestContents = { copy: vi.fn(), selectAll: vi.fn() } diff --git a/src/main/menu/register-app-menu.ts b/src/main/menu/register-app-menu.ts index 2feeef9fe47..cc99c69cbc7 100644 --- a/src/main/menu/register-app-menu.ts +++ b/src/main/menu/register-app-menu.ts @@ -167,11 +167,15 @@ function buildAndApplyMenu(options: RegisterAppMenuOptions): void { ] } + // Why: keep native menu hints while letting non-macOS Ctrl+Z/Ctrl+Y reach the focused terminal or DOM control. + const undoRedoOptions: Electron.MenuItemConstructorOptions = isMac + ? {} + : { registerAccelerator: false } const editMenu: Electron.MenuItemConstructorOptions = { label: translateMain('menu.edit', 'Edit'), submenu: [ - { role: 'undo' }, - { role: 'redo' }, + { role: 'undo', ...undoRedoOptions }, + { role: 'redo', ...undoRedoOptions }, { type: 'separator' }, { role: 'cut' }, createAppMenuSelectionItem({