From dde51f86340f83629c92462f080108b0118ed7d7 Mon Sep 17 00:00:00 2001 From: sudacode Date: Fri, 27 Feb 2026 00:45:15 -0800 Subject: [PATCH] fix(overlay): honor mpv subtitle binding config and tidy modal close --- src/core/services/mpv-protocol.test.ts | 14 ++++++++++++++ src/core/services/mpv-protocol.ts | 3 ++- src/main.ts | 5 ++++- src/main/overlay-runtime.ts | 10 ++++------ 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/core/services/mpv-protocol.test.ts b/src/core/services/mpv-protocol.test.ts index 3c75a48..135dcdf 100644 --- a/src/core/services/mpv-protocol.test.ts +++ b/src/core/services/mpv-protocol.test.ts @@ -135,6 +135,20 @@ test('dispatchMpvProtocolMessage enforces sub-visibility hidden when overlay sup }); }); +test('dispatchMpvProtocolMessage skips sub-visibility suppression when overlay binding is disabled', async () => { + const { deps, state } = createDeps({ + shouldBindVisibleOverlayToMpvSubVisibility: () => false, + isVisibleOverlayVisible: () => true, + }); + + await dispatchMpvProtocolMessage( + { event: 'property-change', name: 'sub-visibility', data: 'yes' }, + deps, + ); + + assert.equal(state.commands.length, 0); +}); + test('dispatchMpvProtocolMessage sets secondary subtitle track based on track list response', async () => { const { deps, state } = createDeps(); diff --git a/src/core/services/mpv-protocol.ts b/src/core/services/mpv-protocol.ts index c6ed542..ab7f6f6 100644 --- a/src/core/services/mpv-protocol.ts +++ b/src/core/services/mpv-protocol.ts @@ -220,7 +220,8 @@ export async function dispatchMpvProtocolMessage( } else if (msg.name === 'sub-visibility') { if ( deps.isVisibleOverlayVisible() && - asBoolean(msg.data, false) + asBoolean(msg.data, false) && + (deps.shouldBindVisibleOverlayToMpvSubVisibility?.() ?? true) ) { deps.sendCommand({ command: ['set_property', 'sub-visibility', 'no'] }); } diff --git a/src/main.ts b/src/main.ts index f15f035..6cdc734 100644 --- a/src/main.ts +++ b/src/main.ts @@ -758,7 +758,10 @@ const restoreOverlayMpvSubtitles = createRestoreOverlayMpvSubtitlesHandler({ }); function shouldSuppressMpvSubtitlesForOverlay(): boolean { - return overlayManager.getVisibleOverlayVisible(); + return ( + overlayManager.getVisibleOverlayVisible() && + configDerivedRuntime.shouldBindVisibleOverlayToMpvSubVisibility() + ); } function syncOverlayMpvSubtitleSuppression(): void { diff --git a/src/main/overlay-runtime.ts b/src/main/overlay-runtime.ts index 8f66128..9cf1c8c 100644 --- a/src/main/overlay-runtime.ts +++ b/src/main/overlay-runtime.ts @@ -232,15 +232,13 @@ export function createOverlayModalRuntimeService( const handleOverlayModalClosed = (modal: OverlayHostedModal): void => { if (!restoreVisibleOverlayOnModalClose.has(modal)) return; restoreVisibleOverlayOnModalClose.delete(modal); + const modalWindow = deps.getModalWindow(); if (restoreVisibleOverlayOnModalClose.size === 0) { clearPendingModalWindowReveal(); notifyModalStateChange(false); - } - - const modalWindow = deps.getModalWindow(); - if (!modalWindow || modalWindow.isDestroyed()) return; - if (restoreVisibleOverlayOnModalClose.size === 0) { - modalWindow.hide(); + if (modalWindow && !modalWindow.isDestroyed()) { + modalWindow.hide(); + } } };