Winio
Winio is a single-threaded asynchronous GUI runtime.
It is based on compio, and the GUI part is powered by native backends.
All IO requests could be issued in the same thread as GUI, without blocking the user interface!
Example
Read the example and learn more!
| Backend |
Light |
Dark |
| Win32 |
 |
 |
| WinUI 3 |
 |
 |
| Qt 6 |
 |
 |
| GTK 4 |
 |
 |
| AppKit |
 |
 |
| UIKit (Mac Catalyst) |
 |
 |
| UIKit (iOS) |
 |
 |
| Android View |
 |
 |
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> {
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>) -> ! {
start! {
sender, default: MainMessage::Noop,
self.window => {
WindowEvent::Close => MainMessage::Close,
}
}
}
async fn update_children(&mut self) -> Result<bool> {
update_children!(self.window)
}
async fn update(&mut self, message: Self::Message, sender: &ComponentSender<Self>) -> Result<bool> {
match message {
MainMessage::Noop => Ok(false),
MainMessage::Close => {
sender.output(());
Ok(false)
}
}
}
fn render(&mut self, _sender: &ComponentSender<Self>) -> Result<()> {
let csize = self.window.client_size()?;
Ok(())
}
fn render_children(&mut self) -> Result<()> {
self.window.render()
}
}