# xdg-desktop-portal-kde 6.7.2 — el BACKEND de portales de Plasma, y el segundo de los dos huecos # que dejaban a KDE por debajo de una instalación estándar. # # ══ QUÉ FALTABA, MEDIDO ════════════════════════════════════════════════════════════════════════ # El 2026-09-09 se recorrieron los `.service` de D-Bus de TODO el store: los únicos backends de # portal sellados eran `org.freedesktop.impl.portal.desktop.cosmic` y `.desktop.gnome`. **Ninguno de # KDE**, y la cola `incoming-kde` no tenía ni siquiera el frontend `xdg-desktop-portal`. # Consecuencia concreta y no hipotética: la imagen KDE trae `obs-studio` con su plugin # `linux-pipewire`, que captura pantalla **por el portal** — o sea que en Plasma no tenía con quién # hablar, mientras que en GNOME y COSMIC ese frente está cerrado. Sin portal tampoco hay diálogo de # fichero ni compartir pantalla para nada que los use. # # ══ LA CADENA ES DE TRES, Y ESTE PAQUETE ES EL TERCERO ═════════════════════════════════════════ # La cabecera de `xdg-desktop-portal.toml` ya lo explica y vale igual acá: # cliente → org.freedesktop.portal.Desktop → [frontend] → org.freedesktop.impl.portal.* → [este] # El frontend registra el nombre que los clientes buscan y enruta; **este paquete es el que # implementa los diálogos con Qt/KF6 y habla con kwin**. Hacen falta LOS DOS: por eso en la misma # tanda se copió `xdg-desktop-portal` a esta cola (comparte artefacto con el de COSMIC, hash # idéntico ⇒ cero builds). # # ══ VERSIÓN PEGADA A PLASMA, NO LA ÚLTIMA ══════════════════════════════════════════════════════ # 6.7.2 es la MISMA que `plasma-workspace`, `kwin` y `kscreenlocker` de esta cola. El backend habla # interfaces privadas de kwin para el ScreenCast, así que desalinear versiones acá no es una # preferencia: es pedir que dos mitades del mismo release se entiendan por casualidad. # # ══ CERO FRONTERA NUEVA ════════════════════════════════════════════════════════════════════════ # Su `CMakeLists.txt` pide Qt6 (Core, Concurrent, DBus, PrintSupport, QuickWidgets, Widgets, # WaylandClient, Quick, QuickControls2, Qml), KF6 (CoreAddons, Config, I18n, GlobalAccel, KIO, # Kirigami, Notifications, Service, WidgetsAddons, WindowSystem, IconThemes, StatusNotifierItem, # Crash), KWayland, Wayland, PlasmaWaylandProtocols, WaylandProtocols y xkbcommon. # **Las 22 ya estaban en el catálogo** (verificado una por una antes de escribir esto): no hay una # sola receta nueva debajo. # # ⚠ `kpipewire` va en [deps] aunque el CMakeLists NO la pida: sus QML (`PipeWireDelegate.qml`, # `PipeWireLayout.qml`) importan el módulo `org.kde.pipewire` para la PREVISUALIZACIÓN del selector # de pantalla. Es una dep de RUNTIME que ningún `find_package` delata — el patrón de `libnotify` en # atuq y de `xkbcomp` en xwayland. Sin ella el backend compila, arranca, y el diálogo de compartir # pantalla sale sin miniatura. # # `KIOFuse` se deja fuera: su propio `set_package_properties` la declara `TYPE RUNTIME` y sirve para # montar URLs remotas, que esta distro no hace. name = "xdg-desktop-portal-kde" version = "6.7.2" # licencia: CONTADAS las etiquetas SPDX de todos los .cpp/.h/.qml del tarball, no leída una y # generalizada —que es lo que hice primero y salía mal—: 88 ficheros `LGPL-2.0-or-later`, 23 # `LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL` (la fórmula de KDE e.V. para # aceptar futuras LGPL) y 1 `GPL-2.0-or-later`. El binario los enlaza a todos, así que la expresión # es la CONJUNCIÓN. `LicenseRef-KDE-Accepted-LGPL` no tiene texto canónico en licenses/: el guardián # avisará y no vetará, que es lo correcto. license = "LGPL-2.0-or-later AND (LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL) AND GPL-2.0-or-later" [source] tarball = "https://download.kde.org/stable/plasma/6.7.2/xdg-desktop-portal-kde-6.7.2.tar.xz" sha256 = "d09974dda417dfa519dd64d9cd19061c7c091308aa22a7ad8ad32601584ddad0" [build] compiler = "zig-cc" target = "x86_64-linux-musl" link = "dynamic" flags = [] [build.phases] configure = ''' rm -rf po # ⚠ SE QUITA EL PORTAL DE IMPRESIÓN, y no es un atajo: **la distro no tiene stack de impresión**. # El build muere en `src/print.cpp:27` con `'QtPrintSupport/private/qcups_p.h' file not found`, y la # cadena causal está medida entera: # no hay NINGUNA receta de cups en el catálogo ⇒ qtbase 6.11.1 se construyó sin CUPS ⇒ su # `QtPrintSupport/private/` existe pero sólo trae qpaintengine_alpha_p.h y qprintengine_pdf_p.h, # NO qcups_p.h ⇒ el backend de impresión no puede compilar. # O sea que no falta una cabecera: falta el subsistema, y un portal de impresión sin con qué imprimir # no es una funcionalidad que se pierde, es código muerto que no enlaza. # Upstream no expone `option()` para portales —se compilan todos—, así que se corta en tres sitios y # NO en uno solo: la fuente, la instanciación y la lista de interfaces que el backend ANUNCIA. Dejar # el anuncio sin la implementación sería peor que no tenerlo: el frontend enrutaría a un portal que # no responde. Cada `sed` lleva su verificación al lado, que es lo que delata un cambio de upstream. sed -i '/^ *print\.cpp$/d;/^ *print\.h$/d' src/CMakeLists.txt grep -q 'print\.cpp' src/CMakeLists.txt && { echo '!! print.cpp sigue en las fuentes'; exit 1; } sed -i '/#include "print\.h"/d;/m_print(new PrintPortal(this))/d' src/desktopportal.cpp sed -i '/class PrintPortal;/d;/PrintPortal \*const m_print;/d' src/desktopportal.h grep -q 'PrintPortal' src/desktopportal.cpp src/desktopportal.h && { echo '!! queda PrintPortal'; exit 1; } # La lista de `Interfaces=` es una sola línea con `;` — se saca sólo el token de Print. sed -i 's/org\.freedesktop\.impl\.portal\.Print;//' data/kde.portal grep -q 'impl\.portal\.Print' data/kde.portal && { echo '!! kde.portal sigue anunciando Print'; exit 1; } ZW="$PWD/.zwrap"; mkdir -p "$ZW" cat > "$ZW/cc" <<'W' #!/bin/sh a=""; for x in "$@"; do [ "$x" = "-Wl,--fatal-warnings" ] && continue; a="$a $x"; done exec /opt/zig/zig cc -mcpu=baseline $a W cat > "$ZW/cxx" <<'W' #!/bin/sh a=""; for x in "$@"; do [ "$x" = "-Wl,--fatal-warnings" ] && continue; a="$a $x"; done exec /opt/zig/zig c++ -mcpu=baseline $a W chmod +x "$ZW/cc" "$ZW/cxx" cmake -B build -G Ninja -Wno-dev \ -DCMAKE_C_COMPILER="$ZW/cc" -DCMAKE_CXX_COMPILER="$ZW/cxx" -DCMAKE_ASM_COMPILER="$ZW/cc" \ -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_PREFIX_PATH=/usr \ -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=OFF -DBUILD_TESTING=OFF ''' compile = "cmake --build build" install = ''' set -e DESTDIR=/out cmake --install build # Guardián: lo que hace que este paquete SIRVA es el `.service` de D-Bus con el nombre de backend. # Sin él el artefacto sella, el binario está en la imagen y el frontend nunca lo encuentra — el # mismo «instalado ≠ activo» que ya se pagó con las extensiones de GNOME. test -s /out/usr/share/dbus-1/services/org.freedesktop.impl.portal.desktop.kde.service # Y el fichero que le dice al frontend QUÉ interfaces implementa este backend. test -s /out/usr/share/xdg-desktop-portal/portals/kde.portal ''' [deps] # ⚠ RUNTIME: `kpipewire` la importan sus QML por `org.kde.pipewire` para la previsualización del # selector de pantalla, y ningún find_package la delata. runtime = ["kpipewire"] # La clausura ENTERA (las deps de hammer no son transitivas). Base tomada de `spectacle`, que es el # otro consumidor de Qt6+KF6+wayland de esta cola, menos lo suyo (tesseract/opencv/zxing) y más lo # que este CMakeLists pide y aquélla no. build = ["cmake", "samurai", "python3", "pkgconf", "extra-cmake-modules", "qttools", "gettext-tiny", "qtbase", "qtsvg", "qtdeclarative", "qtwayland", "qt5compat", "dbus", "wayland", "wayland-protocols", "plasma-wayland-protocols", "kwayland", "layer-shell-qt", "kcoreaddons", "kconfig", "ki18n", "kglobalaccel", "kio", "kirigami", "kirigami-addons", "knotifications", "kservice", "kwidgetsaddons", "kwindowsystem", "kiconthemes", "kstatusnotifieritem", "kcrash", "kdbusaddons", "kxmlgui", "kguiaddons", "kpackage", "kcolorscheme", "kcompletion", "kjobwidgets", "kconfigwidgets", "kitemviews", "kcodecs", "karchive", "kbookmarks", "sonnet", "attica", "icu4c", "solid", "kauth", "kitemmodels", "mesa", "libdrm", "libxkbcommon", "libepoxy", "libpng-shared", "libjpeg-turbo-shared", "zlib-shared", "libX11", "xorgproto", "libXau", "libXdmcp", "libXext", "libXrender", "libXfixes", "libXi", "libxcb", "xcb-util", "xcb-util-keysyms", "xcb-util-wm", "xcb-util-image", "xcb-util-cursor", "xcb-util-renderutil"]