cosmic: cosmic-panel selló y no pintó — le faltaban los HIJOS, no una librería
cosmic-panel (b3:ac5e48c5) arranca perfecto: lee su config, crea su wl_output, dice 'Spawning applets' y 'Done spawning applets'. Y la pantalla no cambió ni un color. La respuesta estaba en esa misma línea: spawnea TRECE clientes por AppID y ninguno existía. Un panel sin applets no es un panel vacío, es un panel que no tiene nada que medir y no se dibuja. Es la misma forma del muro de los typelibs en GNOME: un componente puede arrancar sin errores y no pintar porque lo que le falta es un HIJO. El log del padre se lee sano. La receta cubre el panel entero de una: upstream compila UN binario multiplexor y cada applet es un symlink con el nombre que el panel invoca; despacha por argv[0]. Veinte symlinks, dos binarios. Fase compile custom porque hay que construir DOS targets (los default-members) y 'cargo rustc --' sólo admite uno. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Semántico sayk'uy
Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.
2 qillqakuna · +77 −0
diff --git a/recipes/incoming-cosmic/cosmic-applets.toml b/recipes/incoming-cosmic/cosmic-applets.toml
new file mode 100644
index 00000000..278f173c
--- /dev/null
+++ b/recipes/incoming-cosmic/cosmic-applets.toml
@@ -0,0 +1,76 @@
+# cosmic-applets — los applets del panel: reloj, audio, red, batería, workspaces, botón de apps…
+#
+# ── POR QUÉ APARECE RECIÉN AHORA, Y CÓMO SE SUPO ────────────────────────────────────────────────
+# `cosmic-panel` selló y arrancó **perfecto** —lee su config, crea su `wl_output`, dice «Spawning
+# applets», «Done spawning applets»— y la pantalla no cambió ni un color. La respuesta estaba en esa
+# misma línea: el panel spawnea TRECE clientes por AppID (`CosmicAppletTime`, `CosmicAppletAudio`,
+# `CosmicPanelAppButton`…) y **ninguno existía**. Un panel sin applets no es un panel vacío: es un
+# panel que no tiene nada que medir, así que no se dibuja.
+#
+# La lección, que ya apareció en GNOME con los typelibs: **un componente puede arrancar sin errores y
+# no pintar porque lo que le falta es un HIJO, no una librería.** El log del padre se lee sano.
+#
+# ── UN BINARIO, VEINTE NOMBRES ──────────────────────────────────────────────────────────────────
+# El diseño de upstream es un multiplexor: se compila UN `cosmic-applets` y cada applet es un
+# **symlink** con el nombre que el panel invoca (`just _link_applet` = `ln -sf`); el binario despacha
+# por `argv[0]`. Por eso el install de abajo son veinte symlinks y no veinte copias — y por eso una
+# sola receta cubre todo el panel.
+#
+# `cosmic-panel-button` es el segundo miembro por defecto del workspace: es el que provee los tres
+# botones (apps, launcher, workspaces), que no son applets sino otra cosa con el mismo mecanismo.
+name = "cosmic-applets"
+version = "1.5.0"
+
+[source]
+tarball = "https://github.com/pop-os/cosmic-applets/archive/epoch-1.5.0/cosmic-applets-epoch-1.5.0.tar.gz"
+sha256 = "ac9328e58f5e9cb9c7561a2ce4af212d4916d97c820741f0959366c7e1a0e3ba"
+
+[build]
+compiler = "zig-cc"
+target = "x86_64-linux-musl"
+link = "dynamic"
+
+[build.phases]
+# Fase compile CUSTOM, y por un motivo concreto: hay que construir DOS binarios (`cosmic-applets` y
+# `cosmic-panel-button`, los `default-members` del workspace) y `cargo rustc --` sólo admite uno. Se
+# usa `cargo build`, replicando a mano el setup del lab —el wrapper zig-cc que sanea el triple de
+# Alpine y el `-crt-static`— porque `resolve_phases` no autogenera la fase si la receta la trae.
+#
+# `-C target-feature=-crt-static` va en RUSTFLAGS y no tras `--`: acá es SEGURO al revés que en
+# helix, porque lo que rompe los proc-macros es forzar `+crt-static` (un proc-macro es un dylib PIC);
+# desactivarlo es justo lo que ya necesitan.
+compile = '''
+printf '%s\n' '#!/bin/sh' 'for a do' 'case "$a" in --target=*) a=--target=x86_64-linux-musl ;; esac' 'set -- "$@" "$a"' 'shift' 'done' 'exec zig cc -mcpu=baseline "$@"' > "$PWD/.hammer-zig-cc"
+chmod +x "$PWD/.hammer-zig-cc"
+RF="-C linker=$PWD/.hammer-zig-cc -C target-feature=-crt-static"
+rustc -vV | grep -q 'host: .*-alpine-' || RF="$RF -C link-self-contained=no"
+CC="$PWD/.hammer-zig-cc" RUSTFLAGS="$RF" cargo build --release --locked --offline
+'''
+# El `just install` traducido. Los `.desktop` los genera el build en `target/xdgen/`; se copian si
+# están (`|| true`) en vez de exigirlos, porque su ausencia no impide que el panel spawnee al applet
+# —lo invoca por nombre de binario— y sí haría fallar el sellado por un fichero decorativo.
+install = '''
+mkdir -p /out/usr/bin /out/usr/share/applications /out/usr/share/icons \
+ /out/usr/share/dbus-1/services /out/usr/share/dbus-1/system.d
+cp target/release/cosmic-applets /out/usr/bin/cosmic-applets
+cp target/release/cosmic-panel-button /out/usr/bin/cosmic-panel-button
+chmod 755 /out/usr/bin/cosmic-applets /out/usr/bin/cosmic-panel-button
+for a in cosmic-app-list cosmic-applet-a11y cosmic-applet-audio cosmic-applet-input-sources \
+ cosmic-applet-battery cosmic-applet-bluetooth cosmic-applet-minimize \
+ cosmic-applet-network cosmic-applet-notifications cosmic-applet-power \
+ cosmic-applet-status-area cosmic-applet-tiling cosmic-applet-time \
+ cosmic-applet-workspaces cosmic-panel-button; do
+ ln -sf cosmic-applets /out/usr/bin/$a
+done
+# El panel invoca los tres botones por su propio nombre, no por el del multiplexor.
+for b in cosmic-panel-app-button cosmic-panel-launcher-button cosmic-panel-workspaces-button; do
+ ln -sf cosmic-panel-button /out/usr/bin/$b
+done
+[ -d target/xdgen ] && cp target/xdgen/*.desktop /out/usr/share/applications/ 2>/dev/null || true
+for d in */data/icons; do [ -d "$d" ] && cp -r "$d"/. /out/usr/share/icons/ 2>/dev/null || true; done
+[ -d cosmic-app-list/data/default_schema ] && mkdir -p /out/usr/share/cosmic && cp -r cosmic-app-list/data/default_schema/. /out/usr/share/cosmic/ 2>/dev/null || true
+cp cosmic-applet-network/data/dbus-1/system.d/*.conf /out/usr/share/dbus-1/system.d/ 2>/dev/null || true
+'''
+
+[deps]
+build = ["libxkbcommon", "pkgconf", "libudev-zero", "libinput"]
diff --git a/scripts/cosmic/hydrate-cosmic.sh b/scripts/cosmic/hydrate-cosmic.sh
index 3f1cae7c..ab82fabd 100644
--- a/scripts/cosmic/hydrate-cosmic.sh
+++ b/scripts/cosmic/hydrate-cosmic.sh
@@ -35,6 +35,7 @@ else
# Componentes que `cosmic-session/src/main.rs` levanta, en el orden en que los levanta.
recipes/incoming-cosmic/cosmic-bg.toml
recipes/incoming-cosmic/cosmic-idle.toml
+ recipes/incoming-cosmic/cosmic-panel.toml
# Ni binario ni librería: DATOS. El tema de iconos de COSMIC — sin él el escritorio no se ve
# «sin iconos», se ve roto, y con el cursor por software ni siquiera hay puntero.
recipes/incoming-cosmic/cosmic-icons.toml