diff --git a/packages/app/src/shell/commands/desktop-menu.ts b/packages/app/src/shell/commands/desktop-menu.ts index b101c65b0e6..ec74740b2f7 100644 --- a/packages/app/src/shell/commands/desktop-menu.ts +++ b/packages/app/src/shell/commands/desktop-menu.ts @@ -120,7 +120,13 @@ export const DESKTOP_MENU: DesktopMenu[] = [ accelerator: { macos: "Cmd+Shift+N", windows: "Ctrl+Shift+N" }, }, { type: "separator" }, - { type: "item", labelKey: "desktop.menu.closeWindow", action: "window.close", role: "close" }, + { + type: "item", + labelKey: "desktop.menu.closeWindow", + action: "window.close", + role: "close", + accelerator: { macos: "Shift+Cmd+W", windows: "Ctrl+Shift+W" }, + }, ], }, { diff --git a/packages/app/src/shell/titlebar/windows-menu.test.ts b/packages/app/src/shell/titlebar/windows-menu.test.ts index c5552fad8e9..e9bfb6aa637 100644 --- a/packages/app/src/shell/titlebar/windows-menu.test.ts +++ b/packages/app/src/shell/titlebar/windows-menu.test.ts @@ -8,6 +8,13 @@ test("resolves the new window accelerator only with its modifiers", () => { expect(windowsMenuAccelerator(new KeyboardEvent("keydown", { key: "N" }))).toBeUndefined() }) +test("resolves Ctrl+Shift+W to close the window and leaves Ctrl+W to tabs", () => { + expect(windowsMenuAccelerator(new KeyboardEvent("keydown", { key: "W", ctrlKey: true, shiftKey: true }))).toBe( + "window.close", + ) + expect(windowsMenuAccelerator(new KeyboardEvent("keydown", { key: "w", ctrlKey: true }))).toBeUndefined() +}) + test.each(["v", "c", "x", "a", "A", "z", "y"])("leaves Ctrl+%s to the focused editor", (key) => { expect(windowsMenuAccelerator(new KeyboardEvent("keydown", { key, ctrlKey: true }))).toBeUndefined() }) diff --git a/packages/desktop/src/main/native/menu.ts b/packages/desktop/src/main/native/menu.ts index 9eabd930a6b..075580da11a 100644 --- a/packages/desktop/src/main/native/menu.ts +++ b/packages/desktop/src/main/native/menu.ts @@ -109,7 +109,12 @@ function nativeMenu(menu: DesktopMenu, extra: readonly MenubarEntry[], deps: Dep function nativeItem(entry: DesktopMenuEntry, deps: Deps): MenuItemConstructorOptions { if (entry.type === "separator") return { type: "separator" } - if (entry.role) return { role: nativeRole(entry.role), label: entry.labelKey ? nativeT(entry.labelKey) : undefined } + if (entry.role) + return { + role: nativeRole(entry.role), + label: entry.labelKey ? nativeT(entry.labelKey) : undefined, + accelerator: entry.accelerator?.macos, + } const item: MenuItemConstructorOptions = { label: entry.labelKey ? nativeT(entry.labelKey) : undefined,