feat(mirada): nmaster, promover a maestra y smart gaps (estilo dwm)

Tanda de funciones de tiling WM, toda pura (mirada-layout/brain), sin
tocar el protocolo:

- nmaster: LayoutParams.master_count — cuántas ventanas van en el área
  maestra. MasterStack y CenteredMaster apilan N maestras; sin pila, las
  maestras llenan la pantalla. Acciones inc-master/dec-master (Super+,
  Super+.), acotadas 1..9.
- Promover a maestra: Workspace::promote_focused lleva la ventana
  enfocada al puesto 0. Acción promote-to-master (Super+Return).
- Smart gaps: una sola ventana se tesela a sangre, sin margen.

combo_string del compositor canoniza ahora teclas con nombre (Return,
Tab, F5, flechas…) vía xkb::keysym_get_name, no sólo caracteres
imprimibles — sin eso Super+Return no sería un atajo expresable.

Cableado en keymap por defecto, HUD de mirada y mirada-ctl. Verificado
end-to-end con headless-ctl. mirada-layout 26->30, mirada-brain 39->41.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-21 00:45:47 +00:00
parent 8821d34bd5
commit 2dd8ff139e
11 changed files with 228 additions and 42 deletions
+12 -8
View File
@@ -51,8 +51,10 @@ ejecuta operaciones de geometría".
- **`mirada-layout`** — `Rect` + `split` (reparto exacto de píxeles),
`LayoutMode` con 7 modos (`MasterStack`, `CenteredMaster`, `Spiral`
—espiral de Fibonacci—, `Grid`, `Columns`, `Rows`, `Monocle`) y
`LayoutMode::next()` para el ciclo, `Workspace` con foco cíclico y
reordenado. Determinista.
`LayoutMode::next()` para el ciclo, `Workspace` con foco cíclico,
reordenado y `promote_focused`. `LayoutParams` lleva `master_ratio` y
`master_count` (`nmaster`); *smart gaps* (una sola ventana va a
sangre). Determinista.
- **`mirada-protocol`** — `WindowPlacement`, los enums `BrainCommand` y
`BodyEvent`, el marco `postcard` con prefijo `u32` LE
(`write_frame`/`read_frame`, guard `MAX_FRAME`) y el puente
@@ -111,10 +113,12 @@ 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`.
- **`SetLayout`/`CycleLayout`/`GrowMaster`/`ShrinkMaster`** — los 7 modos
de teselado se intercambian por el API (`mirada-ctl layout spiral`), y
el área maestra se redimensiona en caliente (`grow`/`shrink-master`,
atajos `Super+l`/`Super+h`).
- **Layout y área maestra por el API** — los 7 modos se intercambian
(`SetLayout`/`CycleLayout`, `mirada-ctl layout spiral`); el área
maestra se redimensiona (`grow`/`shrink-master`, `Super+l`/`Super+h`);
`inc`/`dec-master` cambian `nmaster` (`Super+,`/`Super+.`); y
`promote-to-master` lleva la enfocada al puesto maestro (`Super+Return`
`combo_string` ya canoniza teclas con nombre: `Return`, `Tab`, `F5`…).
- **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
@@ -136,8 +140,8 @@ gráficos para ejercitar `mirada-ctl` en modo desatendido.
## Estado
Implementado y verde: `mirada-layout` (26 tests), `mirada-protocol`
(9), `mirada-brain` (39), `mirada-link` (7), `mirada-body` (13), las
Implementado y verde: `mirada-layout` (30 tests), `mirada-protocol`
(9), `mirada-brain` (41), `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`).