use serde::Serialize;
use std::path::PathBuf;
const WAYBAR_REFRESH_SIGNAL: i32 = 45;
#[derive(Serialize)]
struct WaybarStatus {
text: String,
tooltip: String,
alt: String,
class: String,
}
fn status_path() -> PathBuf {
std::env::var("XDG_RUNTIME_DIR")
.map(PathBuf::from)
.unwrap_or_else(|_| PathBuf::from("/tmp"))
.join("mac-notifications-status.json")
}
pub fn update_status(unread: usize, dnd: bool) {
let status = if dnd {
WaybarStatus {
text: "\u{f06d9}".into(), tooltip: "Do Not Disturb".into(),
alt: "dnd".into(),
class: "dnd".into(),
}
} else if unread > 0 {
WaybarStatus {
text: format!("\u{f009a} {unread}"), tooltip: format!(
"{unread} unread notification{}",
if unread == 1 { "" } else { "s" }
),
alt: "unread".into(),
class: "unread".into(),
}
} else {
WaybarStatus {
text: "\u{f009c}".into(), tooltip: "No notifications".into(),
alt: "empty".into(),
class: "empty".into(),
}
};
let path = status_path();
match serde_json::to_string(&status) {
Ok(json) => {
if let Err(e) = std::fs::write(&path, json) {
log::error!("Failed to write waybar status: {}", e);
}
}
Err(e) => log::error!("Failed to serialize waybar status: {}", e),
}
signal_waybar();
}
fn signal_waybar() {
match std::process::Command::new("pkill")
.arg(format!("-{WAYBAR_REFRESH_SIGNAL}"))
.arg("waybar")
.status()
{
Err(e) => log::debug!("Failed to signal waybar: {e}"),
Ok(s) if !s.success() => log::debug!("No waybar process to signal"),
_ => {}
}
}