winctx 0.0.20

A minimal window context for Rust on Windows.
Documentation
use std::io::Cursor;
use std::pin::pin;

use anyhow::Result;
use tokio::signal::ctrl_c;
use winctx::event::ClipboardEvent;
use winctx::{CreateWindow, Event};

const ICON: &[u8] = include_bytes!("tokio.ico");

#[tokio::main]
async fn main() -> Result<()> {
    let mut window = CreateWindow::new("se.tedro.Example").clipboard_events(true);

    let default_icon = window.icons().insert_buffer(ICON, 22, 22);

    window.new_area().icon(default_icon);

    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::Clipboard { event } => match event {
                ClipboardEvent::BitMap(bitmap) => {
                    let decoder = image::codecs::bmp::BmpDecoder::new_without_file_header(
                        Cursor::new(&bitmap[..]),
                    )?;
                    let image = image::DynamicImage::from_decoder(decoder)?;
                    image.save("clipboard.png")?;
                    println!("Saved clipboard image to clipboard.png");
                }
                ClipboardEvent::Text(text) => {
                    println!("Clipboard text: {text:?}");
                }
                _ => {}
            },
            Event::Shutdown { .. } => {
                println!("Window shut down");
                break;
            }
            _ => {}
        }
    }

    Ok(())
}