Skip to content

Commit 0e08873

Browse files
committed
terminal title display song name
1 parent d375b70 commit 0e08873

File tree

1 file changed

+33
-3
lines changed

1 file changed

+33
-3
lines changed

src/main.rs

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use std::{
88
use 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
};
1313
use rand::prelude::*;
1414
use ratatui::{
@@ -48,6 +48,19 @@ struct Player {
4848
}
4949

5050
impl 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

Comments
 (0)