use std::pin::pin; use tokio::signal::ctrl_c; use winctx::icon::StockIcon; use winctx::{CreateWindow, Event}; const ICON: &[u8] = include_bytes!("tokio.ico"); #[tokio::main] async fn main() -> winctx::Result<()> { let mut has_tooltip = true; let mut is_checked = true; let mut is_highlighted = true; let mut window = CreateWindow::new("se.tedro.Example").window_name("Example Application"); let initial_icon = window.icons().insert_buffer(ICON, 22, 22); let area = window.new_area().icon(initial_icon); if has_tooltip { area.tooltip("Example Application"); } let menu = area.popup_menu(); let title = menu.push_entry("Hello World").id(); menu.push_entry("Show notification"); menu.push_entry("Show multiple notifications"); menu.push_entry("Toggle tooltip").checked(has_tooltip); menu.push_entry("Toggle checked").checked(is_checked); menu.push_entry("Toggle highlighted") .checked(is_highlighted) .highlight(is_highlighted); menu.push_separator(); let quit = menu.push_entry("Quit").id(); menu.set_default(title); let area_id = area.id(); let (sender, mut event_loop) = window.build().await?; let mut ctrl_c = pin!(ctrl_c()); let mut shutdown = false; loop { let event = tokio::select! { _ = ctrl_c.as_mut(), if !shutdown => { sender.shutdown(); shutdown = true; continue; } event = event_loop.tick() => { event? } }; match event { Event::IconClicked { area_id, event, .. } => { println!("Icon clicked: {area_id:?}: {event:?}"); } Event::MenuItemClicked { item_id, .. } => { println!("Menu entry clicked: {item_id:?}"); match item_id { winctx::item_id!(0, 1) => { sender .notification(area_id) .title("This is a title") .message("This is a body") .large_icon() .stock_icon(StockIcon::AUDIOFILES) .icon_link_overlay() .send(); } winctx::item_id!(0, 2) => { sender.notification(area_id).message("First").send(); sender.notification(area_id).message("Second").send(); } winctx::item_id!(0, 3) => { if has_tooltip { sender.modify_area(area_id).tooltip("").send(); } else { sender .modify_area(area_id) .tooltip("This is a tooltip!") .send(); } has_tooltip = !has_tooltip; sender.modify_menu_item(item_id).checked(has_tooltip).send(); } winctx::item_id!(0, 4) => { is_checked = !is_checked; sender.modify_menu_item(item_id).checked(is_checked).send(); } winctx::item_id!(0, 5) => { is_highlighted = !is_highlighted; sender .modify_menu_item(item_id) .checked(is_highlighted) .highlight(is_highlighted) .send(); } _ => { println!("Unhandled: {item_id:?}"); } } if item_id == quit { sender.shutdown(); } } Event::NotificationClicked { area_id, id, .. } => { println!("Balloon clicked: {area_id:?}: {id:?}"); } Event::NotificationDismissed { area_id, id, .. } => { println!("Notification dismissed: {area_id:?}: {id:?}"); } Event::CopyData { ty, data, .. } => { println!("Data of type {ty} copied to process: {:?}", data); } Event::Shutdown { .. } => { println!("Window shut down"); break; } _ => {} } } Ok(()) }