1# mirada-compositor — el Cuerpo de carmen
2
3Un compositor Wayland teselante real, sobre [`smithay`]. Es el **Cuerpo**
4de la arquitectura Cerebro↔Cuerpo de `mirada` (ver
5`crates/modules/mirada/SDD.md`): habla el protocolo Wayland con los
6clientes, compone sus superficies y aplica la geometría que decide el
7Cerebro.
8
9Tiene **dos backends gráficos**:
10
11- **`winit`** — corre **anidado**, como una ventana dentro de tu sesión
12 gráfica actual (X11 o Wayland). Para desarrollar y probar sin dejar el
13 escritorio.
14- **`drm`** — corre **nativo** sobre una TTY, sin sesión anfitriona:
15 toma la GPU (DRM/KMS/GBM/EGL), el teclado (`libinput`) y la pantalla
16 entera. Es carmen como tu escritorio de verdad.
17
18Sin argumentos elige solo: con `DISPLAY`/`WAYLAND_DISPLAY` → `winit`;
19sin ellos → `drm`. O fuérzalo: `mirada-compositor --winit` / `--drm`.
20
21## Backends
22
23### winit — anidado
24
25```sh
26cargo run -p mirada-compositor -- --winit
27```
28
29Necesita una sesión gráfica anfitriona (X11 o Wayland) donde dibujar su
30ventana; sin ella aborta con un mensaje que lo explica.
31
32### drm — nativo sobre TTY
33
34```sh
35cargo run -p mirada-compositor -- --drm
36```
37
38Corre directo sobre el hardware. Requiere una **TTY** (`Ctrl+Alt+F3`),
39una GPU con `/dev/dri`, y `seatd` o `logind` para la sesión. Toma la
40pantalla completa; sal con `Super+Shift+e` o `Ctrl+C`.
41
42Lleva teclado y ratón por `libinput`: el foco sigue al puntero y los
43clics y la rueda llegan a la ventana que tienes debajo. El cursor toma
44la forma que pide el cliente (la «I» sobre texto, una mano…) y cae a un
45cuadrado por defecto sobre el escritorio. **`Super`+arrastre** con el
46botón izquierdo mueve una ventana, con el derecho la redimensiona — al
47arrastrarla, la ventana pasa a flotar. Cada ventana lleva un marco
48fino: azul la que tiene el foco, gris las demás.
49
50- `MIRADA_STARTUP=<cmd>` — lanza una app al arrancar (`MIRADA_STARTUP=foot`).
51- `MIRADA_DRM_TIMEOUT=<s>` — cierra el compositor solo tras N segundos
52 (0 o sin definir = sin tope).
53
54## Como sesión de escritorio
55
56Para usar carmen como tu escritorio de verdad — entrar a una sesión, no
57sólo probarlo:
58
591. Compila e instala los binarios en el `PATH`:
60
61 ```sh
62 cargo build --release -p mirada-compositor -p mirada-ctl -p mirada-launcher
63 sudo install -m755 target/release/mirada-compositor \
64 target/release/mirada-ctl target/release/mirada-launcher /usr/local/bin/
65 sudo install -m755 session/mirada-session /usr/local/bin/
66 ```
67
682. Arranca desde una TTY:
69
70 ```sh
71 mirada-session
72 ```
73
74 O regístralo en un gestor de login copiando `session/carmen.desktop`
75 a `/usr/share/wayland-sessions/` — aparecerá carmen como sesión.
76
773. **Autoarranque** — los programas que quieras al iniciar van en
78 `~/.config/mirada/autostart`, uno por línea (`#` comenta). Tienes un
79 ejemplo en `session/autostart.example`:
80
81 ```sh
82 mkdir -p ~/.config/mirada
83 cp crates/apps/mirada-compositor/session/autostart.example \
84 ~/.config/mirada/autostart
85 ```
86
87Dentro de la sesión, `Ctrl+Alt+F1…F12` salta a otra TTY y vuelve sin
88romper carmen.
89
90## Lanzador de aplicaciones
91
92`mirada-launcher` escanea los `.desktop` del sistema y lanza el que
93elijas. Es un programa de terminal sin dependencias: lo abres en una
94terminal pequeña y filtras escribiendo. El keymap por defecto ata
95`Super+p` a `spawn:foot -e mirada-launcher` — pulsa el atajo, escribe
96unas letras del nombre, Enter.
97
98Necesita `mirada-launcher` y `foot` en el `PATH` (ver la instalación de
99arriba). Suelto también vale: `mirada-launcher` en cualquier terminal.
100
101## Dos modos
102
103- **Autónomo** (por defecto) — lleva un `Desktop` (de `mirada-brain`)
104 embebido. Es un compositor teselante completo en un solo proceso.
105
106 ```sh
107 cargo run -p mirada-compositor
108 ```
109
110- **Enlazado** — el Cuerpo escucha en un socket y la app `mirada` (el
111 Cerebro GPUI) se conecta y decide la geometría.
112
113 ```sh
114 # terminal 1 — el Cuerpo
115 MIRADA_SOCKET=/tmp/mirada.sock cargo run -p mirada-compositor
116 # terminal 2 — el Cerebro
117 MIRADA_SOCKET=/tmp/mirada.sock cargo run -p mirada
118 ```
119
120## Probarlo
121
122Al arrancar imprime el `WAYLAND_DISPLAY` que abrió. Lanza cualquier
123cliente Wayland contra él:
124
125```sh
126WAYLAND_DISPLAY=wayland-1 foot # o weston-terminal, alacritty, …
127```
128
129Las ventanas se teselan solas. El teclado, con la ventana del compositor
130enfocada, maneja el escritorio con atajos `Super+…`: el lanzador de
131aplicaciones `Super+p`, una terminal `Super+Shift+Return`, foco
132`Super+j/k`, los 7 layouts en `Super+t/m/g/c/r/d/s` (o ciclar con
133`Super+space`), área maestra `Super+h/l`, `nmaster` `Super+,/.`,
134promover a maestra `Super+Return`, escritorios `Super+1..9`, cerrar
135`Super+q`. Cierra la ventana del compositor para salir.
136
137## Atajos de teclado
138
139Los atajos son configurables en RON: `~/.config/mirada/keymap.ron`. En
140modo autónomo, el Cuerpo lo carga al arrancar (si no existe, escribe uno
141por defecto documentado) y lo **recarga en caliente** — edita el archivo,
142guarda, y los atajos cambian sin reiniciar. En modo enlazado el keymap es
143asunto del Cerebro (la app `mirada`).
144
145```sh
146cargo run -p mirada-brain --example keymap-default # ver el formato
147```
148
149El compositor en sí no interpreta atajos: sólo intercepta las
150combinaciones que el Cerebro le pide (`GrabKeys`) y le devuelve la
151pulsada. *Qué significa* cada una lo decide `mirada-brain`. Ver el SDD.
152
153## Control externo
154
155En modo autónomo, el compositor abre un socket de control y `mirada-ctl`
156lo maneja desde la terminal — al estilo de `swaymsg`/`hyprctl`:
157
158```sh
159mirada-ctl focus-next # cambia el foco
160mirada-ctl focus-window 5 # enfoca una ventana concreta
161mirada-ctl workspace 3 # va al escritorio 3
162mirada-ctl windows # lista las ventanas
163```
164
165En modo enlazado el socket de control lo abre el Cerebro (la app
166`mirada`), no el compositor.
167
168## Qué implementa
169
170`wl_compositor`, `xdg_shell` (toplevels y popups), `wl_shm`, `wl_seat`
171(teclado, y ratón en el backend DRM), `wl_output`, `wl_data_device`
172(selección) y `xdg-decoration` — fuerza decoración del servidor y no
173dibuja ninguna, así las ventanas van sin barra de título. Composición
174con `GlesRenderer` — en `winit` sobre la ventana, en `drm` con un
175`DrmCompositor` por salida.
176
177Reusa `mirada-body` para la contabilidad de salidas y superficies, y
178`mirada-link` para el cable hacia un Cerebro externo. Toda la lógica
179espacial es agnóstica de Wayland y vive en los crates de
180`crates/modules/mirada/`.
181
182## Pendiente
183
184Del backend DRM: conmutación de VT, hotplug de monitores, multi-GPU.
185Puntero en el backend `winit`. Aislamiento de clientes. Ver el SDD.
186
187[`smithay`]: https://github.com/Smithay/smithay
README.md
mirada-compositor — el Cuerpo de carmen
Un compositor Wayland teselante real, sobre smithay. Es el Cuerpo
de la arquitectura Cerebro↔Cuerpo de mirada (ver
crates/modules/mirada/SDD.md): habla el protocolo Wayland con los
clientes, compone sus superficies y aplica la geometría que decide el
Cerebro.
Tiene dos backends gráficos:
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.
Sin argumentos elige solo: con DISPLAY/WAYLAND_DISPLAY → winit;
sin ellos → drm. O fuérzalo: mirada-compositor --winit / --drm.
Backends
winit — anidado
cargo run -p mirada-compositor -- --winit
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
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.
Lleva teclado y ratón por libinput: el foco sigue al puntero y los
clics y la rueda llegan a la ventana que tienes debajo. El cursor toma
la forma que pide el cliente (la «I» sobre texto, una mano…) y cae a un
cuadrado por defecto sobre el escritorio. Super+arrastre con el
botón izquierdo mueve una ventana, con el derecho la redimensiona — al
arrastrarla, la ventana pasa a flotar. Cada ventana lleva un marco
fino: azul la que tiene el foco, gris las demás.
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).
Como sesión de escritorio
Para usar carmen como tu escritorio de verdad — entrar a una sesión, no
sólo probarlo:
-
Compila e instala los binarios en el PATH:
cargo build --release -p mirada-compositor -p mirada-ctl -p mirada-launcher
sudo install -m755 target/release/mirada-compositor \
target/release/mirada-ctl target/release/mirada-launcher /usr/local/bin/
sudo install -m755 session/mirada-session /usr/local/bin/
-
Arranca desde una TTY:
mirada-session
O regístralo en un gestor de login copiando session/carmen.desktop
a /usr/share/wayland-sessions/ — aparecerá carmen como sesión.
-
Autoarranque — los programas que quieras al iniciar van en
~/.config/mirada/autostart, uno por línea (# comenta). Tienes un
ejemplo en session/autostart.example:
mkdir -p ~/.config/mirada
cp crates/apps/mirada-compositor/session/autostart.example \
~/.config/mirada/autostart
Dentro de la sesión, Ctrl+Alt+F1…F12 salta a otra TTY y vuelve sin
romper carmen.
Lanzador de aplicaciones
mirada-launcher escanea los .desktop del sistema y lanza el que
elijas. Es un programa de terminal sin dependencias: lo abres en una
terminal pequeña y filtras escribiendo. El keymap por defecto ata
Super+p a spawn:foot -e mirada-launcher — pulsa el atajo, escribe
unas letras del nombre, Enter.
Necesita mirada-launcher y foot en el PATH (ver la instalación de
arriba). Suelto también vale: mirada-launcher en cualquier terminal.
Dos modos
-
Autónomo (por defecto) — lleva un Desktop (de mirada-brain)
embebido. Es un compositor teselante completo en un solo proceso.
cargo run -p mirada-compositor
-
Enlazado — el Cuerpo escucha en un socket y la app mirada (el
Cerebro GPUI) se conecta y decide la geometría.
# terminal 1 — el Cuerpo
MIRADA_SOCKET=/tmp/mirada.sock cargo run -p mirada-compositor
# terminal 2 — el Cerebro
MIRADA_SOCKET=/tmp/mirada.sock cargo run -p mirada
Probarlo
Al arrancar imprime el WAYLAND_DISPLAY que abrió. Lanza cualquier
cliente Wayland contra él:
WAYLAND_DISPLAY=wayland-1 foot # o weston-terminal, alacritty, …
Las ventanas se teselan solas. El teclado, con la ventana del compositor
enfocada, maneja el escritorio con atajos Super+…: el lanzador de
aplicaciones Super+p, una terminal Super+Shift+Return, foco
Super+j/k, los 7 layouts en Super+t/m/g/c/r/d/s (o ciclar con
Super+space), área maestra Super+h/l, nmaster Super+,/.,
promover a maestra Super+Return, escritorios Super+1..9, cerrar
Super+q. Cierra la ventana del compositor para salir.
Atajos de teclado
Los atajos son configurables en RON: ~/.config/mirada/keymap.ron. En
modo autónomo, el Cuerpo lo carga al arrancar (si no existe, escribe uno
por defecto documentado) y lo recarga en caliente — edita el archivo,
guarda, y los atajos cambian sin reiniciar. En modo enlazado el keymap es
asunto del Cerebro (la app mirada).
cargo run -p mirada-brain --example keymap-default # ver el formato
El compositor en sí no interpreta atajos: sólo intercepta las
combinaciones que el Cerebro le pide (GrabKeys) y le devuelve la
pulsada. Qué significa cada una lo decide mirada-brain. Ver el SDD.
Control externo
En modo autónomo, el compositor abre un socket de control y mirada-ctl
lo maneja desde la terminal — al estilo de swaymsg/hyprctl:
mirada-ctl focus-next # cambia el foco
mirada-ctl focus-window 5 # enfoca una ventana concreta
mirada-ctl workspace 3 # va al escritorio 3
mirada-ctl windows # lista las ventanas
En modo enlazado el socket de control lo abre el Cerebro (la app
mirada), no el compositor.
Qué implementa
wl_compositor, xdg_shell (toplevels y popups), wl_shm, wl_seat
(teclado, y ratón en el backend DRM), wl_output, wl_data_device
(selección) y xdg-decoration — fuerza decoración del servidor y no
dibuja ninguna, así las ventanas van sin barra de título. 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
espacial es agnóstica de Wayland y vive en los crates de
crates/modules/mirada/.
Pendiente
Del backend DRM: conmutación de VT, hotplug de monitores, multi-GPU.
Puntero en el backend winit. Aislamiento de clientes. Ver el SDD.