From 9baed7ae986b773d419491171a4f9f7d6b90974d Mon Sep 17 00:00:00 2001 From: Bettehem Date: Sat, 14 Nov 2020 22:50:13 +0200 Subject: [PATCH] Added possibility to turn on/off shuffle using MPRIS (#318) * Added possibility to turn shuffle on/off via MPRIS * Simplified code to use unwrap_or instead of a match. Changed the default value to be retrieved from spotify. * only set shuffle setting if parameter was passed * fix: fetch shuffle state with every MPRIS query And not just once during DBus/MPRIS setup. Also, redraw UI when shuffle state has changed. Co-authored-by: Henrik Friedrichsen --- src/main.rs | 6 +++++- src/mpris.rs | 27 +++++++++++++++++++++------ 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/main.rs b/src/main.rs index 6378693..6b378ab 100644 --- a/src/main.rs +++ b/src/main.rs @@ -228,7 +228,11 @@ fn main() { let queue = Arc::new(queue::Queue::new(spotify.clone(), cfg.clone())); #[cfg(feature = "mpris")] - let mpris_manager = Arc::new(mpris::MprisManager::new(spotify.clone(), queue.clone())); + let mpris_manager = Arc::new(mpris::MprisManager::new( + event_manager.clone(), + spotify.clone(), + queue.clone(), + )); let library = Arc::new(Library::new(&event_manager, spotify.clone(), cfg.clone())); diff --git a/src/mpris.rs b/src/mpris.rs index 576a13b..a1ba5d9 100644 --- a/src/mpris.rs +++ b/src/mpris.rs @@ -14,6 +14,7 @@ use dbus_tree::{Access, Factory}; use crate::album::Album; use crate::episode::Episode; +use crate::events::EventManager; use crate::playable::Playable; use crate::playlist::Playlist; use crate::queue::{Queue, RepeatSetting}; @@ -127,7 +128,12 @@ fn get_metadata(playable: Option) -> Metadata { hm } -fn run_dbus_server(spotify: Arc, queue: Arc, rx: mpsc::Receiver) { +fn run_dbus_server( + ev: EventManager, + spotify: Arc, + queue: Arc, + rx: mpsc::Receiver, +) { let conn = Rc::new( dbus::ffidisp::Connection::get_private(dbus::ffidisp::BusType::Session) .expect("Failed to connect to dbus"), @@ -339,11 +345,20 @@ fn run_dbus_server(spotify: Arc, queue: Arc, rx: mpsc::Receiver< }); let property_shuffle = { - let queue = queue.clone(); + let queue_get = queue.clone(); + let queue_set = queue.clone(); f.property::("Shuffle", ()) - .access(Access::Read) + .access(Access::ReadWrite) .on_get(move |iter, _| { - iter.append(queue.get_shuffle()); + let current_state = queue_get.get_shuffle(); + iter.append(current_state); + Ok(()) + }) + .on_set(move |iter, _| { + if let Some(shuffle_state) = iter.get() { + queue_set.set_shuffle(shuffle_state); + } + ev.trigger(); Ok(()) }) }; @@ -649,14 +664,14 @@ pub struct MprisManager { } impl MprisManager { - pub fn new(spotify: Arc, queue: Arc) -> Self { + pub fn new(ev: EventManager, spotify: Arc, queue: Arc) -> Self { let (tx, rx) = mpsc::channel::(); { let spotify = spotify.clone(); let queue = queue.clone(); std::thread::spawn(move || { - run_dbus_server(spotify.clone(), queue.clone(), rx); + run_dbus_server(ev, spotify.clone(), queue.clone(), rx); }); }