gioser

tawasuyu/brahman

Rust 532TOML 203Markdown 58JSON 197629 Definitions

⎇ 8204852e3aa72d653aa41e941fc3a310bd11493f crates/modules/mirada/SDD.md Markdown · 130 lines · 7.0 KB History raw

feat(mirada): keymap configurable en RON, recargable en caliente 8204852e3 · sergio ·

1# modules/mirada/ — Compositor Wayland (carmen)
2
3**Propósito.** Un compositor Wayland teselante. La decisión de diseño
4central es partirlo en dos procesos, el **Cerebro** y el **Cuerpo**:
5
6- **El Cuerpo** (`mirada-compositor`, sobre `smithay`) habla Wayland con
7  los clientes, posee el hardware (DRM/GPU/libinput) y compone las
8  superficies reales. Los píxeles nunca salen de él — composición
9  *zero-copy*.
10- **El Cerebro** (la app `mirada`, GPUI) decide *dónde* va cada ventana
11  —pura aritmética de rectángulos— y orquesta el escritorio: layouts,
12  atajos, focos, escritorios virtuales.
13
14Los dos hablan por un socket Unix con un contrato mínimo de enums. Así,
15toda la lógica espacial es agnóstica de Wayland y se prueba sin un
16servidor gráfico; el Cuerpo queda reducido a "habla el protocolo y
17ejecuta operaciones de geometría".
18
19## Crates
20
21| crate              | tipo     | rol                                                                    |
22| ------------------ | -------- | ---------------------------------------------------------------------- |
23| `mirada-layout`    | lib      | Motor de teselado: `Rect`, modos de layout, `Workspace` (ventanas, foco) |
24| `mirada-protocol`  | lib      | Contrato Cerebro↔Cuerpo: `BrainCommand`/`BodyEvent` + marco de cable   |
25| `mirada-brain`     | lib      | Orquestador del escritorio: `Desktop`, eventos→comandos, atajos        |
26| `mirada-link`      | lib      | Transporte: el socket Unix con hilo lector + canal                     |
27| `mirada-body`      | lib      | Contabilidad del Cuerpo: `BodyState`, traduce comandos a `BodyOp`      |
28| `mirada` (app)     | bin/GPUI | El Cerebro: ventana que tesela el escritorio y manda geometría         |
29| `mirada-compositor`| bin/smithay | El Cuerpo: compositor Wayland real (backend `winit`, anidado)        |
30
31## Flujo
32
33```text
34  mirada-layout ─► mirada-protocol ─► mirada-brain ─► [app mirada · Cerebro]
35                          │                                  │
36                          │                            mirada-link
37                          │                                  │
38                          └────► mirada-body ─► [mirada-compositor · Cuerpo]
39```
40
41- El Cuerpo reporta hardware/clientes con `BodyEvent` (salida conectada,
42  ventana abierta, atajo pulsado…).
43- El Cerebro (`Desktop::on_event`) recalcula y emite `BrainCommand`
44  (`Place` con la geometría completa, `Close`, `GrabKeys`…).
45- El Cuerpo (`BodyState::apply`) traduce cada comando a `BodyOp`
46  concretas y sólo emite lo que de verdad cambia.
47
48## Detalle por crate
49
50- **`mirada-layout`** — `Rect` + `split` (reparto exacto de píxeles),
51  `LayoutMode` (`MasterStack`/`Monocle`/`Grid`/`Columns`), `Workspace`
52  con foco cíclico y reordenado. Determinista.
53- **`mirada-protocol`** — `WindowPlacement`, los enums `BrainCommand` y
54  `BodyEvent`, el marco `postcard` con prefijo `u32` LE
55  (`write_frame`/`read_frame`, guard `MAX_FRAME`) y el puente
56  `placements(&Workspace, Rect)`.
57- **`mirada-brain`** — `Desktop`: salidas, 9 escritorios virtuales,
58  registro de ventanas. `on_event(BodyEvent) -> Vec<BrainCommand>`;
59  `DesktopAction` + `Keymap` configurable. `set_keymap` lo cambia en
60  caliente y devuelve el `GrabKeys` a reenviar.
61- **`mirada-link`** — `Link<Out,In>` sobre socket Unix; hilo lector de
62  fondo + canal `mpsc` para sondeo no bloqueante. `BrainLink`/`BodyLink`,
63  `connected_pair` (socketpair), `connect`/`listen` por ruta.
64- **`mirada-body`** — `BodyState`: salidas + superficies; `apply` traduce
65  `BrainCommand`→`BodyOp` (idempotente), los mutadores del backend
66  devuelven los `BodyEvent` a mandar. Ejemplo `headless`: un Cuerpo sin
67  gráficos guiado por stdin para ejercitar el bucle entero.
68- **`mirada` (app)** — envuelve `Desktop` y lo pinta (barra de
69  escritorios + modo + foco, lienzo teselado). Con `MIRADA_SOCKET`
70  conecta a un Cuerpo; sin él corre en **simulación** (ventanas
71  sintéticas, teclado de la propia ventana).
72
73## Atajos de teclado configurables
74
75El keymap vive **sólo en el Cerebro** (`mirada-brain::Keymap`). El Cuerpo
76nunca lo ve: recibe únicamente la lista de cadenas a interceptar en un
77`GrabKeys`, hace un `Vec::contains` ciego y devuelve la combinación
78pulsada como `Keybind`; es `Desktop` quien la traduce a `DesktopAction`.
79Esa separación —*qué* interceptar (lista barata, Cuerpo) vs. *qué
80significa* (el mapa, Cerebro)— hace innecesario cualquier candado o
81`Arc`: el mapa es monohilo y la lista se reemplaza de golpe.
82
83- **Disco** — RON de texto en `~/.config/mirada/keymap.ron`, editable a
84  mano y versionable. La app lo crea documentado en el primer arranque;
85  si está corrupto, avisa y usa el de por defecto sin pisar el archivo.
86- **Cable** — sólo viaja la lista de cadenas (`GrabKeys`), vía el marco
87  `postcard` que ya existe. No hay formato binario de configuración.
88- **Vocabulario** — la acción es una cadena estable (`"focus-next"`,
89  `"layout:grid"`, `"workspace:3"`): `DesktopAction: Display + FromStr`.
90- **Recarga en caliente** — `Keymap::watch` (sobre `notify`) vigila el
91  archivo; al cambiar, el dueño del `Desktop` recarga, llama a
92  `set_keymap` y reenvía el `GrabKeys`. Sin reiniciar.
93- **Configurador** — no hay ejecutable aparte: el editor de texto del
94  usuario, y la app `mirada` (que a futuro puede dibujar un editor visual
95  sobre el mismo API `Keymap`). `cargo run -p mirada-brain --example
96  keymap-default` imprime el archivo por defecto.
97
98## Dependencias
99
100- Todos los `lib` con `#![forbid(unsafe_code)]`. Cero Wayland, cero
101  `smithay` en los seis crates de arriba.
102- El acoplamiento a Wayland/hardware vive sólo en `mirada-compositor`.
103
104## Estado
105
106Implementado y verde: `mirada-layout` (22 tests), `mirada-protocol`
107(9), `mirada-brain` (29), `mirada-link` (7), `mirada-body` (13), y la
108app `mirada` (compila; verificación visual manual).
109
110El **Cuerpo** ya existe: `mirada-compositor` es un compositor Wayland
111teselante real sobre `smithay`, con backend `winit` — corre **anidado**
112como una ventana dentro de la sesión gráfica actual. Habla
113`wl_compositor`/`xdg_shell`/`wl_shm`/`wl_seat`/`wl_data_device`, compone
114las superficies de los clientes con `GlesRenderer` y aplica la geometría
115del Cerebro. Reusa `mirada-body` (contabilidad) y `mirada-link` (cable).
116Dos modos: **autónomo** (Cerebro `Desktop` embebido, un solo proceso) o
117**enlazado** (`MIRADA_SOCKET` → la app `mirada` decide la geometría).
118Compila y pasa clippy; verificación visual manual — ver
119`crates/apps/mirada-compositor/README.md`.
120
121**Pendiente** — refinamientos del Cuerpo, no verificables en modo
122desatendido:
123
124| capa pendiente       | rol                                                      |
125| -------------------- | -------------------------------------------------------- |
126| backend DRM/libinput | de `winit` anidado a sesión nativa: superficies KMS, GPU |
127| `mirada-input`       | puntero/ratón completo, repetición de teclas, gestos     |
128| `mirada-sandbox`     | aislamiento de clientes sobre `arje-incarnate`           |
129
130CRIU (congelar/restaurar ventanas) queda anotado como futuro.

