fix(macos): preserve overlay on transient tracker loss; fix subsync modal open (#66)

This commit is contained in:
2026-05-15 20:46:00 -07:00
committed by GitHub
parent 4cb0dbfaad
commit 105713361e
17 changed files with 479 additions and 91 deletions
+46 -1
View File
@@ -1,6 +1,14 @@
import assert from 'node:assert/strict';
import test from 'node:test';
import { MacOSWindowTracker } from './macos-tracker';
import { MacOSWindowTracker, parseMacOSHelperOutput } from './macos-tracker';
test('parseMacOSHelperOutput parses minimized state', () => {
assert.deepEqual(parseMacOSHelperOutput('minimized'), {
geometry: null,
focused: false,
minimized: true,
});
});
test('MacOSWindowTracker keeps the last geometry through a single helper miss', async () => {
let callIndex = 0;
@@ -170,3 +178,40 @@ test('MacOSWindowTracker drops tracking after grace window expires', async () =>
assert.equal(tracker.isTracking(), false);
assert.equal(tracker.getGeometry(), null);
});
test('MacOSWindowTracker reports minimized target when helper reports minimized', async () => {
let callIndex = 0;
let now = 1_000;
const outputs = [
{ stdout: '10,20,1280,720,1', stderr: '' },
{ stdout: 'minimized', stderr: '' },
{ stdout: 'minimized', stderr: '' },
];
const tracker = new MacOSWindowTracker('/tmp/mpv.sock', {
resolveHelper: () => ({
helperPath: 'helper.swift',
helperType: 'swift',
}),
runHelper: async () => outputs[callIndex++] ?? outputs.at(-1)!,
now: () => now,
minimizedTrackingLossGraceMs: 200,
});
(tracker as unknown as { pollGeometry: () => void }).pollGeometry();
await new Promise((resolve) => setTimeout(resolve, 0));
assert.equal(tracker.isTracking(), true);
assert.equal(tracker.isTargetWindowMinimized(), false);
now += 250;
(tracker as unknown as { pollGeometry: () => void }).pollGeometry();
await new Promise((resolve) => setTimeout(resolve, 0));
assert.equal(tracker.isTargetWindowMinimized(), true);
assert.equal(tracker.isTracking(), true);
now += 250;
(tracker as unknown as { pollGeometry: () => void }).pollGeometry();
await new Promise((resolve) => setTimeout(resolve, 0));
assert.equal(tracker.isTargetWindowMinimized(), true);
assert.equal(tracker.isTracking(), false);
});