cosmic: pop-launcher — el lanzador eran DOS programas, y ahora Super abre

cosmic-launcher sólo dibuja: manda lo tecleado por stdin a un proceso hijo, pop-launcher,
que es quien busca. Sin ese binario la ventana no tiene qué mostrar y no se muestra —
mismo modo de falla que el panel sin applets: falta un HIJO, no una librería, y el log
del padre se lee sano.

Vive en otro repo (pop-os/launcher), fuera del pin epoch-N. La versión la fija el
Cargo.lock de cosmic-launcher (rev a332a3a7 de la 1.2.7), no el último tag: el lock es
lo que garantiza que hablen el mismo protocolo. Tarball por commit, porque no hay tag que
nombre esa rev. Selló a la primera, b3:64a5cbaa, con un solo NEEDED: libc.so.

Verificado de punta a punta: 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
disponible: el hijo corrió, evaluó y devolvió fila. Falta libqalculate, que es un
paquete, no un problema.

Cola 27/27, escritorio-cosmic 63/63.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-04 04:00:12 -04:00
co-authored by Claude Opus 5
parent 78cdc18a8c
commit 505eaf5e44
8 changed files with 117 additions and 11 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

+36 -6
View File
@@ -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/<sha>.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
+7 -5
View File
@@ -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": {
+3
View File
@@ -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.
+68
View File
@@ -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/<sha>.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"]
+3
View File
@@ -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