add toggle for app-suspension for powersave block (#1992)

This commit is contained in:
jeffvli
2026-05-01 21:24:45 -07:00
parent 3b2aab74ac
commit 323130a877
5 changed files with 51 additions and 10 deletions
+2
View File
@@ -1008,6 +1008,8 @@
"audioFadeOnStatusChange_description": "enables fade out and fade in when play/pause status changes", "audioFadeOnStatusChange_description": "enables fade out and fade in when play/pause status changes",
"preventSleepOnPlayback_description": "prevent the display from sleeping while music is playing", "preventSleepOnPlayback_description": "prevent the display from sleeping while music is playing",
"preventSleepOnPlayback": "prevent sleep on playback", "preventSleepOnPlayback": "prevent sleep on playback",
"preventSuspendOnPlayback_description": "prevent the application from suspending while music is playing",
"preventSuspendOnPlayback": "prevent suspend on playback",
"remotePassword_description": "sets the password for the remote control server. These credentials are by default transferred insecurely, so you should use a unique password that you do not care about", "remotePassword_description": "sets the password for the remote control server. These credentials are by default transferred insecurely, so you should use a unique password that you do not care about",
"remotePassword": "remote control server password", "remotePassword": "remote control server password",
"remotePort_description": "sets the port for the remote control server", "remotePort_description": "sets the port for the remote control server",
+4 -2
View File
@@ -931,12 +931,14 @@ ipcMain.on(
}, },
); );
ipcMain.handle('power-save-blocker-start', () => { ipcMain.handle('power-save-blocker-start', (_event, { full }: { full: boolean }) => {
if (powerSaveBlockerId !== null) { if (powerSaveBlockerId !== null) {
return powerSaveBlockerId; return powerSaveBlockerId;
} }
powerSaveBlockerId = powerSaveBlocker.start('prevent-display-sleep'); powerSaveBlockerId = powerSaveBlocker.start(
full ? 'prevent-display-sleep' : 'prevent-app-suspension',
);
return powerSaveBlockerId; return powerSaveBlockerId;
}); });
@@ -8,17 +8,17 @@ const ipc = isElectron() ? window.api.ipc : null;
export const usePowerSaveBlocker = () => { export const usePowerSaveBlocker = () => {
const status = usePlayerStatus(); const status = usePlayerStatus();
const { preventSleepOnPlayback } = useWindowSettings(); const { preventSleepOnPlayback, preventSuspendOnPlayback } = useWindowSettings();
const startPowerSaveBlocker = useCallback(async () => { const startPowerSaveBlocker = useCallback(async () => {
if (!ipc) return; if (!ipc) return;
try { try {
await ipc.invoke('power-save-blocker-start'); await ipc.invoke('power-save-blocker-start', { full: preventSleepOnPlayback });
} catch (error) { } catch (error) {
console.error('Failed to start power save blocker:', error); console.error('Failed to start power save blocker:', error);
} }
}, []); }, [preventSleepOnPlayback]);
const stopPowerSaveBlocker = useCallback(async () => { const stopPowerSaveBlocker = useCallback(async () => {
if (!ipc) return; if (!ipc) return;
@@ -31,16 +31,21 @@ export const usePowerSaveBlocker = () => {
}, []); }, []);
useEffect(() => { useEffect(() => {
if (!preventSleepOnPlayback) return; if (!preventSleepOnPlayback || !preventSuspendOnPlayback) return;
if (status === PlayerStatus.PLAYING) { if (status === PlayerStatus.PLAYING) {
startPowerSaveBlocker(); startPowerSaveBlocker();
} else { } else {
stopPowerSaveBlocker(); stopPowerSaveBlocker();
} }
}, [status, preventSleepOnPlayback, startPowerSaveBlocker, stopPowerSaveBlocker]); }, [
status,
preventSleepOnPlayback,
startPowerSaveBlocker,
stopPowerSaveBlocker,
preventSuspendOnPlayback,
]);
// Clean up on unmount
useEffect(() => { useEffect(() => {
return () => { return () => {
stopPowerSaveBlocker(); stopPowerSaveBlocker();
@@ -56,8 +61,11 @@ const PowerSaveBlockerHookInner = () => {
export const PowerSaveBlockerHook = () => { export const PowerSaveBlockerHook = () => {
const isElectronEnv = isElectron(); const isElectronEnv = isElectron();
const preventSleepOnPlayback = useSettingsStore((state) => state.window.preventSleepOnPlayback); const preventSleepOnPlayback = useSettingsStore((state) => state.window.preventSleepOnPlayback);
const preventSuspendOnPlayback = useSettingsStore(
(state) => state.window.preventSuspendOnPlayback,
);
if (!isElectronEnv || !preventSleepOnPlayback) { if (!isElectronEnv || !preventSleepOnPlayback || !preventSuspendOnPlayback) {
return null; return null;
} }
@@ -184,7 +184,7 @@ export const WindowSettings = memo(() => {
<Switch <Switch
aria-label="Toggle prevent sleep on playback" aria-label="Toggle prevent sleep on playback"
defaultChecked={settings.preventSleepOnPlayback} defaultChecked={settings.preventSleepOnPlayback}
disabled={!isElectron()} disabled={!isElectron() || settings.preventSuspendOnPlayback}
onChange={(e) => { onChange={(e) => {
if (!e) return; if (!e) return;
localSettings?.set( localSettings?.set(
@@ -206,6 +206,33 @@ export const WindowSettings = memo(() => {
isHidden: !isElectron(), isHidden: !isElectron(),
title: t('setting.preventSleepOnPlayback', { postProcess: 'sentenceCase' }), title: t('setting.preventSleepOnPlayback', { postProcess: 'sentenceCase' }),
}, },
{
control: (
<Switch
aria-label="Toggle prevent suspend on playback"
defaultChecked={settings.preventSuspendOnPlayback}
disabled={!isElectron() || settings.preventSleepOnPlayback}
onChange={(e) => {
if (!e) return;
localSettings?.set(
'window_prevent_suspend_on_playback',
e.currentTarget.checked,
);
setSettings({
window: {
preventSuspendOnPlayback: e.currentTarget.checked,
},
});
}}
/>
),
description: t('setting.preventSuspendOnPlayback', {
context: 'description',
postProcess: 'sentenceCase',
}),
isHidden: !isElectron(),
title: t('setting.preventSuspendOnPlayback', { postProcess: 'sentenceCase' }),
},
]; ];
return ( return (
+2
View File
@@ -638,6 +638,7 @@ const WindowSettingsSchema = z.object({
exitToTray: z.boolean(), exitToTray: z.boolean(),
minimizeToTray: z.boolean(), minimizeToTray: z.boolean(),
preventSleepOnPlayback: z.boolean(), preventSleepOnPlayback: z.boolean(),
preventSuspendOnPlayback: z.boolean(),
releaseChannel: z.enum(['alpha', 'beta', 'latest']), releaseChannel: z.enum(['alpha', 'beta', 'latest']),
startMinimized: z.boolean(), startMinimized: z.boolean(),
tray: z.boolean(), tray: z.boolean(),
@@ -1914,6 +1915,7 @@ const initialState: SettingsState = {
exitToTray: false, exitToTray: false,
minimizeToTray: false, minimizeToTray: false,
preventSleepOnPlayback: false, preventSleepOnPlayback: false,
preventSuspendOnPlayback: false,
releaseChannel: 'latest', releaseChannel: 'latest',
startMinimized: false, startMinimized: false,
tray: true, tray: true,