diff --git a/src/ui/window.rs b/src/ui/window.rs index 7b78e55..c088ff0 100644 --- a/src/ui/window.rs +++ b/src/ui/window.rs @@ -4,6 +4,7 @@ mod imp { use adw::prelude::*; use adw::subclass::prelude::*; use glib::subclass::InitializingObject; + use glib::JoinHandle; use gtk::{gdk, gio, glib}; use std::cell::{Cell, RefCell}; use std::rc::Rc; @@ -54,6 +55,9 @@ mod imp { _playlist_count: (), pub(super) queued_seek: Cell>, + + mpv_event_loop_handle: RefCell>>, // really !, not () + zbus_executor_loop_handle: RefCell>>, // same } impl Default for Window { @@ -99,6 +103,9 @@ mod imp { _playlist_count: (), queued_seek: Cell::new(None), + + mpv_event_loop_handle: Default::default(), + zbus_executor_loop_handle: Default::default(), } } } @@ -125,8 +132,9 @@ mod imp { self.parent_constructed(); let window = self.obj().downgrade(); - glib::spawn_future_local(async move { - while let Some(window) = window.upgrade() { + let mpv_event_loop_handle = glib::spawn_future_local(async move { + loop { + let window = window.upgrade().unwrap(); let listener = window.imp().mpv.wakeup_listener(); while let Some(event) = window.imp().mpv.wait_event(0.0) { use crate::mpv::Event; @@ -280,10 +288,11 @@ mod imp { listener.await; } }); + self.mpv_event_loop_handle.replace(Some(mpv_event_loop_handle)); // set up mpris let window = self.obj().clone(); - glib::spawn_future_local(async move { + let zbus_executor_loop_handle = glib::spawn_future_local(async move { let conn = zbus::connection::Builder::session() .expect("could not connect to the session bus") .internal_executor(false) @@ -291,33 +300,33 @@ mod imp { .await .expect("could not build connection to the session bus"); - // run this in glib's main loop glib::spawn_future_local(glib::clone!( #[strong] conn, async move { - loop { - conn.executor().tick().await; - } + crate::Mpris::setup(conn.object_server(), &window) + .await + .expect("could not serve mpris"); + /* + crate::mpris::Player::setup(conn.object_server(), &window.imp().playbin) + .await + .expect("could not serve mpris player"); + FIXME */ + + // always set up handlers before requesting service name + conn.request_name("org.mpris.MediaPlayer2.audrey") + .await + .expect("could not register name in session bus"); } )); - crate::Mpris::setup(conn.object_server(), &window) - .await - .expect("could not serve mpris"); - /* - crate::mpris::Player::setup(conn.object_server(), &window.imp().playbin) - .await - .expect("could not serve mpris player"); - FIXME */ - - drop(window); // don't keep this alive - - // always set up handlers before requesting service name - conn.request_name("org.mpris.MediaPlayer2.audrey") - .await - .expect("could not register name in session bus"); + // run this in glib's main loop + loop { + conn.executor().tick().await; + } }); + self.zbus_executor_loop_handle + .replace(Some(zbus_executor_loop_handle)); } } @@ -469,6 +478,9 @@ mod imp { impl Drop for Window { fn drop(&mut self) { event!(Level::DEBUG, "dropping AudreyUiWindow"); + + self.mpv_event_loop_handle.take().unwrap().abort(); + self.zbus_executor_loop_handle.take().unwrap().abort(); } } }