Expand description
Denise — a direct-rendering UI toolkit for systems without a desktop environment.
This crate is the platform-agnostic core. It owns geometry, colour, the pixel
buffer contract, input events and damage tracking. It contains no platform code
and no unsafe.
Backends implement two traits:
Surface— hands out aFrameto draw into and presents damaged regions.InputSource— drains platform input intoInputEvents.
§Frame lifecycle
let mut frame = surface.acquire()?;
// The buffer we just got back may be several frames old. Repaint everything
// that has been damaged since it was last current, not just this frame's damage.
let damage: &[Rect] = tracker.resolve(frame.age());
// ... draw into `frame`, clipped to `damage` ...
drop(frame);
surface.present(damage)?;
tracker.end_frame();Getting that sequence wrong is the classic double-buffering bug: repaint only the current frame’s damage and every second frame shows stale content.
§Theming
Colours are named by role — Role::Primary, Role::Base100,
Role::Error — each with a *Content partner. Theme::pair returns a
surface and a foreground that are guaranteed to contrast, and
Theme::validate proves it for a custom theme rather than leaving it to be
discovered on a panel in daylight. The arithmetic is WCAG relative luminance in
integers, so it is identical on x86 and ARM.
§Status
M5 complete, M6 in progress. Everything through M5 has run on real hardware — a Raspberry Pi on DRM/KMS, Windows 11 on ARM64, macOS — not only in CI. See the README for the roadmap.
Re-exports§
pub use color::Color;pub use cursor::CursorPlane;pub use damage::DamageTracker;pub use damage::MAX_DAMAGE_RECTS;pub use damage::RectList;pub use geom::Point;pub use geom::Rect;pub use geom::Size;pub use input::ElementState;pub use input::InputEvent;pub use input::InputSource;pub use input::KeyCode;pub use input::Modifiers;pub use input::PointerButton;pub use input::TouchId;pub use surface::BufferAge;pub use surface::Frame;pub use surface::PixelFormat;pub use surface::Surface;pub use surface::SurfaceError;pub use surface::required_words;pub use theme::ColorScheme;pub use theme::Metrics;pub use theme::Radius;pub use theme::Role;pub use theme::Theme;