fix(overlay): prevent field grouping modal from freezing overlay on Hyprland (#138)

This commit is contained in:
2026-07-06 22:13:14 -07:00
committed by GitHub
parent 35ca2afc6f
commit a042b04357
27 changed files with 878 additions and 65 deletions
@@ -36,3 +36,50 @@ test('field grouping overlay main deps builder maps window visibility and resolv
assert.equal(deps.sendToVisibleOverlay('kiku:open', 1), true);
assert.deepEqual(calls, ['visible:true', 'set-resolver:null', 'send:kiku:open:1']);
});
test('field grouping overlay main deps builder forwards modal open/teardown/prereq wiring', () => {
// Regression: these are optional on the runtime options, so a missing forward compiled
// silently and left the field grouping modal with no ack/retry, no teardown, and no prereqs —
// the reason the earlier recovery fixes never took effect.
const calls: string[] = [];
const waitForModalOpen = async (modal: 'kiku', timeoutMs: number): Promise<boolean> => {
calls.push(`wait:${modal}:${timeoutMs}`);
return true;
};
const handleOverlayModalClosed = (modal: 'kiku'): void => {
calls.push(`closed:${modal}`);
};
const logWarn = (message: string): void => {
calls.push(`warn:${message}`);
};
const ensureOverlayStartupPrereqs = (): void => {
calls.push('prereqs');
};
const ensureOverlayWindowsReadyForVisibilityActions = (): void => {
calls.push('windows-ready');
};
const deps = createBuildFieldGroupingOverlayMainDepsHandler<'kiku'>({
getMainWindow: () => null,
getVisibleOverlayVisible: () => false,
setVisibleOverlayVisible: () => {},
getResolver: () => null,
setResolver: () => {},
getRestoreVisibleOverlayOnModalClose: () => new Set<'kiku'>(),
waitForModalOpen,
handleOverlayModalClosed,
logWarn,
ensureOverlayStartupPrereqs,
ensureOverlayWindowsReadyForVisibilityActions,
sendToActiveOverlayWindow: () => true,
})();
assert.equal(deps.waitForModalOpen, waitForModalOpen);
assert.equal(deps.handleOverlayModalClosed, handleOverlayModalClosed);
assert.equal(deps.logWarn, logWarn);
assert.equal(deps.ensureOverlayStartupPrereqs, ensureOverlayStartupPrereqs);
assert.equal(
deps.ensureOverlayWindowsReadyForVisibilityActions,
ensureOverlayWindowsReadyForVisibilityActions,
);
});