From 258dc6d82f3d987a12d94b517a9ab4efa2c81406 Mon Sep 17 00:00:00 2001 From: Psypeal Gwai Date: Sun, 22 Feb 2026 05:36:18 -0800 Subject: [PATCH] fix: prevent Ctrl+R page reload and show platform-aware shortcuts (#58) Intercept Ctrl+R/Cmd+R in before-input-event to prevent Electron's default page reload. Replace hardcoded macOS shortcut symbols with platform-aware helpers that show Ctrl+ on Windows/Linux. --- src/main/index.ts | 11 +++++++++- .../components/dashboard/DashboardView.tsx | 3 ++- .../components/layout/SidebarHeader.tsx | 4 ++-- src/renderer/components/layout/TabBar.tsx | 5 +++-- .../components/layout/TabContextMenu.tsx | 8 ++++--- .../components/sidebar/SessionContextMenu.tsx | 3 ++- src/renderer/utils/stringUtils.ts | 21 +++++++++++++++++++ 7 files changed, 45 insertions(+), 10 deletions(-) diff --git a/src/main/index.ts b/src/main/index.ts index 6484e149..3b2dcdca 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -481,7 +481,16 @@ function createWindow(): void { const ZOOM_OUT_KEYS = new Set(['-', '_']); mainWindow.webContents.on('before-input-event', (event, input) => { if (!mainWindow || mainWindow.isDestroyed()) return; - if (!input.meta || input.type !== 'keyDown') return; + if (input.type !== 'keyDown') return; + + // Prevent Electron's default Ctrl+R / Cmd+R page reload so the renderer + // keyboard handler can use it as "Refresh Session" (fixes #58). + if ((input.control || input.meta) && input.key.toLowerCase() === 'r') { + event.preventDefault(); + return; + } + + if (!input.meta) return; const currentLevel = mainWindow.webContents.getZoomLevel(); diff --git a/src/renderer/components/dashboard/DashboardView.tsx b/src/renderer/components/dashboard/DashboardView.tsx index a85afb05..a427bb54 100644 --- a/src/renderer/components/dashboard/DashboardView.tsx +++ b/src/renderer/components/dashboard/DashboardView.tsx @@ -11,6 +11,7 @@ import React, { useEffect, useMemo, useState } from 'react'; import { api } from '@renderer/api'; import { useStore } from '@renderer/store'; +import { formatShortcut } from '@renderer/utils/stringUtils'; import { createLogger } from '@shared/utils/logger'; import { useShallow } from 'zustand/react/shallow'; @@ -75,7 +76,7 @@ const CommandSearch = ({ value, onChange }: Readonly): React diff --git a/src/renderer/components/layout/TabBar.tsx b/src/renderer/components/layout/TabBar.tsx index 6748a0a5..dfc458c8 100644 --- a/src/renderer/components/layout/TabBar.tsx +++ b/src/renderer/components/layout/TabBar.tsx @@ -14,6 +14,7 @@ import { horizontalListSortingStrategy, SortableContext } from '@dnd-kit/sortabl import { isElectronMode } from '@renderer/api'; import { HEADER_ROW1_HEIGHT } from '@renderer/constants/layout'; import { useStore } from '@renderer/store'; +import { formatShortcut } from '@renderer/utils/stringUtils'; import { Bell, PanelLeft, Plus, RefreshCw, Search, Settings } from 'lucide-react'; import { useShallow } from 'zustand/react/shallow'; @@ -330,7 +331,7 @@ export const TabBar = ({ paneId }: TabBarProps): React.JSX.Element => { onMouseEnter={() => setRefreshHover(true)} onMouseLeave={() => setRefreshHover(false)} onClick={handleRefresh} - title="Refresh Session (Cmd+R)" + title={`Refresh Session (${formatShortcut('R')})`} > @@ -367,7 +368,7 @@ export const TabBar = ({ paneId }: TabBarProps): React.JSX.Element => { color: searchHover ? 'var(--color-text)' : 'var(--color-text-muted)', backgroundColor: searchHover ? 'var(--color-surface-raised)' : 'transparent', }} - title="Search (Cmd+K)" + title={`Search (${formatShortcut('K')})`} > diff --git a/src/renderer/components/layout/TabContextMenu.tsx b/src/renderer/components/layout/TabContextMenu.tsx index cd3fedf8..17f8bf0a 100644 --- a/src/renderer/components/layout/TabContextMenu.tsx +++ b/src/renderer/components/layout/TabContextMenu.tsx @@ -7,6 +7,8 @@ import { useEffect, useRef } from 'react'; +import { formatShortcut } from '@renderer/utils/stringUtils'; + interface TabContextMenuProps { x: number; y: number; @@ -100,13 +102,13 @@ export const TabContextMenu = ({ onClick={handleClick(onCloseSelectedTabs)} /> ) : ( - + )}
@@ -127,7 +129,7 @@ export const TabContextMenu = ({ /> )}
- +
); }; diff --git a/src/renderer/components/sidebar/SessionContextMenu.tsx b/src/renderer/components/sidebar/SessionContextMenu.tsx index 4adbf6ee..626cc6a5 100644 --- a/src/renderer/components/sidebar/SessionContextMenu.tsx +++ b/src/renderer/components/sidebar/SessionContextMenu.tsx @@ -7,6 +7,7 @@ import { useEffect, useRef, useState } from 'react'; import { MAX_PANES } from '@renderer/types/panes'; +import { formatShortcut } from '@renderer/utils/stringUtils'; import { Check, ClipboardCopy, Eye, EyeOff, Pin, PinOff, Terminal } from 'lucide-react'; interface SessionContextMenuProps { @@ -98,7 +99,7 @@ export const SessionContextMenu = ({ }} > - +