From 3d9fec7f8cf02e30cba71969b49bcde0d8550278 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Mon, 19 Oct 2026 13:22:28 -0700 Subject: [PATCH] =?UTF-8?q?fix(desktop):=20close=20the=20window=20with=20?= =?UTF-8?q?=E2=87=A7=E2=8C=98W=20so=20=E2=8C=98W=20never=20closes=20it=20(?= =?UTF-8?q?#57150)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/app/src/shell/commands/desktop-menu.ts | 8 +++++++- packages/app/src/shell/titlebar/windows-menu.test.ts | 7 +++++++ packages/desktop/src/main/native/menu.ts | 7 ++++++- 3 files changed, 20 insertions(+), 2 deletions(-) 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,