From b1bbdefc859b5ff710ff23147c252dfdef8e51ce Mon Sep 17 00:00:00 2001 From: sergio Date: Mon, 3 Aug 2026 10:50:46 -0400 Subject: [PATCH] =?UTF-8?q?cosmic:=20sctk=20ENLAZA=20libxkbcommon=20?= =?UTF-8?q?=E2=80=94=20=C2=ABhabla=20Wayland=20en=20Rust=C2=BB=20no=20quie?= =?UTF-8?q?re=20decir=20=C2=ABno=20toca=20C=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cosmic-bg se escribió sin [deps] con ese argumento y reventó en el build.rs de smithay-client-toolkit pidiendo xkbcommon.pc. El que dlopea xkbcommon es winit, que es otra capa. Hablar el protocolo en Rust dice cómo viaja el byte, no con qué se interpreta un teclado. El link=static sigue siendo verdad: el artefacto de libxkbcommon trae .a además de .so. Corolario anotado en el runbook: todo cliente de la suite va a necesitar al menos libxkbcommon + pkgconf. Entran además cosmic-idle (cliente Wayland puro, SIN deps a propósito: no usa sctk y no necesita interpretar teclas) y cosmic-osd, que es el primer cliente de iced/libcosmic y por eso vale como sonda: panel, launcher, app-library, workspaces y notifications comparten su mismo sustrato exacto. Co-Authored-By: Claude Opus 5 (1M context) --- docs/runbooks/cosmic-desktop.md | 6 ++++ recipes/incoming-cosmic/cosmic-bg.toml | 11 +++++++- recipes/incoming-cosmic/cosmic-idle.toml | 27 ++++++++++++++++++ recipes/incoming-cosmic/cosmic-osd.toml | 35 ++++++++++++++++++++++++ 4 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 recipes/incoming-cosmic/cosmic-idle.toml create mode 100644 recipes/incoming-cosmic/cosmic-osd.toml diff --git a/docs/runbooks/cosmic-desktop.md b/docs/runbooks/cosmic-desktop.md index 7478d131..a64dd2e6 100644 --- a/docs/runbooks/cosmic-desktop.md +++ b/docs/runbooks/cosmic-desktop.md @@ -95,6 +95,12 @@ separa la capa de UI del transporte; sin él, las dos preguntas llegan juntas. 6. **Las features de smithay que asustan no cuestan deps de build**: `backend_vulkan` (crate `ash`), `backend_x11` (`x11rb` con `dl-libxcb`) y `xwayland` cargan todo por **dlopen**. Son deuda de RUNTIME —libxcb y vulkan-loader viven hoy sólo en la cola KDE—, no un muro de compilación. +7. **«Habla Wayland en Rust» ≠ «no toca C».** cosmic-bg se escribió sin `[deps]` con ese argumento y + reventó en el `build.rs` de `smithay-client-toolkit` pidiendo `xkbcommon.pc`: **sctk ENLAZA + libxkbcommon**; el que la dlopea es `winit`, que es otra capa. Hablar el protocolo en Rust dice + cómo viaja el byte, no con qué se interpreta un teclado. `libxkbcommon` + `pkgconf` en `[deps]`, y + el `link = "static"` sigue siendo verdad porque su artefacto trae `.a` además de `.so`. + **Corolario para el resto de la cola: todo cliente de la suite va a necesitar al menos esos dos.** ## Cómo se construye diff --git a/recipes/incoming-cosmic/cosmic-bg.toml b/recipes/incoming-cosmic/cosmic-bg.toml index 98fe7bb2..f5958b59 100644 --- a/recipes/incoming-cosmic/cosmic-bg.toml +++ b/recipes/incoming-cosmic/cosmic-bg.toml @@ -7,7 +7,13 @@ # imágenes con crates puros (image, jxl-oxide, fast_image_resize). **No toca libcosmic ni iced.** # Así que si el fondo pinta y el panel no, el problema es de la capa de UI, no del transporte. # -# De ahí que vaya `link = "static"`, a diferencia del compositor: acá no hay una sola dep en C. +# ── PERO NO ES RUST PURO, Y ESO SE MIDIÓ, NO SE SUPUSO ────────────────────────────────────────── +# El primer intento salió sin `[deps]` con el argumento «un cliente Wayland en Rust no toca C», y +# reventó en el `build.rs` de smithay-client-toolkit pidiendo `xkbcommon.pc`. **sctk ENLAZA +# libxkbcommon; no la dlopea** — el que la dlopea es winit, que es otra capa. La regla que sale: +# «habla el protocolo en Rust» dice cómo viaja el byte, no con qué se interpreta un teclado. +# Como el artefacto de libxkbcommon trae `.a` además de `.so`, el `link = "static"` sigue siendo +# verdad y no una etiqueta. # # El árbol es un workspace con `config/` como miembro (cosmic-bg-config), que es lo que leen los # demás componentes para saber qué fondo hay puesto. Los defaults van a `/usr/share/cosmic//` @@ -34,3 +40,6 @@ cp target/release/cosmic-bg /out/usr/bin/cosmic-bg chmod 755 /out/usr/bin/cosmic-bg cd data && find v1 -type f -exec install -Dm0644 {} /out/usr/share/cosmic/com.system76.CosmicBackground/{} \; ''' + +[deps] +build = ["libxkbcommon", "pkgconf"] diff --git a/recipes/incoming-cosmic/cosmic-idle.toml b/recipes/incoming-cosmic/cosmic-idle.toml new file mode 100644 index 00000000..a592db81 --- /dev/null +++ b/recipes/incoming-cosmic/cosmic-idle.toml @@ -0,0 +1,27 @@ +# cosmic-idle — el que apaga la pantalla y dispara el bloqueo por inactividad. Cliente Wayland puro: +# `wayland-client` + los protocolos `staging`/`wlr` de idle-notify, `calloop` para el bucle, y zbus +# contra UPower para saber si hay batería. +# +# Sin `[deps]` a propósito y no por descuido: a diferencia de cosmic-bg NO usa smithay-client-toolkit +# —que es quien enlaza libxkbcommon (ver el gotcha 7 del runbook)—, y no necesita interpretar teclas: +# le alcanza con que el compositor le avise que nadie tocó nada. Si el build pide un `.pc`, el que lo +# pide se ve en el `build.rs` que panickea, y eso es un dato, no una conjetura. +name = "cosmic-idle" +version = "1.5.0" + +[source] +tarball = "https://github.com/pop-os/cosmic-idle/archive/epoch-1.5.0/cosmic-idle-epoch-1.5.0.tar.gz" +sha256 = "f6eab0ed81bba6bd3a6dfb3ec78471a152852c59e6887a74206f4b59865df7c1" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "static" +flags = ["--bin", "cosmic-idle"] + +[build.phases] +install = ''' +mkdir -p /out/usr/bin +cp target/release/cosmic-idle /out/usr/bin/cosmic-idle +chmod 755 /out/usr/bin/cosmic-idle +''' diff --git a/recipes/incoming-cosmic/cosmic-osd.toml b/recipes/incoming-cosmic/cosmic-osd.toml new file mode 100644 index 00000000..ac09387c --- /dev/null +++ b/recipes/incoming-cosmic/cosmic-osd.toml @@ -0,0 +1,35 @@ +# cosmic-osd — los avisos flotantes de volumen, brillo y bloqueo de mayúsculas. **Es el primer cliente +# de iced/libcosmic de la cola, y por eso importa más de lo que su función sugiere.** +# +# Panel, launcher, app-library, workspaces y notifications comparten exactamente el mismo sustrato +# (`libcosmic` con `winit` + `wayland` + `multi-window`), así que lo que cueste acá lo cuestan todos y +# lo que salga gratis acá sale gratis cinco veces. Se elige el OSD como sonda por ser el más chico de +# los seis: mismo muro, menos superficie propia donde perderse si falla. +# +# `default-features = false` en su declaración de libcosmic no es un detalle: deja afuera el renderer +# `wgpu`, así que la pintura es por CPU (tiny-skia) y NO hace falta Vulkan en build. Es la misma +# postura que ya obligó QEMU en las campañas KDE y GNOME, pero acá viene elegida por upstream. +# +# `libxkbcommon` + `pkgconf` por el gotcha 7 del runbook: winit/sctk ENLAZAN xkbcommon. +name = "cosmic-osd" +version = "1.5.0" + +[source] +tarball = "https://github.com/pop-os/cosmic-osd/archive/epoch-1.5.0/cosmic-osd-epoch-1.5.0.tar.gz" +sha256 = "de1a409c95305059f0c79f1dff0089f7cf6aaf9b2b7201e982da9895d58ad4a3" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "static" +flags = ["--bin", "cosmic-osd"] + +[build.phases] +install = ''' +mkdir -p /out/usr/bin +cp target/release/cosmic-osd /out/usr/bin/cosmic-osd +chmod 755 /out/usr/bin/cosmic-osd +''' + +[deps] +build = ["libxkbcommon", "pkgconf"]