11import type { LyricLine } from "@applemusic-like-lyrics/lyric" ;
2- import { TASKBAR_IPC_CHANNELS , type SyncStatePayload , type SyncTickPayload } from "@shared" ;
2+ import {
3+ DEFAULT_TASKBAR_CONFIG ,
4+ TASKBAR_IPC_CHANNELS ,
5+ type SyncStatePayload ,
6+ type SyncTickPayload ,
7+ type TaskbarConfig ,
8+ } from "@shared" ;
39import { ipcMain } from "electron" ;
410import { useStore } from "../store" ;
511import { getMainTray } from "../tray" ;
@@ -88,9 +94,9 @@ const updateMacStatusBarLyric = (forceUpdate: boolean = false) => {
8894 return ;
8995 }
9096
91- // 如果歌词数据为空,则清空标题并返回
97+ // 如果歌词数据为空,则显示当前歌曲标题,避免空白
9298 if ( macLyricLines . length === 0 ) {
93- tray . setTitle ( "" ) ;
99+ tray . setTitle ( getCurrentSongTitle ( ) ) ;
94100 return ;
95101 }
96102
@@ -107,7 +113,7 @@ const updateMacStatusBarLyric = (forceUpdate: boolean = false) => {
107113 . map ( ( w ) => w . word ?? "" )
108114 . join ( "" )
109115 . trim ( )
110- : "" ;
116+ : getCurrentSongTitle ( ) ; // 处于前奏或未匹配到歌词时,显示歌曲名
111117
112118 tray . setTitle ( currentLyric ) ;
113119} ;
@@ -151,27 +157,45 @@ export const initMacStatusBarIpc = () => {
151157 }
152158 } ) ;
153159
160+ // 注册任务栏配置通用处理器,确保 macOS 也能获取和设置配置
161+ ipcMain . handle ( TASKBAR_IPC_CHANNELS . GET_OPTION , ( ) => store . get ( "taskbar" ) ) ;
162+
163+ ipcMain . on ( TASKBAR_IPC_CHANNELS . SET_OPTION , ( _event , option : Partial < TaskbarConfig > ) => {
164+ if ( ! option ) return ;
165+
166+ // 安全过滤:仅允许写入 DEFAULT_TASKBAR_CONFIG 中定义的合法键
167+ const allowedKeys = Object . keys ( DEFAULT_TASKBAR_CONFIG ) ;
168+
169+ Object . entries ( option ) . forEach ( ( [ key , value ] ) => {
170+ if ( allowedKeys . includes ( key ) ) {
171+ store . set ( `taskbar.${ key } ` , value ) ;
172+ }
173+ } ) ;
174+ // macOS 模式下不处理窗口可见性,仅同步配置
175+ } ) ;
176+
154177 ipcMain . on ( TASKBAR_IPC_CHANNELS . SYNC_STATE , ( _event , payload : SyncStatePayload ) => {
155178 switch ( payload . type ) {
156179 case "lyrics-loaded" : {
157- // 仅更新歌词数据,不立即更新状态栏显示
180+ // 更新歌词数据并立即刷新显示
158181 macLyricLines = payload . data . lines ;
159182 macLastLyricIndex = - 1 ;
183+ updateMacStatusBarLyric ( true ) ;
160184 break ;
161185 }
162186
163187 case "playback-state" :
164188 macIsPlaying = payload . data . isPlaying ;
165- // 不在这里直接更新歌词,依赖 SYNC_TICK 来驱动
189+ // 播放状态变更时,如果是播放中,等待 SYNC_TICK 或插值器驱动
190+ // 如果是暂停状态,则停止插值器并进行一次最终更新
166191 if ( ! macIsPlaying ) {
167- // 如果是暂停状态,则停止插值器并进行一次最终更新
168192 stopInterpolation ( ) ;
169- updateMacStatusBarLyric ( ) ;
193+ updateMacStatusBarLyric ( true ) ;
170194 }
171195 break ;
172196
173197 case "full-hydration" :
174- // 接收完整的状态,但歌词更新仍然依赖 SYNC_TICK
198+ // 接收完整的状态,立即同步并刷新显示
175199 if ( payload . data . lyrics ) {
176200 macLyricLines = payload . data . lyrics . lines ;
177201 macLastLyricIndex = - 1 ;
@@ -184,6 +208,11 @@ export const initMacStatusBarIpc = () => {
184208 macOffset = offset ;
185209 }
186210 }
211+ // 同步后立即刷新一次
212+ updateMacStatusBarLyric ( true ) ;
213+ if ( macIsPlaying ) {
214+ startInterpolation ( ) ;
215+ }
187216 break ;
188217 }
189218 } ) ;
0 commit comments