Winio
Single-threaded asynchronous GUI runtime
Install / Use
/learn @compio-rs/WinioREADME
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 |
|
|
| WinUI 3 |
|
|
| Qt 6 |
|
|
| GTK 4 |
|
|
| AppKit |
|
|
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
node-connect
337.3kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
83.2kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
337.3kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
83.2kCommit, push, and open a PR
