#![windows_subsystem = "windows"] use std::sync::{atomic::AtomicI32, Arc}; use alcro::{Content, UIBuilder, UI}; use anyhow::Context; use serde_json::to_value; fn new_window() -> anyhow::Result> { let ui = Arc::new( UIBuilder::new() .content(Content::Html(include_str!("./multiple-windows.html"))) .run() .context("Failed to create new window")?, ); Ok(ui) } fn main() -> anyhow::Result<()> { let count = Arc::new(AtomicI32::new(0)); let ui1 = new_window()?; let ui2 = new_window()?; ui1.bind("increment", { let count = count.clone(); let ui2 = Arc::downgrade(&ui2); move |_| { let c = count.fetch_add(1, std::sync::atomic::Ordering::Relaxed); ui2.upgrade().unwrap().eval(&format!( "document.getElementById('count').innerText='Count: {}'", c + 1 ))?; Ok(to_value(c + 1).unwrap()) } })?; ui1.bind("decrement", { let count = count.clone(); let ui2 = Arc::downgrade(&ui2); move |_| { let c = count.fetch_sub(1, std::sync::atomic::Ordering::Relaxed); ui2.upgrade().unwrap().eval(&format!( "document.getElementById('count').innerText='Count: {}'", c - 1 ))?; Ok(to_value(c - 1).unwrap()) } })?; ui2.bind("increment", { let count = count.clone(); let ui1 = Arc::downgrade(&ui1); move |_| { let c = count.fetch_add(1, std::sync::atomic::Ordering::Relaxed); ui1.upgrade().unwrap().eval(&format!( "document.getElementById('count').innerText='Count: {}'", c + 1 ))?; Ok(to_value(c + 1).unwrap()) } })?; ui2.bind("decrement", { let count = count.clone(); let ui1 = Arc::downgrade(&ui1); move |_| { let c = count.fetch_sub(1, std::sync::atomic::Ordering::Relaxed); ui1.upgrade().unwrap().eval(&format!( "document.getElementById('count').innerText='Count: {}'", c - 1 ))?; Ok(to_value(c - 1).unwrap()) } })?; ui1.wait_finish(); ui2.wait_finish(); Ok(()) }