SDD.md

modules/mirada/ — Compositor Wayland (carmen)

Propósito. Un compositor Wayland teselante. La decisión de diseño central es partirlo en dos procesos, el Cerebro y el Cuerpo:

Los dos hablan por un socket Unix con un contrato mínimo de enums. Así, toda la lógica espacial es agnóstica de Wayland y se prueba sin un servidor gráfico; el Cuerpo queda reducido a "habla el protocolo y ejecuta operaciones de geometría".

Crates

cratetiporol
mirada-layoutlibMotor de teselado: Rect, modos de layout, Workspace (ventanas, foco)
mirada-protocollibContrato Cerebro↔Cuerpo: BrainCommand/BodyEvent + marco de cable
mirada-brainlibOrquestador del escritorio: Desktop, eventos→comandos, atajos
mirada-linklibTransporte: el socket Unix con hilo lector + canal
mirada-bodylibContabilidad del Cuerpo: BodyState, traduce comandos a BodyOp
mirada (app)bin/GPUIEl Cerebro: ventana que tesela el escritorio y manda geometría
mirada-compositorbin/smithayEl Cuerpo: compositor Wayland real (backend winit, anidado)

Flujo

  mirada-layout ─► mirada-protocol ─► mirada-brain ─► [app mirada · Cerebro]
                          │                                  │
                          │                            mirada-link
                          │                                  │
                          └────► mirada-body ─► [mirada-compositor · Cuerpo]

Detalle por crate

Atajos de teclado configurables

El keymap vive sólo en el Cerebro (mirada-brain::Keymap). El Cuerpo nunca lo ve: recibe únicamente la lista de cadenas a interceptar en un GrabKeys, hace un Vec::contains ciego y devuelve la combinación pulsada como Keybind; es Desktop quien la traduce a DesktopAction. Esa separación —qué interceptar (lista barata, Cuerpo) vs. qué significa (el mapa, Cerebro)— hace innecesario cualquier candado o Arc: el mapa es monohilo y la lista se reemplaza de golpe.

Dependencias

Estado

Implementado y verde: mirada-layout (22 tests), mirada-protocol (9), mirada-brain (29), mirada-link (7), mirada-body (13), y la app mirada (compila; verificación visual manual).

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 pendienterol
backend DRM/libinputde winit anidado a sesión nativa: superficies KMS, GPU
mirada-inputpuntero/ratón completo, repetición de teclas, gestos
mirada-sandboxaislamiento de clientes sobre arje-incarnate

CRIU (congelar/restaurar ventanas) queda anotado como futuro.