diff --git a/openless-all/app/src-tauri/src/types.rs b/openless-all/app/src-tauri/src/types.rs index 069205db..b74f7bcc 100644 --- a/openless-all/app/src-tauri/src/types.rs +++ b/openless-all/app/src-tauri/src/types.rs @@ -2576,12 +2576,13 @@ impl HotkeyCapability { { return Self { adapter: HotkeyAdapterKind::WindowsLowLevel, + // Windows 没有 Command 键:leftCommand/rightCommand 会被映射到 Win 键, + // 而单按 Win 会弹出开始菜单,实际无法作为录音热键使用。故不在 Windows + // 的常用单键预设里提供 Command 选项(issue #784)。 available_triggers: vec![ HotkeyTrigger::RightControl, HotkeyTrigger::RightAlt, HotkeyTrigger::LeftControl, - HotkeyTrigger::RightCommand, - HotkeyTrigger::LeftCommand, HotkeyTrigger::LeftShift, HotkeyTrigger::RightShift, HotkeyTrigger::MediaPlayPause, diff --git a/openless-all/app/src/i18n/en.ts b/openless-all/app/src/i18n/en.ts index bc6ee644..962bf4ea 100644 --- a/openless-all/app/src/i18n/en.ts +++ b/openless-all/app/src/i18n/en.ts @@ -1166,6 +1166,9 @@ export const en: typeof zhCN = { rightControl: 'Right Control', leftControl: 'Left Control', rightCommand: 'Right Command', + leftCommand: 'Left Command', + leftShift: 'Left Shift', + rightShift: 'Right Shift', fn: 'Fn (Globe key)', rightAlt: 'Right Alt', mediaPlayPause: '⏯ Media Play/Pause', diff --git a/openless-all/app/src/i18n/ja.ts b/openless-all/app/src/i18n/ja.ts index 5e32d598..a06691fd 100644 --- a/openless-all/app/src/i18n/ja.ts +++ b/openless-all/app/src/i18n/ja.ts @@ -1134,6 +1134,9 @@ export const ja: typeof zhCN = { rightControl: '右 Control', leftControl: '左 Control', rightCommand: '右 Command', + leftCommand: '左 Command', + leftShift: '左 Shift', + rightShift: '右 Shift', fn: 'Fn (地球キー)', rightAlt: '右 Alt', mediaPlayPause: '⏯ メディア再生/一時停止', diff --git a/openless-all/app/src/i18n/ko.ts b/openless-all/app/src/i18n/ko.ts index e4c21fae..c11fa80e 100644 --- a/openless-all/app/src/i18n/ko.ts +++ b/openless-all/app/src/i18n/ko.ts @@ -1134,6 +1134,9 @@ export const ko: typeof zhCN = { rightControl: '오른쪽 Control', leftControl: '왼쪽 Control', rightCommand: '오른쪽 Command', + leftCommand: '왼쪽 Command', + leftShift: '왼쪽 Shift', + rightShift: '오른쪽 Shift', fn: 'Fn (지구본 키)', rightAlt: '오른쪽 Alt', mediaPlayPause: '⏯ 미디어 재생/일시정지', diff --git a/openless-all/app/src/i18n/zh-CN.ts b/openless-all/app/src/i18n/zh-CN.ts index 6f33701e..d1164f0b 100644 --- a/openless-all/app/src/i18n/zh-CN.ts +++ b/openless-all/app/src/i18n/zh-CN.ts @@ -1164,6 +1164,9 @@ export const zhCN = { rightControl: '右 Control', leftControl: '左 Control', rightCommand: '右 Command', + leftCommand: '左 Command', + leftShift: '左 Shift', + rightShift: '右 Shift', fn: 'Fn (地球键)', rightAlt: '右 Alt', mediaPlayPause: '⏯ 媒体播放/暂停', diff --git a/openless-all/app/src/i18n/zh-TW.ts b/openless-all/app/src/i18n/zh-TW.ts index 60bb6a53..3f27bc7d 100644 --- a/openless-all/app/src/i18n/zh-TW.ts +++ b/openless-all/app/src/i18n/zh-TW.ts @@ -1132,6 +1132,9 @@ export const zhTW: typeof zhCN = { rightControl: '右 Control', leftControl: '左 Control', rightCommand: '右 Command', + leftCommand: '左 Command', + leftShift: '左 Shift', + rightShift: '右 Shift', fn: 'Fn (地球鍵)', rightAlt: '右 Alt', mediaPlayPause: '⏯ 媒體播放/暫停', diff --git a/openless-all/app/src/lib/ipc/mock-data.ts b/openless-all/app/src/lib/ipc/mock-data.ts index 8b487c40..1dc753f1 100644 --- a/openless-all/app/src/lib/ipc/mock-data.ts +++ b/openless-all/app/src/lib/ipc/mock-data.ts @@ -399,7 +399,9 @@ export const mockHotkeyCapability: HotkeyCapability = { "rightControl", "rightAlt", "leftControl", - "rightCommand", + "leftShift", + "rightShift", + "mediaPlayPause", "custom", ], requiresAccessibilityPermission: false, diff --git a/openless-all/app/src/pages/Overview.tsx b/openless-all/app/src/pages/Overview.tsx index 17d5129f..8e99dcf4 100644 --- a/openless-all/app/src/pages/Overview.tsx +++ b/openless-all/app/src/pages/Overview.tsx @@ -219,7 +219,9 @@ export function Overview({ onOpenHistory }: OverviewProps) { 只有「最近识别」内部允许滚动;其他卡片按内容自然高度,不破裂底部圆角。 issue #243 follow-up:去掉外层 overflow 后底部圆角被裁的视觉问题。 */}
- + {/* overflow:hidden:窗口过小时这一行 flex:1 会被压到比内容还矮,柱状图(固定高) + 原本会溢出卡片圆角外(issue #782)。裁进卡片内,与右侧「最近识别」卡片一致。 */} +
{t('overview.weekTitle')} {t('overview.weekUnit')} @@ -342,7 +344,9 @@ function ActivityHeatmapCard({ activity }: { activity: ActivityDay[] }) { }; }, [activity, i18n.language]); return ( - + // marginBottom 与上方 provider / metrics 两行的 18px 节奏保持一致:否则「年度活动」 + // 会直接贴住下面「近 7 天 / 最近识别」那一行,中间没有间隔(issue #781)。 + {t('overview.activityTitle')} diff --git a/openless-all/app/src/pages/settings/RecordingInputSection.tsx b/openless-all/app/src/pages/settings/RecordingInputSection.tsx index 0f33d7e8..52f9538e 100644 --- a/openless-all/app/src/pages/settings/RecordingInputSection.tsx +++ b/openless-all/app/src/pages/settings/RecordingInputSection.tsx @@ -58,6 +58,18 @@ export function RecordingInputSection() { void getPlatformCapabilities().then(setPlatformCaps); }, []); + // 兼容旧 Windows 配置:Shift+Insert 仍保留在跨平台类型/后端中供 Linux 使用, + // 但 Windows 已不再提供该选项;进入设置时迁移为 Ctrl+V,避免下拉框无匹配值。 + useEffect(() => { + if (os !== 'win' || prefs?.pasteShortcut !== 'shiftInsert') return; + void savePrefs(current => { + if (current.pasteShortcut !== 'shiftInsert') return current; + return { ...current, pasteShortcut: 'ctrlV' }; + }).catch(error => { + console.warn('[settings] migrate Windows paste shortcut failed', error); + }); + }, [os, prefs?.pasteShortcut, savePrefs]); + const loadMicrophoneDevices = useCallback(async ( signal?: { cancelled: boolean }, options: { showLoading?: boolean } = {}, @@ -133,6 +145,9 @@ export function RecordingInputSection() { const showDesktopHotkey = platformCaps?.supportsDesktopHotkey === true; const showDesktopInsert = showDesktopHotkey && os !== 'linux'; const showDesktopStartup = showDesktopHotkey; + const effectivePasteShortcut = os === 'win' && prefs.pasteShortcut === 'shiftInsert' + ? 'ctrlV' + : prefs.pasteShortcut; const onModeChange = (mode: HotkeyMode) => savePrefs({ ...prefs, hotkey: { ...prefs.hotkey, mode } }); @@ -309,12 +324,14 @@ export function RecordingInputSection() { {capability.adapter !== 'macEventTap' && ( onPasteShortcutChange(next as PasteShortcut)} options={[ { value: 'ctrlV', label: t('settings.recording.pasteShortcutCtrlV') }, { value: 'ctrlShiftV', label: t('settings.recording.pasteShortcutCtrlShiftV') }, - { value: 'shiftInsert', label: t('settings.recording.pasteShortcutShiftInsert') }, + // 这个「粘贴与剪贴板」组只在 Windows 出现(showDesktopInsert 已排除 Linux,mac 走 + // macEventTap 不显示本行)。Shift+Insert 是 xterm/urxvt 等 X11 终端的粘贴组合, + // 放在 Windows 上纯属误导,故不再作为选项(issue #786)。 ]} ariaLabel={t('settings.recording.pasteShortcutLabel')} style={{ ...inputStyle, maxWidth: 220 }} @@ -404,11 +421,6 @@ export function RecordingInputSection() { - {capability.statusHint && ( -
- {capability.statusHint} -
- )} )} diff --git a/openless-all/app/src/pages/settings/ShortcutsSection.tsx b/openless-all/app/src/pages/settings/ShortcutsSection.tsx index b57d9cde..e5ff9e59 100644 --- a/openless-all/app/src/pages/settings/ShortcutsSection.tsx +++ b/openless-all/app/src/pages/settings/ShortcutsSection.tsx @@ -62,7 +62,9 @@ export function ShortcutsSection() { const readonlyRows: Array<[string, string]> = [ [t('settings.shortcuts.cancel'), 'Esc'], - ...(os !== 'linux' ? [[t('settings.shortcuts.confirm'), t('settings.shortcuts.confirmHint')]] as Array<[string, string]> : []), + // 胶囊右侧「✓ 确认插入」目前只在 macOS 胶囊上有,Windows/Linux 胶囊没有这个按钮, + // 之前 os !== 'linux' 把它也展示给了 Windows,误导用户以为有个用不了的快捷键(issue #780)。 + ...(os === 'mac' ? [[t('settings.shortcuts.confirm'), t('settings.shortcuts.confirmHint')]] as Array<[string, string]> : []), ]; return ( diff --git a/openless-all/app/src/state/HotkeySettingsContext.tsx b/openless-all/app/src/state/HotkeySettingsContext.tsx index abde285e..bfe63520 100644 --- a/openless-all/app/src/state/HotkeySettingsContext.tsx +++ b/openless-all/app/src/state/HotkeySettingsContext.tsx @@ -59,6 +59,7 @@ export function HotkeySettingsProvider({ children }: { children: ReactNode }) { ]) let nextError: string | null = null if (prefsResult.status === "fulfilled") { + latestPrefsRef.current = prefsResult.value setPrefs(prefsResult.value) applyThemeFromPreference(prefsResult.value.themeMode ?? "system") } else {