docs(mirada): el backend DRM funciona — README y SDD al día
mirada-compositor tiene dos backends: winit (anidado) y drm (nativo sobre TTY, verificado en hardware). README con la selección de backend, los requisitos de cada uno y MIRADA_STARTUP/MIRADA_DRM_TIMEOUT; SDD con la estructura del backend DRM. Pendiente: puntero en DRM, VT switch, hotplug. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Semantic delta
No definition changed: this change is text, documentation or data.
2 files · +56 −38
diff --git a/crates/apps/mirada-compositor/README.md b/crates/apps/mirada-compositor/README.md
index 11575ad..a7d68ae 100644
--- a/crates/apps/mirada-compositor/README.md
+++ b/crates/apps/mirada-compositor/README.md
@@ -6,30 +6,42 @@ de la arquitectura Cerebro↔Cuerpo de `mirada` (ver
clientes, compone sus superficies y aplica la geometría que decide el
Cerebro.
-Backend `winit`: corre **anidado** — una ventana dentro de tu sesión
-gráfica actual, X11 o Wayland. No toca DRM/KMS, así que es seguro de
-arrancar sin dejar la sesión.
+Tiene **dos backends gráficos**:
-## Requisitos
+- **`winit`** — corre **anidado**, como una ventana dentro de tu sesión
+ gráfica actual (X11 o Wayland). Para desarrollar y probar sin dejar el
+ escritorio.
+- **`drm`** — corre **nativo** sobre una TTY, sin sesión anfitriona:
+ toma la GPU (DRM/KMS/GBM/EGL), el teclado (`libinput`) y la pantalla
+ entera. Es carmen como tu escritorio de verdad.
-Hace falta una **sesión gráfica anfitriona** (X11 o Wayland) donde
-dibujar la ventana del compositor — es donde `winit` se anida. En un
-servidor *headless* (SSH a una caja sin escritorio, `XDG_SESSION_TYPE=tty`,
-sin `/dev/dri`) no hay dónde mostrar nada y el arranque aborta con un
-mensaje que lo explica.
+Sin argumentos elige solo: con `DISPLAY`/`WAYLAND_DISPLAY` → `winit`;
+sin ellos → `drm`. O fuérzalo: `mirada-compositor --winit` / `--drm`.
-Para verlo en una caja headless: levanta un servidor X virtual y
-conéctate por VNC.
+## Backends
+
+### winit — anidado
```sh
-Xvfb :99 -screen 0 1280x800x24 &
-x11vnc -display :99 -localhost -nopw & # luego túnel SSH al :5900
-DISPLAY=:99 cargo run -p mirada-compositor
+cargo run -p mirada-compositor -- --winit
```
-El backend nativo DRM/KMS —que pintaría directo en la pantalla sin
-sesión anfitriona— está pendiente (ver el SDD), y de todos modos
-necesitaría un `/dev/dri`.
+Necesita una sesión gráfica anfitriona (X11 o Wayland) donde dibujar su
+ventana; sin ella aborta con un mensaje que lo explica.
+
+### drm — nativo sobre TTY
+
+```sh
+cargo run -p mirada-compositor -- --drm
+```
+
+Corre directo sobre el hardware. Requiere una **TTY** (`Ctrl+Alt+F3`),
+una GPU con `/dev/dri`, y `seatd` o `logind` para la sesión. Toma la
+pantalla completa; sal con `Super+Shift+e` o `Ctrl+C`.
+
+- `MIRADA_STARTUP=<cmd>` — lanza una app al arrancar (`MIRADA_STARTUP=foot`).
+- `MIRADA_DRM_TIMEOUT=<s>` — cierra el compositor solo tras N segundos
+ (0 o sin definir = sin tope).
## Dos modos
@@ -100,7 +112,9 @@ En modo enlazado el socket de control lo abre el Cerebro (la app
## Qué implementa
`wl_compositor`, `xdg_shell` (toplevels y popups), `wl_shm`, `wl_seat`
-(teclado) y `wl_data_device` (selección). Composición con `GlesRenderer`.
+(teclado), `wl_output` y `wl_data_device` (selección). Composición con
+`GlesRenderer` — en `winit` sobre la ventana, en `drm` con un
+`DrmCompositor` por salida.
Reusa `mirada-body` para la contabilidad de salidas y superficies, y
`mirada-link` para el cable hacia un Cerebro externo. Toda la lógica
@@ -109,7 +123,7 @@ espacial es agnóstica de Wayland y vive en los crates de
## Pendiente
-Backend nativo DRM/libinput (de ventana anidada a sesión real),
-puntero/ratón completo y aislamiento de clientes. Ver el SDD.
+Del backend DRM: puntero/ratón (hoy sólo teclado), conmutación de VT,
+hotplug de monitores. Aislamiento de clientes. Ver el SDD.
[`smithay`]: https://github.com/Smithay/smithay
diff --git a/crates/modules/mirada/SDD.md b/crates/modules/mirada/SDD.md
index a25604a..4b843c6 100644
--- a/crates/modules/mirada/SDD.md
+++ b/crates/modules/mirada/SDD.md
@@ -183,23 +183,27 @@ apps `mirada` y `mirada-compositor` (compilan; verificación visual
manual) y `mirada-ctl` (CLI, probado vía el ejemplo `headless-ctl`).
El **Cuerpo** ya existe: `mirada-compositor` es un compositor Wayland
-teselante real sobre `smithay`, con backend `winit` — corre **anidado**
-como una ventana dentro de la sesión gráfica actual. Habla
-`wl_compositor`/`xdg_shell`/`wl_shm`/`wl_seat`/`wl_data_device`, compone
-las superficies de los clientes con `GlesRenderer` y aplica la geometría
-del Cerebro. Reusa `mirada-body` (contabilidad) y `mirada-link` (cable).
-Dos modos: **autónomo** (Cerebro `Desktop` embebido, un solo proceso) o
-**enlazado** (`MIRADA_SOCKET` → la app `mirada` decide la geometría).
-Compila y pasa clippy; verificación visual manual — ver
-`crates/apps/mirada-compositor/README.md`.
-
-**Pendiente** — refinamientos del Cuerpo, no verificables en modo
-desatendido:
-
-| capa pendiente | rol |
-| -------------------- | -------------------------------------------------------- |
-| backend DRM/libinput | de `winit` anidado a sesión nativa: superficies KMS, GPU |
-| `mirada-input` | puntero/ratón completo, repetición de teclas, gestos |
-| `mirada-sandbox` | aislamiento de clientes sobre `arje-incarnate` |
+teselante real sobre `smithay`. Habla `wl_compositor`/`xdg_shell`/
+`wl_shm`/`wl_seat`/`wl_output`/`wl_data_device`, compone las superficies
+de los clientes con `GlesRenderer` y aplica la geometría del Cerebro.
+Reusa `mirada-body` (contabilidad) y `mirada-link` (cable). Dos modos de
+Cerebro: **autónomo** (`Desktop` embebido) o **enlazado** (`MIRADA_SOCKET`
+→ la app `mirada`).
+
+**Dos backends gráficos** (`main()` elige; `--winit`/`--drm` lo fuerzan):
+
+- **`winit`** — corre anidado, una ventana en la sesión gráfica actual.
+- **`drm`** (`drm_backend.rs`) — corre nativo sobre una TTY, sin sesión
+ anfitriona: `libseat` (sesión), `udev` (GPU), `DrmDevice` + GBM + EGL +
+ `DrmCompositor`, `libinput` (teclado), bucle `calloop`. Verificado en
+ hardware: sesión, render, teclado, atajos, clientes, salida limpia.
+
+**Pendiente** — refinamientos del Cuerpo:
+
+| capa pendiente | rol |
+| ---------------- | ------------------------------------------------------------ |
+| puntero en `drm` | ratón/touchpad por `libinput` (hoy el backend DRM sólo teclado) |
+| `mirada-input` | repetición de teclas, gestos; conmutación de VT, hotplug |
+| `mirada-sandbox` | aislamiento de clientes sobre `arje-incarnate` |
CRIU (congelar/restaurar ventanas) queda anotado como futuro.