From 516610b3079732b50a2fdabfc05c71e83379eac9 Mon Sep 17 00:00:00 2001 From: sergio Date: Mon, 3 Aug 2026 13:49:44 -0400 Subject: [PATCH] =?UTF-8?q?cosmic:=20cosmic-panel=20sell=C3=B3=20y=20no=20?= =?UTF-8?q?pint=C3=B3=20=E2=80=94=20le=20faltaban=20los=20HIJOS,=20no=20un?= =?UTF-8?q?a=20librer=C3=ADa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- recipes/incoming-cosmic/cosmic-applets.toml | 76 +++++++++++++++++++++ scripts/cosmic/hydrate-cosmic.sh | 1 + 2 files changed, 77 insertions(+) create mode 100644 recipes/incoming-cosmic/cosmic-applets.toml 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