use crate::{bus, store};
use serde_json::{json, Value};
use std::sync::{Mutex, OnceLock};
use std::time::Duration;
fn last() -> &'static Mutex<(String, Value)> {
static L: OnceLock<Mutex<(String, Value)>> = OnceLock::new();
L.get_or_init(|| Mutex::new((String::new(), Value::Null)))
}
pub fn note_scheme(s: &str) {
last().lock().unwrap().0 = s.to_string();
}
pub fn note_ui(ui: &Value) {
last().lock().unwrap().1 = ui.clone();
}
pub fn ensure_started() {
static STARTED: OnceLock<()> = OnceLock::new();
if STARTED.set(()).is_err() {
return; }
let d = store::theme_dir();
{
let mut l = last().lock().unwrap();
l.0 = store::current_scheme(&d);
l.1 = store::current_ui(&d);
}
std::thread::spawn(|| loop {
std::thread::sleep(Duration::from_millis(700));
let d = store::theme_dir();
let scheme = store::current_scheme(&d);
let ui = store::current_ui(&d);
let (pub_scheme, pub_ui) = {
let mut l = last().lock().unwrap();
let ps = l.0 != scheme;
if ps {
l.0 = scheme.clone();
}
let pu = l.1 != ui;
if pu {
l.1 = ui.clone();
}
(ps, pu)
};
if pub_scheme {
bus::publish("scheme", &json!({ "scheme": scheme }));
}
if pub_ui {
bus::publish("ui", &ui);
}
});
}