SkillAgentSearch skills...

Winio

Single-threaded asynchronous GUI runtime

Install / Use

/learn @compio-rs/Winio
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

Winio

Winio is a single-threaded asynchronous GUI runtime. It is based on compio, and the GUI part is powered by Win32, WinUI 3, Qt 5/6, GTK 4 or AppKit. All IO requests could be issued in the same thread as GUI, without blocking the user interface!

Example

Read the examples and learn more!

| Backend | Light | Dark | | ------- | -------------------------------------- | ------------------------------------ | | Win32 | Win32 Light | Win32 Dark | | WinUI 3 | WinUI Light | WinUI Dark | | Qt 6 | Qt Light | Qt Dark | | GTK 4 | GTK Light | GTK Dark | | AppKit | macOS Light | macOS Dark |

Quick start

Winio follows ELM-like design, inspired by yew and relm4. The application starts with a root Component:

use winio::prelude::*;

fn main() -> Result<()> {
    App::new("rs.compio.winio.example")?.run::<MainModel>(())
}

struct MainModel {
    window: Child<Window>,
}

enum MainMessage {
    Noop,
    Close,
}

impl Component for MainModel {
    type Error = Error;
    type Event = ();
    type Init<'a> = ();
    type Message = MainMessage;

    async fn init(_init: Self::Init<'_>, _sender: &ComponentSender<Self>) -> Result<Self> {
        // create & initialize the window
        init! {
            window: Window = (()) => {
                text: "Example",
                size: Size::new(800.0, 600.0),
            }
        }
        window.show()?;
        Ok(Self { window })
    }

    async fn start(&mut self, sender: &ComponentSender<Self>) -> ! {
        // listen to events
        start! {
            sender, default: MainMessage::Noop,
            self.window => {
                WindowEvent::Close => MainMessage::Close,
            }
        }
    }

    async fn update_children(&mut self) -> Result<bool> {
        // update the window
        update_children!(self.window)
    }

    async fn update(&mut self, message: Self::Message, sender: &ComponentSender<Self>) -> Result<bool> {
        // deal with custom messages
        match message {
            MainMessage::Noop => Ok(false),
            MainMessage::Close => {
                // the root component output stops the application
                sender.output(());
                // need not to call `render`
                Ok(false)
            }
        }
    }

    fn render(&mut self, _sender: &ComponentSender<Self>) -> Result<()> {
        let csize = self.window.client_size()?;
        // adjust layout and draw widgets here
        Ok(())
    }

    fn render_children(&mut self) -> Result<()> {
        self.window.render()
    }
}

Related Skills

View on GitHub
GitHub Stars101
CategoryDevelopment
Updated3d ago
Forks7

Languages

Rust

Security Score

95/100

Audited on Mar 23, 2026

No findings