@@ -8,7 +8,7 @@ use std::{
88use crossterm:: {
99 event:: { self , Event , KeyCode , KeyEvent , KeyModifiers } ,
1010 execute,
11- terminal:: { EnterAlternateScreen , LeaveAlternateScreen , disable_raw_mode, enable_raw_mode} ,
11+ terminal:: { EnterAlternateScreen , LeaveAlternateScreen , disable_raw_mode, enable_raw_mode, SetTitle } ,
1212} ;
1313use rand:: prelude:: * ;
1414use ratatui:: {
@@ -48,6 +48,19 @@ struct Player {
4848}
4949
5050impl Player {
51+ fn update_terminal_title ( & self ) {
52+ if self . songs . is_empty ( ) {
53+ return ;
54+ }
55+
56+ let title = if self . is_playing {
57+ format ! ( "MUSIX - ♪ {}" , self . songs[ self . current_index] . name)
58+ } else {
59+ format ! ( "MUSIX - {} (Paused)" , self . songs[ self . current_index] . name)
60+ } ;
61+
62+ let _ = execute ! ( io:: stdout( ) , SetTitle ( & title) ) ;
63+ }
5164 fn new ( ) -> Result < Self , Box < dyn std:: error:: Error > > {
5265 let songs = load_mp3_files ( ) ?;
5366 if songs. is_empty ( ) {
@@ -83,7 +96,7 @@ impl Player {
8396 }
8497 } ;
8598
86- Ok ( Player {
99+ let player = Player {
87100 songs,
88101 current_index : 0 ,
89102 selected_index : 0 ,
@@ -98,7 +111,16 @@ impl Player {
98111 song_duration : None ,
99112 seek_offset : Duration :: from_secs ( 0 ) ,
100113 show_controls_popup : false ,
101- } )
114+ } ;
115+
116+ // Set initial terminal title
117+ if !player. songs . is_empty ( ) {
118+ let _ = execute ! ( io:: stdout( ) , SetTitle ( & format!( "MUSIX - {}" , player. songs[ 0 ] . name) ) ) ;
119+ } else {
120+ let _ = execute ! ( io:: stdout( ) , SetTitle ( "MUSIX" ) ) ;
121+ }
122+
123+ Ok ( player)
102124 }
103125
104126 fn play_song ( & mut self , index : usize ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
@@ -134,6 +156,7 @@ impl Player {
134156 self . is_playing = true ;
135157 self . playback_start = Some ( Instant :: now ( ) ) ;
136158 self . song_duration = total_duration;
159+ self . update_terminal_title ( ) ;
137160 }
138161 Err ( e) => {
139162 eprintln ! ( "Warning: Could not decode audio file '{}': {e}" , song. name) ;
@@ -170,8 +193,10 @@ impl Player {
170193 // If selected song is the same as current playing song, toggle play/pause
171194 if self . is_playing {
172195 self . pause_playback ( ) ;
196+ self . update_terminal_title ( ) ;
173197 } else {
174198 self . resume_playback ( ) ;
199+ self . update_terminal_title ( ) ;
175200 }
176201 }
177202 Ok ( ( ) )
@@ -266,6 +291,7 @@ impl Player {
266291 }
267292 self . is_playing = false ;
268293 self . playback_start = None ;
294+ self . update_terminal_title ( ) ;
269295 }
270296 }
271297
@@ -276,6 +302,7 @@ impl Player {
276302 sink. play ( ) ;
277303 self . is_playing = true ;
278304 self . playback_start = Some ( Instant :: now ( ) ) ;
305+ self . update_terminal_title ( ) ;
279306 }
280307 }
281308 }
@@ -602,6 +629,9 @@ fn run_player() -> Result<(), Box<dyn std::error::Error>> {
602629 disable_raw_mode ( ) ?;
603630 execute ! ( terminal. backend_mut( ) , LeaveAlternateScreen ) ?;
604631 terminal. show_cursor ( ) ?;
632+
633+ // Reset terminal title
634+ let _ = execute ! ( io:: stdout( ) , SetTitle ( "Terminal" ) ) ;
605635
606636 result
607637}
0 commit comments