diff --git a/docs/evidencia/cosmic-pop-launcher-calc-qemu-2026-08-04.png b/docs/evidencia/cosmic-pop-launcher-calc-qemu-2026-08-04.png new file mode 100644 index 00000000..6fbef199 Binary files /dev/null and b/docs/evidencia/cosmic-pop-launcher-calc-qemu-2026-08-04.png differ diff --git a/docs/evidencia/cosmic-pop-launcher-plugins-qemu-2026-08-04.png b/docs/evidencia/cosmic-pop-launcher-plugins-qemu-2026-08-04.png new file mode 100644 index 00000000..c6bf5193 Binary files /dev/null and b/docs/evidencia/cosmic-pop-launcher-plugins-qemu-2026-08-04.png differ diff --git a/docs/evidencia/cosmic-super-lanzador-qemu-2026-08-04.png b/docs/evidencia/cosmic-super-lanzador-qemu-2026-08-04.png new file mode 100644 index 00000000..80c5816a Binary files /dev/null and b/docs/evidencia/cosmic-super-lanzador-qemu-2026-08-04.png differ diff --git a/docs/runbooks/cosmic-desktop.md b/docs/runbooks/cosmic-desktop.md index d50b1c29..c315a3ce 100644 --- a/docs/runbooks/cosmic-desktop.md +++ b/docs/runbooks/cosmic-desktop.md @@ -106,8 +106,9 @@ Más `cosmic-settings-daemon` y `xdg-desktop-portal-cosmic` fuera de esa lista. | `cosmic-app-library` | ✅ sellado | `b3:b2a163e7` | | `cosmic-workspaces-epoch` | ✅ sellado (necesitó `mesa`, ver gotcha 11) | `b3:a031249e` | | **`cosmic-applets`** (19 binarios en uno) | ✅ **sellado** (necesitó `dbus-shared`, ver gotcha 10) | `b3:3e53a325` | +| `pop-launcher` 1.2.7 (otro repo, ver abajo) | ✅ sellado a la primera | `b3:64a5cbaa` | -**La cola está COMPLETA: 26 recetas, `escritorio-cosmic` 62/62.** +**La cola está COMPLETA: 27 recetas, `escritorio-cosmic` 63/63.** **El mínimo viable de una sesión son cuatro**: `cosmic-comp` + `cosmic-settings-daemon` + `cosmic-notifications` + `cosmic-panel` (los tres `.expect` de la tabla de arriba). @@ -447,10 +448,36 @@ es de qué fichero son, no dónde más aparece esa palabra.* **Es el riesgo del pin lockstep asomando desde adentro de upstream**: el dato y el parser del *mismo* epoch no coinciden. -**`Super` a secas sigue sin abrir nada, y no es un bug nuestro**: liga `System(Launcher)`, y -`cosmic-launcher` es sólo la interfaz — el motor de búsqueda es **`pop-launcher`**, un binario aparte -que el catálogo todavía no tiene (`pop-launcher failed to start: No such file or directory`). Los -atajos andan; lo que falta es el paquete. +**`Super` abre el lanzador** — pero hizo falta un paquete más, y de otro repo: ver abajo. + +### 🔎 `pop-launcher`: el lanzador es DOS programas + +`Super` no abría nada y el único rastro era una línea que no menciona ninguna tecla: +`ERROR pop-launcher failed to start: No such file or directory`. **`cosmic-launcher` es sólo la +interfaz**: dibuja la lista y manda lo tecleado por stdin a un proceso hijo, `pop-launcher`, que es +quien busca. Sin ese binario la ventana no tiene qué mostrar, así que no se muestra — el mismo modo +de falla que el panel sin applets: *lo que falta es un HIJO, no una librería, y el log del padre se +lee sano.* + +Vive en **otro repo** (`pop-os/launcher`), no versiona por `epoch-N` y no entra en el pin lockstep. +**La versión la fija el `Cargo.lock` de cosmic-launcher** —rev `a332a3a7` de la 1.2.7—, no el último +tag del repo: el lock es lo que garantiza que hablen el mismo protocolo. El tarball se pide por +commit (`/archive/.tar.gz`), porque no hay tag que nombre esa rev. Selló a la primera +(`b3:64a5cbaa`) con **un solo `NEEDED`: `libc.so`**. + +Es otro **multiplexor por symlink**, como cosmic-applets: un binario, y cada plugin es un enlace con +su nombre dentro de su propio directorio junto al `plugin.ron` que lo describe. El servicio enumera +`plugins/*/`; si está el `.ron` y falta el enlace —o al revés— el plugin no existe para él, **sin +error**. Ojo con el `sed 's/_/-/'` de upstream: cambia sólo el primer guión bajo, así que el +directorio es `desktop_entries` y el ejecutable de adentro `desktop-entries`. Son dos nombres +distintos a propósito. + +Verificado de punta a punta (`cosmic-super-lanzador-`, `cosmic-pop-launcher-plugins-`, +`cosmic-pop-launcher-calc-qemu-2026-08-04.png`): `Super` abre el lanzador, `?` lista los seis plugins +con su sintaxis —o sea que la enumeración y el IPC JSON-sobre-stdio andan— y `=2+2` **lanza el +plugin, que contesta «qalc command is not installed»**. Esa respuesta es la mejor prueba que había +disponible: el proceso hijo corrió, evaluó la consulta y devolvió una fila. Lo que falta ahora es +`libqalculate` (el binario `qalc`), que es un paquete, no un problema. ### ⏱ El panel tiene un DEADLINE de arranque: con 4 vCPU sale mutilado @@ -468,7 +495,10 @@ El número de procesos no distingue «arrancó» de «dibujó». El framebuffer ## Lo que falta, en orden -1. `xdg-desktop-portal-cosmic` — sin él no hay captura de pantalla, ni file-chooser, ni compartir. +1. **Aplicaciones.** No hay ni una: los 20 `.desktop` de la imagen son `NoDisplay=true`. El primer + candidato barato es `libqalculate` (el binario `qalc`), que es lo único que le falta al plugin de + la calculadora para dar un resultado en vez de decir que no está. +2. `xdg-desktop-portal-cosmic` — sin él no hay captura de pantalla, ni file-chooser, ni compartir. 3. `cosmic-settings` (el panel de control) y `cosmic-files`: la suite tiene aplicaciones y el catálogo todavía no. 4. `cosmic-greeter` (hoy `cosmic-session` lo lanza y falla con ENOENT, sin consecuencias) y diff --git a/docs/state/build-state-cosmic.json b/docs/state/build-state-cosmic.json index 9b2142a6..5b9ddc45 100644 --- a/docs/state/build-state-cosmic.json +++ b/docs/state/build-state-cosmic.json @@ -37,9 +37,9 @@ "sealed": 74 }, "escritorio-cosmic": { - "raices": 18, - "clausura": 62, - "sealed": 62 + "raices": 19, + "clausura": 63, + "sealed": 63 }, "escritorio-mirada": { "raices": 14, @@ -47,7 +47,7 @@ "sealed": 31 } }, - "sin_perfil": 650, + "sin_perfil": 649, "orphan_deps": [], "topo_ok": true, "nodes": { @@ -10658,7 +10658,9 @@ "state": "sealed", "blocked_by": [], "unblocks": 0, - "perfiles": [], + "perfiles": [ + "escritorio-cosmic" + ], "dependientes_total": 0 }, "popeye": { diff --git a/docs/state/targets.toml b/docs/state/targets.toml index 98c5f915..956f1728 100644 --- a/docs/state/targets.toml +++ b/docs/state/targets.toml @@ -101,6 +101,9 @@ paquetes = [ # Los applets del panel. No es un componente que la sesión lance: lo spawnea el PANEL, por AppID, # y sin ellos arranca y no se dibuja. Un binario multiplexor con veinte symlinks. "cosmic-applets", + # El MOTOR del lanzador, de otro repo y fuera del pin `epoch-N`: `cosmic-launcher` sólo dibuja y + # lanza a `pop-launcher` como proceso hijo por PATH. Sin él, `Super` no abre nada. + "pop-launcher", # Datos, no binarios: el tema de iconos (y el hicolor del que hereda), las tablas de xkb y una # tipografía. Ninguno es dep de build de nadie y sin ellos el escritorio arranca roto — sin puntero, # sin teclado o con tofu. diff --git a/recipes/incoming-cosmic/pop-launcher.toml b/recipes/incoming-cosmic/pop-launcher.toml new file mode 100644 index 00000000..577a480a --- /dev/null +++ b/recipes/incoming-cosmic/pop-launcher.toml @@ -0,0 +1,68 @@ +# pop-launcher — el MOTOR del lanzador. No es de la suite COSMIC y por eso casi se pasa por alto. +# +# ── POR QUÉ APARECE RECIÉN AHORA ──────────────────────────────────────────────────────────────── +# `cosmic-launcher` selló, arranca, se registra en el bus… y `Super` no abre nada. La razón está en +# una línea del serial que no menciona ninguna tecla: +# ERROR pop-launcher failed to start: No such file or directory (os error 2) +# `cosmic-launcher` es **sólo la interfaz**: dibuja la lista y manda lo que tecleás por stdin a un +# proceso hijo, `pop-launcher`, que es quien busca. Sin ese binario la ventana no tiene nada que +# mostrar, así que no se muestra. Mismo modo de falla que el panel sin applets: **el componente que +# falta es un HIJO, no una librería**, y el log del padre se lee sano. +# +# Vive en OTRO repo (`pop-os/launcher`), no versiona por `epoch-N` y no entra en el pin lockstep de +# la suite: la versión la fija el `Cargo.lock` de cosmic-launcher, que pinea la rev exacta +# `a332a3a7` de la 1.2.7. Ese lock es la fuente de verdad — no el último tag del repo, que podría +# hablar otro protocolo con la interfaz que ya tenemos sellada. +name = "pop-launcher" +version = "1.2.7" + +[source] +# Tarball por COMMIT, no por tag: la rev sale del Cargo.lock de cosmic-launcher y no hay tag que la +# nombre. GitHub sirve `/archive/.tar.gz` igual que los de tag, y el sha256 de abajo lo ancla. +tarball = "https://github.com/pop-os/launcher/archive/a332a3a73316a3595816dd02fe426a1d3543167a.tar.gz" +sha256 = "adff78338a1680d9efa068741f6a95458b21e8278d96f4903f06004fda8ad7c6" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +# DINÁMICO, por la misma razón que todo cliente de la suite: el plugin `cosmic_toplevel` entra con +# `cctk`/`sctk`, que traen `wayland-client` con la feature `dlopen`. Un musl estático no la honra. +link = "dynamic" +# El binario se llama `pop-launcher-bin` (paquete `bin/` del workspace) y se INSTALA como +# `pop-launcher`. Los tres nombres —paquete, binario compilado, binario instalado— no coinciden, y el +# que importa para que la interfaz lo encuentre es el último. `-p` además de `--bin` porque el +# workspace tiene cuatro miembros y `cargo rustc` exige un único target cuando hay flags tras `--`. +flags = ["-p", "pop-launcher-bin", "--bin", "pop-launcher-bin"] + +[build.phases] +# El `just install` traducido, con `rootdir=/` (o sea `/usr`, no `~/.local`). +# +# ⚠ EL DISEÑO ES UN MULTIPLEXOR POR SYMLINK, igual que cosmic-applets: hay UN binario y cada plugin +# es un enlace con su nombre dentro de su propio directorio, junto al `plugin.ron` que lo describe. +# El servicio enumera `plugins/*/` y ejecuta el enlace; si el `.ron` está y el enlace no —o al revés— +# el plugin simplemente no existe para él, sin error. Por eso van los dos, y por eso el bucle no se +# puede "simplificar" a copiar los .ron sueltos. +# +# El `sed 's/_/-/'` de upstream cambia SÓLO el primer guión bajo, y así queda: `desktop_entries` es +# el directorio y `desktop-entries` el ejecutable de adentro. No es un descuido: son dos nombres +# distintos a propósito. +install = ''' +mkdir -p /out/usr/bin /out/usr/lib/pop-launcher/plugins /out/usr/lib/pop-launcher/scripts +cp target/release/pop-launcher-bin /out/usr/bin/pop-launcher +chmod 755 /out/usr/bin/pop-launcher +for p in calc desktop_entries files find pop_shell pulse recent scripts terminal web cosmic_toplevel; do + mkdir -p /out/usr/lib/pop-launcher/plugins/$p + cp plugins/src/$p/*.ron /out/usr/lib/pop-launcher/plugins/$p/ + ln -sf /usr/bin/pop-launcher "/out/usr/lib/pop-launcher/plugins/$p/$(echo $p | sed 's/_/-/')" +done +cp -r scripts/. /out/usr/lib/pop-launcher/scripts/ 2>/dev/null || true +''' + +[deps] +# El juego fijo de todo cliente de la suite. `sctk`/`cctk` (plugin cosmic_toplevel) enlazan +# xkbcommon; udev/input llegan por la misma cadena. NO hace falta openssl: `reqwest` entra con +# `default-features = false` y `rustls-tls`, o sea TLS en Rust puro — al revés que +# cosmic-settings-daemon, que sí lo arrastra por native-tls. +# Tampoco hace falta pulseaudio pese al plugin `pulse`: habla con el servidor por su protocolo, no +# por libpulse. +build = ["libxkbcommon", "pkgconf", "libudev-zero", "libinput"] diff --git a/scripts/cosmic/hydrate-cosmic.sh b/scripts/cosmic/hydrate-cosmic.sh index 06d2bece..377530a2 100755 --- a/scripts/cosmic/hydrate-cosmic.sh +++ b/scripts/cosmic/hydrate-cosmic.sh @@ -49,6 +49,9 @@ else # Los tres que esos botones abren al hacer clic. No matan la sesión si faltan (el botón queda # muerto), pero un escritorio sin lanzador ni biblioteca de apps no se puede usar. recipes/incoming-cosmic/cosmic-launcher.toml + # …y su MOTOR, que es otro binario y de otro repo: cosmic-launcher sólo dibuja, `pop-launcher` + # busca. Lo lanza como proceso hijo por PATH, así que —otra vez— ningún grafo de deps lo ve. + recipes/incoming-cosmic/pop-launcher.toml recipes/incoming-cosmic/cosmic-app-library.toml recipes/incoming-cosmic/cosmic-workspaces-epoch.toml # Ni binario ni librería: DATOS. El tema de iconos de COSMIC — sin él el escritorio no se ve