diff --git a/docs/evidencia/cosmic-portal-filechooser-2026-08-05.png b/docs/evidencia/cosmic-portal-filechooser-2026-08-05.png new file mode 100644 index 00000000..53fb313d Binary files /dev/null and b/docs/evidencia/cosmic-portal-filechooser-2026-08-05.png differ diff --git a/docs/evidencia/cosmic-portal-filechooser-nav-2026-08-05.png b/docs/evidencia/cosmic-portal-filechooser-nav-2026-08-05.png new file mode 100644 index 00000000..a7fe4a3b Binary files /dev/null and b/docs/evidencia/cosmic-portal-filechooser-nav-2026-08-05.png differ diff --git a/docs/runbooks/cosmic-desktop.md b/docs/runbooks/cosmic-desktop.md index 7a1c258b..a9eabe2d 100644 --- a/docs/runbooks/cosmic-desktop.md +++ b/docs/runbooks/cosmic-desktop.md @@ -901,12 +901,49 @@ que es justamente el eslabón que el `.service` con `@libexecdir@` sustituido ha ⚠ **Alcance honesto de esta medición**: prueba DISPONIBILIDAD y ENRUTADO, no los flujos completos. La única interfaz ejercida de punta a punta —con fichero en disco— es `Screenshot`. +### 📂 FileChooser EJERCIDO — y por qué NO se puede desde cosmic-store + +`docs/evidencia/cosmic-portal-filechooser-2026-08-05.png` y `…-nav-…png`. + +**Primero, el camino que NO existe.** `cosmic-store` se compila con la feature `xdg-portal`, pero su +ÚNICO uso del selector está en `src/update.rs:505`, dentro de +`Message::RepositoryAddDialog`, y arranca con: + +```rust +if backend_name == BackendName::FlatpakUser { + #[cfg(feature = "xdg-portal")] + ...file_chooser::open::Dialog::new()... +``` + +O sea que el diálogo sólo se abre para **añadir un repositorio flatpak**, y esta imagen no construye +el backend flatpak (ver arriba: sólo `pkgar`). La feature está compilada y el punto de llamada es +inalcanzable. **Tener la feature encendida no es tener el flujo disponible.** + +**El camino que sí ejerce la interfaz** es llamarla directo, que además prueba los tres eslabones sin +depender de qué aplicación la use: + +```sh +dbus-send --session --print-reply --dest=org.freedesktop.portal.Desktop \ + /org/freedesktop/portal/desktop org.freedesktop.portal.FileChooser.OpenFile \ + string:"" string:Prueba dict:string:variant:handle_token,string:hammer1 & +``` + +Resultado medido: el frontend devuelve el objeto Request con el token que le pasamos +(`/org/freedesktop/portal/desktop/request/1_113/hammer3`) y el **backend dibuja el diálogo real** — +título `Prueba`, el FS de verdad (`run`, `tmp`, `dev`, `proc`, `sys`), panel de detalles +(`inode/directory`, 963 items) y botones Cancel/Open. La navegación anda: doble clic en `dev` cambia +la miga de pan a `Filesystem › dev` y lista sus 129 entradas; seleccionar y pulsar *Open* lo cierra. + +⚠ **Lo que NO quedó capturado, y por qué**: la URI devuelta. El `Response` de la especificación de +portales es una señal **unicast al llamador**, y `dbus-send` termina apenas recibe el *method return*, +así que ya no está para recibirla; `dbus-monitor` con un match rule normal tampoco la ve. Capturarla +pide un cliente que implemente el ciclo Request/Response — que es justo lo que hace `ashpd` dentro de +las aplicaciones. **El diálogo está probado; la entrega del fichero a la aplicación, no.** + ## Lo que falta, en orden -1. **Ejercer los flujos, no sólo sondear**: `FileChooser` desde una aplicación que use el portal - (`cosmic-store` se compiló con la feature `xdg-portal`; `cosmic-edit` NO la usa, va con el - selector propio de `cosmic-files` como crate) y `ScreenCast`, que es la que ejercita pipewire de - verdad. +1. **`ScreenCast`**, que es la que ejercita pipewire de verdad, y la entrega de URI del `FileChooser` + con un cliente `ashpd` real en vez de `dbus-send`. 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