diff --git a/docs/evidencia/cosmic-screenshot-sin-portal-2026-08-05.png b/docs/evidencia/cosmic-screenshot-sin-portal-2026-08-05.png new file mode 100644 index 00000000..4ff2a54b Binary files /dev/null and b/docs/evidencia/cosmic-screenshot-sin-portal-2026-08-05.png differ diff --git a/docs/runbooks/cosmic-desktop.md b/docs/runbooks/cosmic-desktop.md index 1538c4c5..fd7073bf 100644 --- a/docs/runbooks/cosmic-desktop.md +++ b/docs/runbooks/cosmic-desktop.md @@ -739,15 +739,70 @@ Con el anfitrión ocioso y `-smp 8`, un arranque de esta tanda salió igual muti mucho la probabilidad pero no garantiza**. Si sale mutilado y la carga estaba baja, **rearrancá antes de buscar la causa en tu cambio**. +## 📷 LA SEXTA: cosmic-screenshot, sellada y ROTA A PROPÓSITO (2026-08-05) + +`b3:8b57ec9b`, 9 minutos de build, **`NEEDED` = `libc.so` y nada más** — un solo NEEDED, y el único +`[deps] build = []` de la campaña: 130 líneas de Rust, ni `libxkbcommon` ni `libinput`, porque no +dibuja ni habla wayland. Todo su trabajo es `Screenshot::request()` de `ashpd`. + +**Se incluye en la imagen sabiendo que falla, para que el hueco sea medible.** El error exacto está +en `docs/evidencia/cosmic-screenshot-sin-portal-2026-08-05.png`, corrido desde `cosmic-term` dentro +de la VM: + +``` +panicked at src/main.rs:76:10: failed to send screenshot request: Portal(ZBus(MethodError( + OwnedErrorName("org.freedesktop.DBus.Error.ServiceUnknown"), + Some("The name org.freedesktop.portal.Desktop was not provided by any .service files")))) +``` + +Misma forma que la deuda de `org.freedesktop.locale1` que anota el log de settings: **un nombre de +D-Bus que nadie sirve**. + +### La cadena del portal son TRES eslabones, no dos + +Medido en el fuente de `xdg-desktop-portal-cosmic`: `static DBUS_NAME = +"org.freedesktop.impl.portal.desktop.cosmic"` (`src/main.rs:27`). Es un **backend**; no toma el +nombre que los clientes buscan. La cadena es: + +`cosmic-screenshot` → `org.freedesktop.portal.Desktop` → **xdg-desktop-portal** (frontend, C sobre +GIO) → `org.freedesktop.impl.portal.desktop.cosmic` → **xdp-cosmic** (backend, Rust) + +**Faltan los dos**, y ninguno está en ninguna cola (`xdg-desktop-portal-gnome` sí está, pero es otro +backend). Lo que sí hay para el backend: `pipewire`, `gbm` (mesa) y `wayland` ya en el corpus. Su +único bloqueo real es que declara `cosmic-files` con la feature `gvfs` fijada a mano — el mismo +patrón que ya bloqueó `cosmic-files-applet`, y acá es **un parche de una línea**. + +### ⚠ CORRECCIÓN: la cadena glib COMPARTIDA YA EXISTE Y ESTÁ SELLADA + +Este documento decía que `gvfs` exigía «una campaña propia». **Es falso desde que la campaña KDE +selló las piezas.** Medido con `hammer hash` desde las dos colas, que es el método correcto para +saber si una receta se puede compartir: + +| receta | cola | ¿resuelve igual desde `incoming-cosmic`? | +|---|---|---| +| `glib-shared` 2.88.1 | `incoming-kde` | **sí** — `b3:0584ce1f`, ya sellada | +| `pcre2-shared` | `incoming-kde` | **sí** — `b3:f254abaa`, ya sellada | +| `zlib-shared` | ya en `incoming-cosmic` | — | + +Hash idéntico ⇒ **cero rebuild**: los artefactos sirven tal cual. `libffi` entra estático dentro de +la propia `.so`, así que no hace falta variante compartida (su `libffi` aparece en +`Requires.private`, que pkg-config ignora fuera del modo estático). + +**Pero la decisión sigue teniendo costo y no es técnica:** encender `gvfs` mete una SEGUNDA glib en +la imagen —justo lo que la campaña GNOME midió y evitó— y re-hashea `cosmic-files`, que arrastra a +`cosmic-term` y `cosmic-edit` porque lo usan como crate. + ## Lo que falta, en orden -1. **Más aplicaciones**: `cosmic-screenshot`. -2. **La cadena glib COMPARTIDA** (`glib` + `pcre2` + `libffi` + `zlib` con `.so`), que destrabaría - `gvfs` en cosmic-files y su applet del panel. Es una campaña propia y hay que decidir antes si la - imagen puede tener una sola glib. -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. +1. **La cadena del portal, que es lo que destraba más cosas de una vez**: `xdg-desktop-portal` + (frontend en C sobre GIO — enlaza la glib ESTÁTICA que el corpus ya tiene, el muro de la glib + dinámica es de los crates `*-sys` de Rust, no de un `.c`) y `xdg-desktop-portal-cosmic` (backend + en Rust, con el parche de una línea que le saca `gvfs`). Con eso hay captura de pantalla, + selector de ficheros y compartir pantalla. +2. **Decidir `gvfs`** (ver la corrección de arriba: las piezas ya están selladas, lo que falta es la + decisión sobre la segunda glib). Destrabaría los montajes remotos de cosmic-files y su applet. +3. **Enchufar la tienda a `.swm`**: servir `org.freedesktop.PackageKit` y encender la feature + `packagekit`, que es Rust puro. Mismo patrón que `arje-logind-compat`. 4. `cosmic-greeter` (hoy `cosmic-session` lo lanza y falla con ENOENT, sin consecuencias) y `cosmic-osd` con teclas de brillo/volumen reales. 5. Metal: la imagen de QEMU y la de metal comparten todo menos el driver; el viaje físico es el diff --git a/docs/state/targets.toml b/docs/state/targets.toml index 49eafb19..6aa856b3 100644 --- a/docs/state/targets.toml +++ b/docs/state/targets.toml @@ -124,6 +124,10 @@ paquetes = [ # C (flatpak) ni un demonio ausente (packagekit)— NAVEGA el catálogo instalado leyendo el AppStream # del sistema, pero NO instala: nada está cableado al `.swm` de hammer. "cosmic-store", + # La sexta: la captura de pantalla. Cero C —el único `[deps] build = []` de la campaña— pero HOY + # NO FUNCIONA: todo su trabajo es `Screenshot::request()` contra `org.freedesktop.portal.Desktop`, + # y en la imagen no hay portal. Se lista igual para que el hueco sea visible. + "cosmic-screenshot", # 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/cosmic-screenshot.toml b/recipes/incoming-cosmic/cosmic-screenshot.toml new file mode 100644 index 00000000..533f81b8 --- /dev/null +++ b/recipes/incoming-cosmic/cosmic-screenshot.toml @@ -0,0 +1,62 @@ +# cosmic-screenshot — la captura de pantalla. **La receta más barata de toda la campaña y la más +# inútil por sí sola**, y las dos cosas por la misma razón: no captura nada; le PIDE la captura al +# portal XDG. +# +# ── LO QUE ES: 130 líneas de Rust y cero C ────────────────────────────────────────────────────── +# Sus deps son `ashpd` (cliente de portales sobre zbus), `jiff`, `dirs`, `tokio`, `clap`, `zbus` y el +# andamiaje de i18n. Los únicos `-sys` del lock son `dirs-sys`, `linux-raw-sys`, `js-sys` y +# `windows-sys`: ninguno compila C en Linux. No necesita ni el juego fijo de cuatro que pide todo +# cliente de la suite — no dibuja, no abre ventana, no habla wayland. +# +# ── LO QUE NO ES: no hay captura sin PORTAL ───────────────────────────────────────────────────── +# `src/main.rs` arranca con `use ashpd::desktop::screenshot::Screenshot` y todo su trabajo es +# `Screenshot::request()`, o sea una llamada a `org.freedesktop.portal.Desktop`. Ese nombre lo +# registra el frontend `xdg-desktop-portal`, que **no está en la imagen**; el backend que lo +# implementaría para este escritorio es `xdg-desktop-portal-cosmic`, que tampoco. +# +# Así que esta receta entrega **el binario correcto y el `.desktop` en la biblioteca**, y al +# ejecutarlo falla al no encontrar el portal. Se sella igual y a propósito: es la pieza cliente, ya +# está paga, y deja el frente reducido a UNA pregunta —¿se puede tener el portal sin la glib +# compartida?—. El frontend `xdg-desktop-portal` es C sobre GIO; el backend de COSMIC es Rust. Ver el +# runbook. +# +# Lo único que SÍ funciona hoy de su código es el aviso final: manda `org.freedesktop.Notifications`, +# y eso lo sirve `cosmic-notifications`, que ya está en la imagen. +# +# El `.desktop` y los iconos vienen ESTÁTICOS en `resources/`, no generados por `xdgen` como en +# term/files/settings/edit/store. Por eso acá no hacen falta `INSTALL_DIR` ni `APPID`. +name = "cosmic-screenshot" +version = "0.1.0" + +[source] +tarball = "https://github.com/pop-os/cosmic-screenshot/archive/epoch-1.5.0/cosmic-screenshot-epoch-1.5.0.tar.gz" +sha256 = "2a0a1fb18303773fbfe54613b0b5603871a72cbbb5b0ae183b5390227671b9a3" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +# Acá el estático SÍ se podría: no enlaza wayland, así que no lo alcanza la trampa del `dlopen` de +# `wayland-client` que obliga a dinámico a todos los demás clientes. Se deja dinámico igual, por +# coherencia con la suite y para no ser la única pieza que resuelva distinto. +link = "dynamic" + +[build.phases] +install = ''' +mkdir -p /out/usr/bin /out/usr/share/applications +cp target/release/cosmic-screenshot /out/usr/bin/cosmic-screenshot +chmod 755 /out/usr/bin/cosmic-screenshot +cp resources/com.system76.CosmicScreenshot.desktop /out/usr/share/applications/ +for size in resources/icons/hicolor/*; do + [ -d "$size" ] || continue + s=$(basename "$size") + if [ -f "$size/apps/com.system76.CosmicScreenshot.svg" ]; then + mkdir -p "/out/usr/share/icons/hicolor/$s/apps" + cp "$size/apps/com.system76.CosmicScreenshot.svg" "/out/usr/share/icons/hicolor/$s/apps/" + fi +done +''' + +[deps] +# Vacío a propósito, y medido: no hay un solo `-sys` que compile C en Linux. Es la única pieza de la +# suite que no necesita ni `libxkbcommon` ni `libinput`. +build = [] diff --git a/scripts/cosmic/hydrate-cosmic.sh b/scripts/cosmic/hydrate-cosmic.sh index 488f45d8..16939fb2 100755 --- a/scripts/cosmic/hydrate-cosmic.sh +++ b/scripts/cosmic/hydrate-cosmic.sh @@ -70,6 +70,9 @@ else # …y la tienda, la quinta. Con el backend `pkgar` NAVEGA pero no INSTALA: lee el AppStream del # sistema, o sea los `.metainfo.xml` que instalan las recetas de acá arriba. recipes/incoming-cosmic/cosmic-store.toml + # …y la captura, la sexta. Se incluye SABIENDO que hoy falla: pide la captura al portal XDG, que + # la imagen no tiene. Está acá para que el hueco sea visible y medible, no para que funcione. + recipes/incoming-cosmic/cosmic-screenshot.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