# gapp-winit
[](https://crates.io/crates/gapp-winit)
[](https://docs.rs/gapp-winit)
[](https://crates.io/crates/gapp-winit)
An abstract event loop library for [winit](https://crates.io/crates/winit)-based applications with support for [OpenGL/glutin](https://crates.io/crates/glutin) and [wgpu](https://crates.io/crates/wgpu) backends. Integrates seamlessly with [gapp](https://crates.io/crates/gapp) traits for clean separation of **input**, **update**, **render**, and **present**.
Supports native (Windows/Linux/macOS) and WASM. Fixed-timestep FPS cap, automatic resize handling.
## Features
- **Backend-agnostic**: Switch between OpenGL and wgpu via Cargo features.
- **Trait-based**: Implement `WindowInput`, `Present`, `Render` (gapp), `Update` (gapp).
- **Cross-platform**: Full WASM support (HTML canvas).
- **Performance**: Fixed timestep, on-demand redraw, FPS sleep (native).
| Native | ✅ | ✅ |
| WASM | ✅ | ✅ |
| Default| ✅ | ❎️ |
## Quickstart
For reference, have a look at [the template program](https://gitlab.com/porky11/gapp-template).
It also can be used as a base for your program.
## Traits Overview
- **`WindowInput<C, R>`**: Handle all `WindowEvent`s (post-resize/redraw). Call `event_loop.exit()` on close.
- **`Present<R>`**: Submit frame (e.g., `queue.submit()`, `surface.swap_buffers()`).
- **`Render<R>` / `Update`** (from gapp): Standard render/update loop.
Resize is **auto-handled**.
FPS can be supplied to `run`.