From e742e4b93dba7ba7a95cfb2914b94d2ad66d2466 Mon Sep 17 00:00:00 2001 From: sudacode Date: Mon, 9 Feb 2026 19:40:40 -0800 Subject: [PATCH] refactor: extract global shortcut registration service --- src/core/services/shortcut-service.ts | 81 +++++++++++++++++++++++++++ src/main.ts | 72 +++--------------------- 2 files changed, 89 insertions(+), 64 deletions(-) create mode 100644 src/core/services/shortcut-service.ts diff --git a/src/core/services/shortcut-service.ts b/src/core/services/shortcut-service.ts new file mode 100644 index 0000000..6e00ec0 --- /dev/null +++ b/src/core/services/shortcut-service.ts @@ -0,0 +1,81 @@ +import { BrowserWindow, globalShortcut } from "electron"; + +export interface GlobalShortcutConfig { + toggleVisibleOverlayGlobal: string | null | undefined; + toggleInvisibleOverlayGlobal: string | null | undefined; +} + +export function registerGlobalShortcutsService(options: { + shortcuts: GlobalShortcutConfig; + onToggleVisibleOverlay: () => void; + onToggleInvisibleOverlay: () => void; + onOpenYomitanSettings: () => void; + isDev: boolean; + getMainWindow: () => BrowserWindow | null; +}): void { + const visibleShortcut = options.shortcuts.toggleVisibleOverlayGlobal; + const invisibleShortcut = options.shortcuts.toggleInvisibleOverlayGlobal; + const normalizedVisible = visibleShortcut?.replace(/\s+/g, "").toLowerCase(); + const normalizedInvisible = invisibleShortcut + ?.replace(/\s+/g, "") + .toLowerCase(); + + if (visibleShortcut) { + const toggleVisibleRegistered = globalShortcut.register( + visibleShortcut, + () => { + options.onToggleVisibleOverlay(); + }, + ); + if (!toggleVisibleRegistered) { + console.warn( + `Failed to register global shortcut toggleVisibleOverlayGlobal: ${visibleShortcut}`, + ); + } + } + + if ( + invisibleShortcut && + normalizedInvisible && + normalizedInvisible !== normalizedVisible + ) { + const toggleInvisibleRegistered = globalShortcut.register( + invisibleShortcut, + () => { + options.onToggleInvisibleOverlay(); + }, + ); + if (!toggleInvisibleRegistered) { + console.warn( + `Failed to register global shortcut toggleInvisibleOverlayGlobal: ${invisibleShortcut}`, + ); + } + } else if ( + invisibleShortcut && + normalizedInvisible && + normalizedInvisible === normalizedVisible + ) { + console.warn( + "Skipped registering toggleInvisibleOverlayGlobal because it collides with toggleVisibleOverlayGlobal", + ); + } + + const settingsRegistered = globalShortcut.register("Alt+Shift+Y", () => { + options.onOpenYomitanSettings(); + }); + if (!settingsRegistered) { + console.warn("Failed to register global shortcut: Alt+Shift+Y"); + } + + if (options.isDev) { + const devtoolsRegistered = globalShortcut.register("F12", () => { + const mainWindow = options.getMainWindow(); + if (mainWindow && !mainWindow.isDestroyed()) { + mainWindow.webContents.toggleDevTools(); + } + }); + if (!devtoolsRegistered) { + console.warn("Failed to register global shortcut: F12"); + } + } +} diff --git a/src/main.ts b/src/main.ts index ae32d95..7d7060d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -129,6 +129,7 @@ import { hasMpvWebsocketPlugin, SubtitleWebSocketService, } from "./core/services/subtitle-ws-service"; +import { registerGlobalShortcutsService } from "./core/services/shortcut-service"; import { ConfigService, DEFAULT_CONFIG, @@ -2330,71 +2331,14 @@ function openYomitanSettings(): void { } function registerGlobalShortcuts(): void { - const shortcuts = getConfiguredShortcuts(); - const visibleShortcut = shortcuts.toggleVisibleOverlayGlobal; - const invisibleShortcut = shortcuts.toggleInvisibleOverlayGlobal; - const normalizedVisible = visibleShortcut?.replace(/\s+/g, "").toLowerCase(); - const normalizedInvisible = invisibleShortcut - ?.replace(/\s+/g, "") - .toLowerCase(); - - if (visibleShortcut) { - const toggleVisibleRegistered = globalShortcut.register( - visibleShortcut, - () => { - toggleVisibleOverlay(); - }, - ); - if (!toggleVisibleRegistered) { - console.warn( - `Failed to register global shortcut toggleVisibleOverlayGlobal: ${visibleShortcut}`, - ); - } - } - - if ( - invisibleShortcut && - normalizedInvisible && - normalizedInvisible !== normalizedVisible - ) { - const toggleInvisibleRegistered = globalShortcut.register( - invisibleShortcut, - () => { - toggleInvisibleOverlay(); - }, - ); - if (!toggleInvisibleRegistered) { - console.warn( - `Failed to register global shortcut toggleInvisibleOverlayGlobal: ${invisibleShortcut}`, - ); - } - } else if ( - invisibleShortcut && - normalizedInvisible && - normalizedInvisible === normalizedVisible - ) { - console.warn( - "Skipped registering toggleInvisibleOverlayGlobal because it collides with toggleVisibleOverlayGlobal", - ); - } - - const settingsRegistered = globalShortcut.register("Alt+Shift+Y", () => { - openYomitanSettings(); + registerGlobalShortcutsService({ + shortcuts: getConfiguredShortcuts(), + onToggleVisibleOverlay: () => toggleVisibleOverlay(), + onToggleInvisibleOverlay: () => toggleInvisibleOverlay(), + onOpenYomitanSettings: () => openYomitanSettings(), + isDev, + getMainWindow: () => mainWindow, }); - if (!settingsRegistered) { - console.warn("Failed to register global shortcut: Alt+Shift+Y"); - } - - if (isDev) { - const devtoolsRegistered = globalShortcut.register("F12", () => { - if (mainWindow && !mainWindow.isDestroyed()) { - mainWindow.webContents.toggleDevTools(); - } - }); - if (!devtoolsRegistered) { - console.warn("Failed to register global shortcut: F12"); - } - } } function getConfiguredShortcuts() {