Skip to main content

fenestra_shell/
lib.rs

1//! OS glue for fenestra: the winit + wgpu windowed runner and the headless
2//! renderer. Everything that touches a display server lives here;
3//! `fenestra-core` and `fenestra-kit` stay windowless.
4
5use std::fmt;
6
7mod access;
8mod element_render;
9mod headless;
10mod os_clipboard;
11mod synthetic;
12pub mod testing;
13mod window;
14
15pub use element_render::{render_element, render_element_with_state, with_fonts, with_headless};
16pub use headless::Headless;
17pub use os_clipboard::OsClipboard;
18pub use synthetic::{SyntheticEvent, render_app};
19pub use window::{WindowOptions, run_app, run_scene, run_static};
20
21/// Errors from the windowed or headless runners.
22#[derive(Debug)]
23pub enum ShellError {
24    /// No compute-capable wgpu adapter was found.
25    NoDevice,
26    /// The vello renderer failed to build or render.
27    Vello(vello::Error),
28    /// The winit event loop failed.
29    EventLoop(winit::error::EventLoopError),
30    /// GPU readback of the rendered image failed.
31    Readback,
32}
33
34impl fmt::Display for ShellError {
35    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
36        match self {
37            Self::NoDevice => write!(f, "no compute-capable wgpu adapter found"),
38            Self::Vello(e) => write!(f, "vello renderer error: {e}"),
39            Self::EventLoop(e) => write!(f, "winit event loop error: {e}"),
40            Self::Readback => write!(f, "GPU readback failed"),
41        }
42    }
43}
44
45impl std::error::Error for ShellError {}