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); }); }