From b91884bc54f9f9d22e5d7156af22cc76dc47253e Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Wed, 1 Apr 2026 19:19:40 +0700 Subject: [PATCH] fix(desktop): enable default context menu for copy/paste across the app --- packages/desktop/src/main.ts | 2 ++ packages/desktop/src/window/window-manager.ts | 14 +++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/desktop/src/main.ts b/packages/desktop/src/main.ts index e2dce43f4..6a38ad1e1 100644 --- a/packages/desktop/src/main.ts +++ b/packages/desktop/src/main.ts @@ -17,6 +17,7 @@ import { getWindowBackgroundColor, resolveSystemWindowTheme, setupWindowResizeEvents, + setupDefaultContextMenu, setupDragDropPrevention, } from "./window/window-manager.js"; import { registerDialogHandlers } from "./features/dialogs.js"; @@ -108,6 +109,7 @@ async function createMainWindow(): Promise { }); setupWindowResizeEvents(mainWindow); + setupDefaultContextMenu(mainWindow); setupDragDropPrevention(mainWindow); mainWindow.once("ready-to-show", () => { mainWindow.show(); diff --git a/packages/desktop/src/window/window-manager.ts b/packages/desktop/src/window/window-manager.ts index ec02e8968..583e9a24d 100644 --- a/packages/desktop/src/window/window-manager.ts +++ b/packages/desktop/src/window/window-manager.ts @@ -1,4 +1,4 @@ -import { app, BrowserWindow, ipcMain, nativeTheme } from "electron"; +import { app, BrowserWindow, Menu, ipcMain, nativeTheme } from "electron"; export function readBadgeCount(input: unknown): number { if (typeof input !== "number" || !Number.isSafeInteger(input) || input < 0) { @@ -217,6 +217,18 @@ export function setupWindowResizeEvents(win: BrowserWindow): void { }); } +export function setupDefaultContextMenu(win: BrowserWindow): void { + win.webContents.on("context-menu", (_event, params) => { + const menu = Menu.buildFromTemplate([ + { role: "copy", enabled: params.selectionText.length > 0 }, + { role: "paste" }, + { type: "separator" }, + { role: "selectAll" }, + ]); + menu.popup({ window: win }); + }); +} + /** * Prevent Electron from navigating to files dragged onto the window. * The renderer handles drag-drop via standard HTML5 APIs instead.