feat(mirada): API de acciones — mirada-ctl + HUD interactivo

Toda acción de escritorio converge en Desktop::apply(DesktopAction); el
keymap era sólo un front-end. Esta tanda añade los otros tres.

- DesktopAction::FocusWindow(WindowId): direccionamiento directo de una
  ventana (no sólo ciclar); si está en otro escritorio, salta a él.
  DesktopAction pasa a ser Serialize/Deserialize (postcard) además de
  Display/FromStr.

- mirada-brain::ctl: el API de control externo. CtlRequest/CtlReply
  (marco postcard), CtlServer/CtlConn no bloqueantes y send_request.
  El Cerebro abre el socket y atiende en su bucle: la app mirada
  siempre, mirada-compositor sólo con el Cerebro embebido.

- mirada-ctl: CLI de control estilo swaymsg/hyprctl —
  `mirada-ctl focus-next | focus-window 5 | workspace 3 | windows`.
  Parsea la acción de los argumentos vía FromStr.

- HUD interactivo en la app mirada: pips de escritorio y ventanas del
  lienzo clicables (SwitchWorkspace / FocusWindow).

- Ejemplo headless-ctl: un Cerebro sin gráficos para probar mirada-ctl
  en modo desatendido. Verificado end-to-end.

mirada-brain: 29 -> 37 tests.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-21 00:20:10 +00:00
parent 8204852e3a
commit b31f988833
14 changed files with 751 additions and 12 deletions
+31 -3
View File
@@ -27,6 +27,7 @@ ejecuta operaciones de geometría".
| `mirada-body` | lib | Contabilidad del Cuerpo: `BodyState`, traduce comandos a `BodyOp` |
| `mirada` (app) | bin/GPUI | El Cerebro: ventana que tesela el escritorio y manda geometría |
| `mirada-compositor`| bin/smithay | El Cuerpo: compositor Wayland real (backend `winit`, anidado) |
| `mirada-ctl` (app) | bin/CLI | Control externo del Cerebro (estilo `swaymsg`): acciones y consultas |
## Flujo
@@ -68,7 +69,11 @@ ejecuta operaciones de geometría".
- **`mirada` (app)** — envuelve `Desktop` y lo pinta (barra de
escritorios + modo + foco, lienzo teselado). Con `MIRADA_SOCKET`
conecta a un Cuerpo; sin él corre en **simulación** (ventanas
sintéticas, teclado de la propia ventana).
sintéticas, teclado de la propia ventana). Pips de escritorio y
ventanas clicables.
- **`mirada-ctl` (app)** — CLI de control: parsea la acción de los
argumentos (`DesktopAction: FromStr`) y la manda al Cerebro por el
socket de control; `windows` y `actions` para consultar.
## Atajos de teclado configurables
@@ -95,6 +100,28 @@ significa* (el mapa, Cerebro)— hace innecesario cualquier candado o
sobre el mismo API `Keymap`). `cargo run -p mirada-brain --example
keymap-default` imprime el archivo por defecto.
## API de acciones
Toda acción de escritorio converge en un único embudo:
`Desktop::apply(DesktopAction) -> Vec<BrainCommand>`. El keymap no es más
que un front-end (`Keybind``lookup``apply`); hay otros tres:
- **`DesktopAction::FocusWindow(WindowId)`** — direccionamiento directo de
una ventana (no sólo ciclar con `FocusNext`/`Prev`); si está en otro
escritorio, salta a él. Lo usan la taskbar y `mirada-ctl`.
- **HUD interactivo** (app `mirada`) — los pips de escritorio y las
ventanas del lienzo son clicables: clic = `apply` de la acción.
- **`mirada-ctl`** — control externo por línea de comandos
(`mirada-ctl focus-next`, `workspace 3`, `windows`). Habla con el
Cerebro por un socket Unix aparte; el módulo `mirada-brain::ctl` define
`CtlRequest`/`CtlReply` (marco `postcard`), `CtlServer`/`CtlConn` y
`send_request`. El Cerebro (la app `mirada` siempre; `mirada-compositor`
sólo embebido) abre el socket y atiende en su bucle. `DesktopAction`
viaja como enum serializado: contrato tipado de punta a punta.
`cargo run -p mirada-brain --example headless-ctl` levanta un Cerebro sin
gráficos para ejercitar `mirada-ctl` en modo desatendido.
## Dependencias
- Todos los `lib` con `#![forbid(unsafe_code)]`. Cero Wayland, cero
@@ -104,8 +131,9 @@ significa* (el mapa, Cerebro)— hace innecesario cualquier candado o
## 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).
(9), `mirada-brain` (37), `mirada-link` (7), `mirada-body` (13), las
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**