From 932436d47af1c73b6d5781dedec84bd82bfe7ff4 Mon Sep 17 00:00:00 2001 From: salmonik Date: Wed, 6 May 2026 13:20:02 +0200 Subject: Add toggle command to resume/pause playback and fix queue display bug - Add 'rsp toggle' command to toggle between play and pause - Fix queue display showing wrong track as playing when shuffle is enabled - Update shell completion scripts for new toggle command --- completions/rsp.bash | 2 +- completions/rsp.fish | 2 +- completions/rsp.zsh | 2 +- src/cli.rs | 5 +++++ src/daemon.rs | 15 ++++++++++++++- 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/completions/rsp.bash b/completions/rsp.bash index 55a25b0..b625927 100644 --- a/completions/rsp.bash +++ b/completions/rsp.bash @@ -6,7 +6,7 @@ _rsp() { case $prev in rsp) - COMPREPLY=($(compgen -W "start stop restart play pause resume next previous volume shuffle queue status scan settings" -- "$cur")) + COMPREPLY=($(compgen -W "start stop restart play pause resume toggle next previous volume shuffle queue status scan settings" -- "$cur")) ;; play) _filedir diff --git a/completions/rsp.fish b/completions/rsp.fish index 1fd7483..4f44f63 100644 --- a/completions/rsp.fish +++ b/completions/rsp.fish @@ -1,6 +1,6 @@ # rsp fish completion -complete -c rsp -n '__fish_use_subcommand' -a 'start stop restart play pause resume next previous volume shuffle queue status scan settings' -d 'Command' +complete -c rsp -n '__fish_use_subcommand' -a 'start stop restart play pause resume toggle next previous volume shuffle queue status scan settings' -d 'Command' complete -c rsp -n '__fish_seen_subcommand_from play' -f -d 'Audio file or directory' diff --git a/completions/rsp.zsh b/completions/rsp.zsh index c07feb1..cfba4e5 100644 --- a/completions/rsp.zsh +++ b/completions/rsp.zsh @@ -8,7 +8,7 @@ _rsp() { case $state in cmd) _values 'command' \ - 'start' 'stop' 'restart' 'play' 'pause' 'resume' 'next' 'previous' \ + 'start' 'stop' 'restart' 'play' 'pause' 'resume' 'toggle' 'next' 'previous' \ 'volume' 'shuffle' 'queue' 'status' 'scan' 'settings' ;; args) diff --git a/src/cli.rs b/src/cli.rs index a18b8f1..0da3078 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -37,6 +37,8 @@ pub enum Commands { Pause, /// Resume playback Resume, + /// Toggle play/pause + Toggle, /// Stop playback StopPlayback, /// Skip to next track @@ -133,6 +135,9 @@ impl Cli { Commands::Resume => { crate::daemon::send_command("resume".to_string())?; } + Commands::Toggle => { + crate::daemon::send_command("toggle".to_string())?; + } Commands::StopPlayback => { crate::daemon::send_command("stop".to_string())?; } diff --git a/src/daemon.rs b/src/daemon.rs index dab0e5a..3379c7b 100644 --- a/src/daemon.rs +++ b/src/daemon.rs @@ -475,6 +475,15 @@ fn process_command( audio.resume(); "Resumed\n".to_string() } + "toggle" => { + if audio.is_playing() { + audio.pause(); + "Paused\n".to_string() + } else { + audio.resume(); + "Resumed\n".to_string() + } + } "stop" => { audio.stop(); // Clear queue on stop @@ -685,6 +694,10 @@ fn process_command( } else { let mut output = String::new(); let current_position = q.position; + let playing_track_idx = match q.shuffle { + ShuffleMode::None => current_position, + _ => *q.shuffled_indices.get(current_position).unwrap_or(&0), + }; // Use shuffled_indices for display order if shuffle is on let indices: Vec = if let ShuffleMode::None = q.shuffle { (0..q.tracks.len()).collect() @@ -694,7 +707,7 @@ fn process_command( for (display_idx, &track_idx) in indices.iter().enumerate() { if let Some(track) = q.tracks.get(track_idx) { let track_str = track.display_string(display_idx); - if track_idx == current_position { + if track_idx == playing_track_idx { output.push_str(&format!("> {} (playing)\n", track_str)); } else { output.push_str(&format!(" {}\n", track_str)); -- cgit v1.2.3