From 86d9fe73f0fd5fd7ec601bd2ffe4b64127347ffe Mon Sep 17 00:00:00 2001 From: Alexander Bantyev Date: Sun, 25 Oct 2020 00:42:06 +0300 Subject: [PATCH] Switch to notify-rust, enable dismiss check --- Cargo.lock | 362 +++++++++++++++++++++++++++++------------ battery/src/main.rs | 6 +- bluetooth/src/main.rs | 2 +- brightness/src/main.rs | 2 +- common/Cargo.toml | 3 +- common/src/lib.rs | 95 +++++++---- flake.lock | 6 +- mpris/src/main.rs | 27 ++- pulseaudio/src/main.rs | 2 +- 9 files changed, 354 insertions(+), 151 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0c07c9c..74f9d0f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15,6 +15,18 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + [[package]] name = "autocfg" version = "1.0.1" @@ -41,6 +53,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + [[package]] name = "battery" version = "0.7.6" @@ -59,9 +77,26 @@ dependencies = [ [[package]] name = "bitflags" -version = "1.2.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +checksum = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5" + +[[package]] +name = "blake2b_simd" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" [[package]] name = "blurz" @@ -73,18 +108,43 @@ dependencies = [ "hex", ] +[[package]] +name = "cc" +version = "1.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed67cbde08356238e75fc4656be4749481eeffb09e19f320a25237d5221c985d" + [[package]] name = "cfg-if" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits", + "time", + "winapi", +] + [[package]] name = "configparser" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe1d7dcda7d1da79e444bdfba1465f2f849a58b07774e1df473ee77030cb47a7" +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + [[package]] name = "core-foundation" version = "0.7.0" @@ -101,6 +161,17 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" +[[package]] +name = "crossbeam-utils" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" +dependencies = [ + "autocfg", + "cfg-if", + "lazy_static", +] + [[package]] name = "darling" version = "0.5.0" @@ -165,6 +236,17 @@ dependencies = [ "syn 0.11.11", ] +[[package]] +name = "dirs" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + [[package]] name = "enum-kinds" version = "0.4.1" @@ -225,30 +307,14 @@ dependencies = [ ] [[package]] -name = "gdk-pixbuf" -version = "0.3.0" +name = "getrandom" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16160d212ae91abe9f3324c3fb233929ba322dde63585d15cda3336f8c529ed1" +checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6" dependencies = [ - "gdk-pixbuf-sys", - "glib", - "glib-sys", - "gobject-sys", + "cfg-if", "libc", -] - -[[package]] -name = "gdk-pixbuf-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "798f97101eea8180da363d0e80e07ec7ec6d1809306601c0100c1de5bc8b4f52" -dependencies = [ - "bitflags", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pkg-config", + "wasi 0.9.0+wasi-snapshot-preview1", ] [[package]] @@ -257,55 +323,6 @@ version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" -[[package]] -name = "gio-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a303bbf7a5e75ab3b627117ff10e495d1b9e97e1d68966285ac2b1f6270091bc" -dependencies = [ - "bitflags", - "glib-sys", - "gobject-sys", - "libc", - "pkg-config", -] - -[[package]] -name = "glib" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b0452824cc63066940f01adc721804919f0b76cdba3cfab977b00b87f16d4a" -dependencies = [ - "bitflags", - "glib-sys", - "gobject-sys", - "lazy_static", - "libc", -] - -[[package]] -name = "glib-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9693049613ff52b93013cc3d2590366d8e530366d288438724b73f6c7dc4be8" -dependencies = [ - "bitflags", - "libc", - "pkg-config", -] - -[[package]] -name = "gobject-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60d507c87a71b1143c66ed21a969be9b99a76df234b342d733e787e6c9c7d7c2" -dependencies = [ - "bitflags", - "glib-sys", - "libc", - "pkg-config", -] - [[package]] name = "heck" version = "0.3.1" @@ -354,34 +371,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "libnotify" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10506a4f8bc6f8f7ccc6fde3a8290378d7aed3d1a26dca606a73e2ffe140cc2d" -dependencies = [ - "gdk-pixbuf", - "gdk-pixbuf-sys", - "glib", - "glib-sys", - "gobject-sys", - "libnotify-sys", -] - -[[package]] -name = "libnotify-sys" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0a716b9b7d24ed10f1eb431e1527fa13c9a4bf2d4fa68bb3e54da1d0747383c" -dependencies = [ - "bitflags", - "gdk-pixbuf-sys", - "glib-sys", - "gobject-sys", - "libc", - "pkg-config", -] - [[package]] name = "libpulse-binding" version = "2.16.2" @@ -404,6 +393,18 @@ dependencies = [ "winapi", ] +[[package]] +name = "mac-notification-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb6b71a9a89cd38b395d994214297447e8e63b1ba5708a9a2b0b1048ceda76" +dependencies = [ + "cc", + "chrono", + "dirs", + "objc-foundation", +] + [[package]] name = "mach" version = "0.3.2" @@ -413,6 +414,15 @@ dependencies = [ "libc", ] +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + [[package]] name = "miniz_oxide" version = "0.4.2" @@ -437,6 +447,27 @@ dependencies = [ "from_variants", ] +[[package]] +name = "notify-rust" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "144acee6a0543dc74893e4b8a33936b5b0a94cc2d4ab024afd0c6daff7afc3c0" +dependencies = [ + "dbus 0.8.4", + "mac-notification-sys", + "winrt-notification", +] + +[[package]] +name = "num-integer" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d59457e662d541ba17869cf51cf177c0b5f0cbf476c66bdc90bf1edac4f875b" +dependencies = [ + "autocfg", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.12" @@ -446,6 +477,35 @@ dependencies = [ "autocfg", ] +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + [[package]] name = "object" version = "0.20.0" @@ -518,6 +578,35 @@ dependencies = [ "proc-macro2 1.0.21", ] +[[package]] +name = "redox_syscall" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" + +[[package]] +name = "redox_users" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" +dependencies = [ + "getrandom", + "redox_syscall", + "rust-argon2", +] + +[[package]] +name = "rust-argon2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dab61250775933275e84053ac235621dfb739556d5c54a2f2e9313b7cf43a19" +dependencies = [ + "base64", + "blake2b_simd", + "constant_time_eq", + "crossbeam-utils", +] + [[package]] name = "rustc-demangle" version = "0.1.16" @@ -553,7 +642,8 @@ name = "simple-osd-common" version = "0.1.0" dependencies = [ "configparser", - "libnotify", + "dbus 0.8.4", + "notify-rust", "xdg", ] @@ -574,6 +664,22 @@ dependencies = [ "simple-osd-common", ] +[[package]] +name = "strum" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca6e4730f517e041e547ffe23d29daab8de6b73af4b6ae2a002108169f5e7da" + +[[package]] +name = "strum_macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3384590878eb0cab3b128e844412e2d010821e7e091211b9d87324173ada7db8" +dependencies = [ + "quote 0.3.15", + "syn 0.11.11", +] + [[package]] name = "syn" version = "0.11.11" @@ -639,6 +745,17 @@ dependencies = [ "unicode-xid 0.2.1", ] +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi", +] + [[package]] name = "typenum" version = "1.12.0" @@ -679,6 +796,18 @@ dependencies = [ "typenum", ] +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + [[package]] name = "winapi" version = "0.3.9" @@ -701,8 +830,39 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "winrt" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e30cba82e22b083dc5a422c2ee77e20dc7927271a0dc981360c57c1453cb48d" +dependencies = [ + "winapi", +] + +[[package]] +name = "winrt-notification" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c31a65da50d792c6f9bd2e3216249566c4fb1d2d34f9b7d2d66d2e93f62a242" +dependencies = [ + "strum", + "strum_macros", + "winapi", + "winrt", + "xml-rs", +] + [[package]] name = "xdg" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d089681aa106a86fade1b0128fb5daf07d5867a509ab036d99988dec80429a57" + +[[package]] +name = "xml-rs" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1945e12e16b951721d7976520b0832496ef79c31602c7a29d950de79ba74621" +dependencies = [ + "bitflags", +] diff --git a/battery/src/main.rs b/battery/src/main.rs index 551ec17..8afe7ab 100644 --- a/battery/src/main.rs +++ b/battery/src/main.rs @@ -208,14 +208,14 @@ fn main() -> battery::Result<()> { battery.time_to_full().map(|ttf| { osd.title = Some(format!("Charging, {} until full", format_duration(ttf.value))); osd.urgency = Urgency::Low; - osd.update(); + osd.update().unwrap(); }); } State::Low => { battery.time_to_empty().map(|tte| { osd.title = Some(format!("Low battery, {} remaining", format_duration(tte.value))); osd.urgency = Urgency::Normal; - osd.update(); + osd.update().unwrap(); }); }, State::Normal | State::Critical => { } @@ -226,7 +226,7 @@ fn main() -> battery::Result<()> { battery.time_to_empty().map(|tte| { osd.title = Some(format!("Critically low battery, {} remaining", format_duration(tte.value))); osd.urgency = Urgency::Critical; - osd.update(); + osd.update().unwrap(); }); } diff --git a/bluetooth/src/main.rs b/bluetooth/src/main.rs index cb4761e..b46249d 100644 --- a/bluetooth/src/main.rs +++ b/bluetooth/src/main.rs @@ -36,7 +36,7 @@ fn main() { if device_name != last_device_name { osd.title = Some(format!("Bluetooth: connected to {}", device_name)); - osd.update(); + osd.update().unwrap(); } last_device_name = device_name; diff --git a/brightness/src/main.rs b/brightness/src/main.rs index 5ecb983..d82b878 100644 --- a/brightness/src/main.rs +++ b/brightness/src/main.rs @@ -30,7 +30,7 @@ fn main() { if b != last_b { osd.contents = OSDContents::Progress(b/m, OSDProgressText::Percentage); - osd.update(); + osd.update().unwrap(); } last_b = b; diff --git a/common/Cargo.toml b/common/Cargo.toml index d371cf6..f11fe26 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -7,6 +7,7 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -libnotify = "1.0.3" +notify-rust = "4" configparser = "1.0.0" xdg = "2.1" +dbus = "0.8.4" \ No newline at end of file diff --git a/common/src/lib.rs b/common/src/lib.rs index 5bdc92f..76e4531 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -1,9 +1,10 @@ // This is free and unencumbered software released into the public domain. // balsoft 2020 -extern crate libnotify; +extern crate notify_rust; extern crate xdg; extern crate configparser; +extern crate dbus; pub static APPNAME: &str = "simple-osd"; @@ -83,18 +84,13 @@ pub mod config { } } pub mod notify { - use libnotify::Notification; - pub use libnotify::Urgency; + use notify_rust::{Notification, NotificationHandle}; + use dbus::ffidisp::{Connection, BusType}; + use std::thread; + pub use notify_rust::Urgency; use crate::config::Config; use std::default::Default; - fn init_if_not_already() { - if ! libnotify::is_initted() { - println!("Initializing libnotify"); - libnotify::init(crate::APPNAME).unwrap() - } - } - pub enum OSDProgressText { Percentage, Text(Option) @@ -111,6 +107,12 @@ pub mod notify { } } + struct CustomHandle { + pub id: u32, + pub connection: Connection, + pub notification: Notification + } + pub struct OSD { pub title: Option, @@ -132,13 +134,12 @@ pub mod notify { end: String, // Internal notification - notification: Notification + notification: Notification, + id: Option } impl OSD { pub fn new() -> OSD { - init_if_not_already(); - let mut config = Config::new("common"); let timeout = config.get("notification", "default timeout").unwrap_or(-1); // -1 means the default timeout of the notification server @@ -151,20 +152,35 @@ pub mod notify { let start = config.get_default("progressbar", "start", String::new()); let end = config.get_default("progressbar", "end", String::new()); - let notification = Notification::new("", None, None); + let notification = Notification::new(); return OSD { title: None, icon: None, contents: OSDContents::default(), - urgency: Urgency::Normal, + urgency: Urgency::Normal, id: None, timeout, length, full, empty, start, end, notification }; } - fn get_full_text(&self) -> Option { - match &self.contents { + fn construct_fake_handle(id: u32, notification: Notification) -> NotificationHandle { + let h = CustomHandle + { id: id, + connection: Connection::get_private(BusType::Session).unwrap(), + notification: notification }; + unsafe { + let handle : NotificationHandle = std::mem::transmute(h); + return handle; + } + } + + fn fake_handle(&mut self) -> NotificationHandle { + Self::construct_fake_handle(self.id.unwrap_or(0), self.notification.clone()) + } + + pub fn update(&mut self) -> Result<(), String> { + let text = match &self.contents { OSDContents::Simple(text) => text.clone(), OSDContents::Progress(value, text) => { let mut s = String::new(); @@ -197,28 +213,37 @@ pub mod notify { Some(s) } + }; + + self.id.map(|i| self.notification.id(i)); + let handle = self.notification + .summary(self.title.as_deref().unwrap_or("")) + .body(&text.unwrap_or("".to_string())) + .icon(self.icon.as_deref().unwrap_or("")) + .urgency(self.urgency) + .finalize() + .show() + .or(Err("Failed to show the notification"))?; + self.id = Some(handle.id()); + Ok(()) + } + + + pub fn on_close(&mut self, callback: F) where F: std::ops::FnOnce() + Send { + if let Some(id) = self.id { + let notification = self.notification.clone(); + + thread::spawn(move || { + let fake_handle = Self::construct_fake_handle(id, notification); + fake_handle.on_close(callback); + }); + } else { + callback(); } } - fn try_update(&mut self) -> Result<(), String> { - self.notification.update(self.title.as_deref().unwrap_or(""), self.get_full_text().as_deref(), self.icon.as_deref()).unwrap(); - self.notification.set_urgency(self.urgency); - self.notification.show().or(Err("Failed to show the notification".to_string())) - } - - pub fn update(&mut self) { - // The notification server may restart, and in that case the notification becomes invalid; - // We need to handle that situation. - self.try_update().unwrap_or_else(|_| { - libnotify::uninit(); - init_if_not_already(); - self.notification = Notification::new("", None, None); - self.try_update().unwrap(); - }); - } - pub fn close(&mut self) { - self.notification.close().unwrap_or_else(|_| { eprintln!("Failed to close the notification"); }); + self.fake_handle().close(); } } } diff --git a/flake.lock b/flake.lock index cac6035..356d5b0 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ "crates-io-index": { "flake": false, "locked": { - "lastModified": 1600641984, - "narHash": "sha256-u2juQ6LmitgAlj/lztMhjw6i0dIFEUdyVfYYIABWw90=", + "lastModified": 1603572719, + "narHash": "sha256-58j3Y9P4Rsa2rrY/tc7DqXQeI93NPzDedDq4RChkGMY=", "owner": "rust-lang", "repo": "crates.io-index", - "rev": "6adca9dd72305e56efc0bd516b6324d2542f71d1", + "rev": "e7aefc38a0eb2633731c0f78d493f2c040ec3011", "type": "github" }, "original": { diff --git a/mpris/src/main.rs b/mpris/src/main.rs index d763529..3461458 100644 --- a/mpris/src/main.rs +++ b/mpris/src/main.rs @@ -2,6 +2,7 @@ pub extern crate simple_osd_common as osd; pub extern crate mpris; pub use std::sync::{Arc, Mutex}; +use std::sync::atomic::{AtomicBool, Ordering}; use std::ops::{Deref}; @@ -97,11 +98,12 @@ mod volume_changes { pub(super) struct VolumeMonitor { mainloop: Arc>, + #[allow(dead_code)] context: Arc> } impl VolumeMonitor { - pub fn new(config: Arc>, trigger: Arc>) -> VolumeMonitor { + pub fn new(config: Arc>, trigger: Arc>, dismissed: Arc>) -> VolumeMonitor { let mainloop = Arc::new(Mutex::new (Mainloop::new().expect("Failed to create mainloop"))); @@ -143,6 +145,7 @@ mod volume_changes { let subscribe_callback = move |facility, operation, _index| { if facility == Some(Facility::Sink) && operation == Some(Operation::Changed) { *trigger.lock().unwrap() = SystemTime::now(); + dismissed.lock().unwrap().store(false, Ordering::Relaxed); } }; @@ -165,6 +168,8 @@ mod volume_changes { fn main() { let config = Arc::new(Mutex::new(Config::new("mpris"))); let mut osd = OSD::new(); + let mut waiting_on_close = false; + let dismissed = Arc::new(Mutex::new(AtomicBool::new(false))); let player = PlayerFinder::new().unwrap().find_active().unwrap(); @@ -177,7 +182,7 @@ fn main() { #[cfg(feature = "display_on_volume_changes")] let vc = if update_on_volume_change { - Some(volume_changes::VolumeMonitor::new(config.clone(), trigger.clone())) + Some(volume_changes::VolumeMonitor::new(config.clone(), trigger.clone(), dismissed.clone())) } else { None }; drop(update_on_volume_change); @@ -196,11 +201,12 @@ fn main() { if title != old_title || playback_status != old_playback_status { *trigger.lock().unwrap() = SystemTime::now(); + dismissed.lock().unwrap().store(false, Ordering::Relaxed); } let elapsed = trigger.lock().unwrap().elapsed().unwrap_or(Duration::from_secs(timeout + 1)); - if elapsed.as_secs() < timeout && playback_status != PlaybackStatus::Stopped { + if elapsed.as_secs() < timeout && playback_status != PlaybackStatus::Stopped && ! dismissed.lock().unwrap().load(Ordering::Relaxed) { let metadata = progress.metadata(); let artists = metadata.artists().and_then(|artists| format_artists(artists)).unwrap_or("Unknown".to_string()); let position = progress.position(); @@ -216,8 +222,19 @@ fn main() { PlaybackStatus::Paused => Some("media-playback-pause".to_string()), _ => None }; - osd.update(); - } else { osd.close() } + osd.update().unwrap(); + if ! waiting_on_close { + waiting_on_close = true; + let dismissed_clone = dismissed.clone(); + osd.on_close(move || { + dismissed_clone.lock().unwrap().store(true, Ordering::Relaxed); + }); + } + } else { + waiting_on_close = false; + osd.close() + } + old_title = title; old_playback_status = playback_status; diff --git a/pulseaudio/src/main.rs b/pulseaudio/src/main.rs index c813a39..fdf68c3 100644 --- a/pulseaudio/src/main.rs +++ b/pulseaudio/src/main.rs @@ -67,7 +67,7 @@ fn main() { let muted_message = if i.mute { " [MUTED]" } else { "" }; osd.borrow_mut().title = Some(format!("Volume on {}{}", sink_name, muted_message)); osd.borrow_mut().contents = OSDContents::Progress(volume.0 as f32 / 65536., OSDProgressText::Percentage); - osd.borrow_mut().update(); + osd.borrow_mut().update().unwrap(); } };