mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-08-05 19:21:35 -07:00
fix(overlay): Linux X11/XWayland stacking, stale pause state, multi-copy selector (#101)
This commit is contained in:
@@ -1,5 +1,8 @@
|
||||
import type { BrowserWindow } from 'electron';
|
||||
|
||||
type VisibilitySyncTimeout = NonNullable<Parameters<typeof globalThis.clearTimeout>[0]>;
|
||||
const POST_RESTORE_VISIBILITY_SYNC_DELAYS_MS = [50, 150, 300, 600, 1000] as const;
|
||||
|
||||
function requestOverlayApplicationFocus(): void {
|
||||
try {
|
||||
const electron = require('electron') as {
|
||||
@@ -25,16 +28,48 @@ export type OverlayModalInputStateDeps = {
|
||||
syncOverlayShortcutsForModal: (isActive: boolean) => void;
|
||||
syncOverlayVisibilityForModal: () => void;
|
||||
restoreMainWindowFocus?: () => void;
|
||||
schedulePostRestoreVisibilitySync?: (
|
||||
callback: () => void,
|
||||
delayMs: number,
|
||||
) => VisibilitySyncTimeout;
|
||||
clearPostRestoreVisibilitySync?: (timeout: VisibilitySyncTimeout) => void;
|
||||
};
|
||||
|
||||
export function createOverlayModalInputState(deps: OverlayModalInputStateDeps) {
|
||||
let modalInputExclusive = false;
|
||||
let postRestoreVisibilitySyncTimeouts: VisibilitySyncTimeout[] = [];
|
||||
const schedulePostRestoreVisibilitySync =
|
||||
deps.schedulePostRestoreVisibilitySync ?? globalThis.setTimeout;
|
||||
const clearPostRestoreVisibilitySync =
|
||||
deps.clearPostRestoreVisibilitySync ?? globalThis.clearTimeout;
|
||||
|
||||
const clearPostRestoreVisibilitySyncBurst = (): void => {
|
||||
for (const timeout of postRestoreVisibilitySyncTimeouts) {
|
||||
clearPostRestoreVisibilitySync(timeout);
|
||||
}
|
||||
postRestoreVisibilitySyncTimeouts = [];
|
||||
};
|
||||
|
||||
const schedulePostRestoreVisibilitySyncBurst = (): void => {
|
||||
clearPostRestoreVisibilitySyncBurst();
|
||||
for (const delayMs of POST_RESTORE_VISIBILITY_SYNC_DELAYS_MS) {
|
||||
const timeout = schedulePostRestoreVisibilitySync(() => {
|
||||
postRestoreVisibilitySyncTimeouts = postRestoreVisibilitySyncTimeouts.filter(
|
||||
(candidate) => candidate !== timeout,
|
||||
);
|
||||
deps.syncOverlayVisibilityForModal();
|
||||
}, delayMs);
|
||||
(timeout as { unref?: () => void }).unref?.();
|
||||
postRestoreVisibilitySyncTimeouts.push(timeout);
|
||||
}
|
||||
};
|
||||
|
||||
const handleModalInputStateChange = (isActive: boolean): void => {
|
||||
if (modalInputExclusive === isActive) {
|
||||
return;
|
||||
}
|
||||
|
||||
clearPostRestoreVisibilitySyncBurst();
|
||||
modalInputExclusive = isActive;
|
||||
if (isActive) {
|
||||
const modalWindow = deps.getModalWindow();
|
||||
@@ -54,6 +89,10 @@ export function createOverlayModalInputState(deps: OverlayModalInputStateDeps) {
|
||||
deps.syncOverlayVisibilityForModal();
|
||||
if (!isActive) {
|
||||
deps.restoreMainWindowFocus?.();
|
||||
if (deps.restoreMainWindowFocus) {
|
||||
deps.syncOverlayVisibilityForModal();
|
||||
schedulePostRestoreVisibilitySyncBurst();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user