mirror of
https://github.com/algerkong/AlgerMusicPlayer.git
synced 2026-05-18 11:37:31 +08:00
perf(lyric-window): 仅在锁定+可见时启用鼠标位置轮询
- 新增 set-lyric-lock-state IPC, 渲染端 watch isLock 同步到主进程 - 主进程通过 isLyricLocked + isLyricWindowVisible 控制轮询启停 - 监听窗口 show/hide/minimize/restore, 隐藏时停止 50ms 轮询 - 解锁状态下 DOM mouseenter/mouseleave 已足够, 无需轮询兜底
This commit is contained in:
+37
-3
@@ -10,8 +10,11 @@ let isDragging = false;
|
|||||||
|
|
||||||
// 添加窗口大小变化防护
|
// 添加窗口大小变化防护
|
||||||
let originalSize = { width: 0, height: 0 };
|
let originalSize = { width: 0, height: 0 };
|
||||||
|
// 轮询只在 "锁定 + 窗口可见" 时启用:解锁状态下 DOM 事件足够,避免常驻 50ms 轮询
|
||||||
let mousePresenceTimer: ReturnType<typeof setInterval> | null = null;
|
let mousePresenceTimer: ReturnType<typeof setInterval> | null = null;
|
||||||
let lastMouseInside: boolean | null = null;
|
let lastMouseInside: boolean | null = null;
|
||||||
|
let isLyricLocked = false;
|
||||||
|
let isLyricWindowVisible = false;
|
||||||
|
|
||||||
const isPointInsideWindow = (
|
const isPointInsideWindow = (
|
||||||
point: { x: number; y: number },
|
point: { x: number; y: number },
|
||||||
@@ -59,6 +62,14 @@ const startMousePresenceTracking = () => {
|
|||||||
}, 50);
|
}, 50);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const syncMousePresenceTracking = () => {
|
||||||
|
if (isLyricLocked && isLyricWindowVisible && lyricWindow && !lyricWindow.isDestroyed()) {
|
||||||
|
startMousePresenceTracking();
|
||||||
|
} else {
|
||||||
|
stopMousePresenceTracking();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const createWin = () => {
|
const createWin = () => {
|
||||||
console.log('Creating lyric window');
|
console.log('Creating lyric window');
|
||||||
|
|
||||||
@@ -151,12 +162,32 @@ const createWin = () => {
|
|||||||
// 监听窗口关闭事件
|
// 监听窗口关闭事件
|
||||||
lyricWindow.on('closed', () => {
|
lyricWindow.on('closed', () => {
|
||||||
stopMousePresenceTracking();
|
stopMousePresenceTracking();
|
||||||
|
isLyricLocked = false;
|
||||||
|
isLyricWindowVisible = false;
|
||||||
if (lyricWindow) {
|
if (lyricWindow) {
|
||||||
lyricWindow.destroy();
|
lyricWindow.destroy();
|
||||||
lyricWindow = null;
|
lyricWindow = null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 窗口可见性变化时同步轮询状态,避免最小化/隐藏时空转
|
||||||
|
lyricWindow.on('show', () => {
|
||||||
|
isLyricWindowVisible = true;
|
||||||
|
syncMousePresenceTracking();
|
||||||
|
});
|
||||||
|
lyricWindow.on('hide', () => {
|
||||||
|
isLyricWindowVisible = false;
|
||||||
|
stopMousePresenceTracking();
|
||||||
|
});
|
||||||
|
lyricWindow.on('minimize', () => {
|
||||||
|
isLyricWindowVisible = false;
|
||||||
|
stopMousePresenceTracking();
|
||||||
|
});
|
||||||
|
lyricWindow.on('restore', () => {
|
||||||
|
isLyricWindowVisible = true;
|
||||||
|
syncMousePresenceTracking();
|
||||||
|
});
|
||||||
|
|
||||||
// 监听窗口大小变化事件,保存新的尺寸
|
// 监听窗口大小变化事件,保存新的尺寸
|
||||||
lyricWindow.on('resize', () => {
|
lyricWindow.on('resize', () => {
|
||||||
// 如果正在拖动,忽略大小调整事件
|
// 如果正在拖动,忽略大小调整事件
|
||||||
@@ -184,7 +215,6 @@ export const loadLyricWindow = (ipcMain: IpcMain, mainWin: BrowserWindow): void
|
|||||||
}
|
}
|
||||||
lyricWindow.focus();
|
lyricWindow.focus();
|
||||||
lyricWindow.show();
|
lyricWindow.show();
|
||||||
startMousePresenceTracking();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -219,7 +249,6 @@ export const loadLyricWindow = (ipcMain: IpcMain, mainWin: BrowserWindow): void
|
|||||||
win.once('ready-to-show', () => {
|
win.once('ready-to-show', () => {
|
||||||
console.log('Lyric window ready to show');
|
console.log('Lyric window ready to show');
|
||||||
win.show();
|
win.show();
|
||||||
startMousePresenceTracking();
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -248,7 +277,6 @@ export const loadLyricWindow = (ipcMain: IpcMain, mainWin: BrowserWindow): void
|
|||||||
|
|
||||||
ipcMain.on('close-lyric', () => {
|
ipcMain.on('close-lyric', () => {
|
||||||
if (lyricWindow && !lyricWindow.isDestroyed()) {
|
if (lyricWindow && !lyricWindow.isDestroyed()) {
|
||||||
stopMousePresenceTracking();
|
|
||||||
lyricWindow.webContents.send('lyric-window-close');
|
lyricWindow.webContents.send('lyric-window-close');
|
||||||
mainWin.webContents.send('lyric-control-back', 'close');
|
mainWin.webContents.send('lyric-control-back', 'close');
|
||||||
mainWin.webContents.send('lyric-window-closed');
|
mainWin.webContents.send('lyric-window-closed');
|
||||||
@@ -257,6 +285,12 @@ export const loadLyricWindow = (ipcMain: IpcMain, mainWin: BrowserWindow): void
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 渲染端同步锁定状态 → 决定主进程是否需要轮询鼠标位置
|
||||||
|
ipcMain.on('set-lyric-lock-state', (_, isLocked: boolean) => {
|
||||||
|
isLyricLocked = isLocked;
|
||||||
|
syncMousePresenceTracking();
|
||||||
|
});
|
||||||
|
|
||||||
// 处理鼠标事件
|
// 处理鼠标事件
|
||||||
ipcMain.on('mouseenter-lyric', () => {
|
ipcMain.on('mouseenter-lyric', () => {
|
||||||
if (lyricWindow && !lyricWindow.isDestroyed()) {
|
if (lyricWindow && !lyricWindow.isDestroyed()) {
|
||||||
|
|||||||
@@ -401,6 +401,8 @@ watch(
|
|||||||
// 锁定时自动关闭主题色面板
|
// 锁定时自动关闭主题色面板
|
||||||
showThemeColorPanel.value = false;
|
showThemeColorPanel.value = false;
|
||||||
}
|
}
|
||||||
|
// 通知主进程,按需启停鼠标位置轮询
|
||||||
|
windowData.electron.ipcRenderer.send('set-lyric-lock-state', newLock);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -794,6 +796,9 @@ onMounted(() => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// 同步初始锁定状态到主进程,使其按需启动鼠标位置轮询
|
||||||
|
windowData.electron.ipcRenderer.send('set-lyric-lock-state', lyricSetting.value.isLock);
|
||||||
});
|
});
|
||||||
|
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
|
|||||||
Reference in New Issue
Block a user