pebble-engine 0.23.1

A modular, ECS-style graphics/app framework for Rust.
Documentation
# Window Control

`pebble::wgpu::window::Window` (re-exported from `pebble::wgpu::prelude`) is runtime control over the OS window — cursor, title, size, fullscreen. `WGPUPlugin` inserts it automatically, right alongside `Input`:

```rust
use pebble::prelude::*;
use pebble::wgpu::prelude::*;

fn captured_mouse_camera(input: Res<Input>, window: Res<Window>, mut hidden: Local<bool>) {
    if input.key_pressed(KeyCode::KeyC) {
        *hidden = !*hidden;
        window.set_cursor_visible(!*hidden);
        window.set_cursor_grab(if *hidden { CursorGrabMode::Locked } else { CursorGrabMode::None });
    }
}
```

`Window` is a plain resource — `Res<Window>`, no different from `Res<Input>`. It's *not* `WindowResource<WinitWindow>::handle`: that's `Arc<winit::window::Window>`, every raw `winit` method included, and requires naming the concrete backend type to reach at all. `Window` needs neither — cheap to clone (an `Arc` internally), every method forwards straight to the OS window.

## What it covers

- **Cursor**: `set_cursor_icon` (`CursorIcon` — Pebble's own type, mirroring `winit`'s exactly), `set_cursor_visible`, `set_cursor_grab` (`CursorGrabMode::None`/`Confined`/`Locked`), `set_cursor_position`. The grab/position setters return `bool` rather than panicking, since whether a platform supports a given mode is a runtime fact about that platform, not a bug — see `CursorGrabMode`'s variant docs for which platforms support which.
- **Size**: `inner_size` (physical pixels), `set_inner_size` (a request — the OS may not grant it exactly, or at all for a maximized/tiled window), `set_min_inner_size`/`set_max_inner_size`, `set_resizable`.
- **Window state**: `set_title`, `set_visible`, `set_minimized`, `set_maximized`, `set_decorations`, `focus`, `set_fullscreen`/`is_fullscreen` (borderless, on the window's current monitor — not exclusive fullscreen or multi-monitor selection, the overwhelmingly common case for a game without pulling in `winit`'s monitor-enumeration types).

## Scope

This is deliberately winit-shaped, not a generic `WindowProvider` capability — a hand-rolled window backend (SDL2, a headless context) has no obligation to provide anything like it. That's also why it isn't inserted by the generic `WindowPlugin<W>`: `WGPUPlugin` adds a small dedicated `WindowControlPlugin` right after `WindowPlugin<WinitWindow>` specifically. If you're composing `WindowPlugin<WinitWindow>` yourself without going through `WGPUPlugin` (see [Windows and Backends](./windows-and-backends.md#owning-the-graphics-backend-yourself)), add `WindowControlPlugin` the same way to get `Res<Window>`.