refactor: extract overlay window runtime wiring

This commit is contained in:
2026-02-20 02:16:13 -08:00
parent e8db67e621
commit 9db54f8037
5 changed files with 104 additions and 28 deletions

View File

@@ -381,16 +381,7 @@ import {
} from './main/runtime/overlay-runtime-main-actions-main-deps';
import { createIpcRuntimeHandlers } from './main/runtime/ipc-runtime-handlers';
import { createBuildMpvCommandFromIpcRuntimeMainDepsHandler } from './main/runtime/ipc-mpv-command-main-deps';
import {
createCreateInvisibleWindowHandler,
createCreateMainWindowHandler,
createCreateOverlayWindowHandler,
} from './main/runtime/overlay-window-factory';
import {
createBuildCreateInvisibleWindowMainDepsHandler,
createBuildCreateMainWindowMainDepsHandler,
createBuildCreateOverlayWindowMainDepsHandler,
} from './main/runtime/overlay-window-factory-main-deps';
import { createOverlayWindowRuntimeHandlers } from './main/runtime/overlay-window-runtime-handlers';
import {
createBuildInitializeOverlayRuntimeBootstrapMainDepsHandler,
createBuildOpenYomitanSettingsMainDepsHandler,
@@ -2991,14 +2982,19 @@ const createCliCommandContextHandler = createCliCommandContextFactory({
logWarn: (message: string) => logger.warn(message),
logError: (message: string, err: unknown) => logger.error(message, err),
});
const createOverlayWindowHandler = createCreateOverlayWindowHandler<BrowserWindow>(
createBuildCreateOverlayWindowMainDepsHandler<BrowserWindow>({
const {
createOverlayWindow: createOverlayWindowHandler,
createMainWindow: createMainWindowHandler,
createInvisibleWindow: createInvisibleWindowHandler,
} = createOverlayWindowRuntimeHandlers<BrowserWindow>({
createOverlayWindowDeps: {
createOverlayWindowCore: (kind, options) => createOverlayWindowCore(kind, options),
isDev,
getOverlayDebugVisualizationEnabled: () => appState.overlayDebugVisualizationEnabled,
ensureOverlayWindowLevel: (window) => ensureOverlayWindowLevel(window),
onRuntimeOptionsChanged: () => broadcastRuntimeOptionsChanged(),
setOverlayDebugVisualizationEnabled: (enabled) => setOverlayDebugVisualizationEnabled(enabled),
setOverlayDebugVisualizationEnabled: (enabled) =>
setOverlayDebugVisualizationEnabled(enabled),
isOverlayVisible: (windowKind) =>
windowKind === 'visible'
? overlayManager.getVisibleOverlayVisible()
@@ -3012,20 +3008,10 @@ const createOverlayWindowHandler = createCreateOverlayWindowHandler<BrowserWindo
overlayManager.setInvisibleWindow(null);
}
},
})(),
);
const createMainWindowHandler = createCreateMainWindowHandler<BrowserWindow>(
createBuildCreateMainWindowMainDepsHandler<BrowserWindow>({
createOverlayWindow: (kind) => createOverlayWindow(kind),
setMainWindow: (window) => overlayManager.setMainWindow(window),
})(),
);
const createInvisibleWindowHandler = createCreateInvisibleWindowHandler<BrowserWindow>(
createBuildCreateInvisibleWindowMainDepsHandler<BrowserWindow>({
createOverlayWindow: (kind) => createOverlayWindow(kind),
setInvisibleWindow: (window) => overlayManager.setInvisibleWindow(window),
})(),
);
},
setMainWindow: (window) => overlayManager.setMainWindow(window),
setInvisibleWindow: (window) => overlayManager.setInvisibleWindow(window),
});
const {
resolveTrayIconPath: resolveTrayIconPathHandler,
buildTrayMenu: buildTrayMenuHandler,

View File

@@ -0,0 +1,44 @@
import assert from 'node:assert/strict';
import test from 'node:test';
import { createOverlayWindowRuntimeHandlers } from './overlay-window-runtime-handlers';
test('overlay window runtime handlers compose create/main/invisible handlers', () => {
let mainWindow: { kind: string } | null = null;
let invisibleWindow: { kind: string } | null = null;
let debugEnabled = false;
const calls: string[] = [];
const runtime = createOverlayWindowRuntimeHandlers({
createOverlayWindowDeps: {
createOverlayWindowCore: (kind) => ({ kind }),
isDev: true,
getOverlayDebugVisualizationEnabled: () => debugEnabled,
ensureOverlayWindowLevel: () => calls.push('ensure-level'),
onRuntimeOptionsChanged: () => calls.push('runtime-options-changed'),
setOverlayDebugVisualizationEnabled: (enabled) => {
debugEnabled = enabled;
},
isOverlayVisible: (kind) => kind === 'visible',
tryHandleOverlayShortcutLocalFallback: () => false,
onWindowClosed: (kind) => calls.push(`closed:${kind}`),
},
setMainWindow: (window) => {
mainWindow = window;
},
setInvisibleWindow: (window) => {
invisibleWindow = window;
},
});
assert.deepEqual(runtime.createOverlayWindow('visible'), { kind: 'visible' });
assert.deepEqual(runtime.createOverlayWindow('invisible'), { kind: 'invisible' });
assert.deepEqual(runtime.createMainWindow(), { kind: 'visible' });
assert.deepEqual(mainWindow, { kind: 'visible' });
assert.deepEqual(runtime.createInvisibleWindow(), { kind: 'invisible' });
assert.deepEqual(invisibleWindow, { kind: 'invisible' });
assert.equal(debugEnabled, false);
assert.deepEqual(calls, []);
});

View File

@@ -0,0 +1,42 @@
import {
createCreateInvisibleWindowHandler,
createCreateMainWindowHandler,
createCreateOverlayWindowHandler,
} from './overlay-window-factory';
import {
createBuildCreateInvisibleWindowMainDepsHandler,
createBuildCreateMainWindowMainDepsHandler,
createBuildCreateOverlayWindowMainDepsHandler,
} from './overlay-window-factory-main-deps';
type CreateOverlayWindowMainDeps<TWindow> = Parameters<
typeof createBuildCreateOverlayWindowMainDepsHandler<TWindow>
>[0];
export function createOverlayWindowRuntimeHandlers<TWindow>(deps: {
createOverlayWindowDeps: CreateOverlayWindowMainDeps<TWindow>;
setMainWindow: (window: TWindow | null) => void;
setInvisibleWindow: (window: TWindow | null) => void;
}) {
const createOverlayWindow = createCreateOverlayWindowHandler<TWindow>(
createBuildCreateOverlayWindowMainDepsHandler<TWindow>(deps.createOverlayWindowDeps)(),
);
const createMainWindow = createCreateMainWindowHandler<TWindow>(
createBuildCreateMainWindowMainDepsHandler<TWindow>({
createOverlayWindow: (kind) => createOverlayWindow(kind),
setMainWindow: (window) => deps.setMainWindow(window),
})(),
);
const createInvisibleWindow = createCreateInvisibleWindowHandler<TWindow>(
createBuildCreateInvisibleWindowMainDepsHandler<TWindow>({
createOverlayWindow: (kind) => createOverlayWindow(kind),
setInvisibleWindow: (window) => deps.setInvisibleWindow(window),
})(),
);
return {
createOverlayWindow,
createMainWindow,
createInvisibleWindow,
};
}