XDG Desktop Portal

出自 ArchWiki

来自 Flatpak 文档

Portals 是用于安全地从应用程序沙箱外部访问资源的框架。它们为应用程序提供一系列常用功能,包括:确定网络状态、使用文件选择器打开文件、打开 URI、截取屏幕截图和屏幕录像 [...]

Portals 被设计用于通过 Flatpak 沙箱化的应用程序,但任何应用程序都可以使用 portals 来提供对功能的统一访问,而无需考虑桌面和工具包。这通常用于,例如,在 Wayland 上通过 PipeWire 允许屏幕共享,或者在 Firefox使用文件打开和保存对话框,这些对话框使用与您当前 桌面环境 相同的工具包。

安装

安装 xdg-desktop-portal 以及一个或多个后端。该软件包包含一个 systemd/User 服务,该服务将通过 D-Bus 自动启动。

后端

当应用程序向 portal 发送请求时,它由 xdg-desktop-portal 处理,然后将其转发到后端实现。这允许实现提供适合用户桌面环境的合适用户界面,并访问特定于环境的 API 以进行诸如打开 URI 或录制屏幕之类的请求。可以同时安装和使用多个后端。例如,Sway 设置可以使用 xdg-desktop-portal-wlr 来支持屏幕共享,并使用 xdg-desktop-portal-gtk 作为 xdg-desktop-portal-wlr 未实现的所有其他接口的后备。

Portal 后端定义位于 /usr/share/xdg-desktop-portal/portals/*.portal 中。每个 portal 后端文件都包含它可以处理的接口列表,以及它支持的桌面环境。

后端和接口列表

下表列出了所有可用的后端及其对某些常用接口的支持。

后端 支持的环境 工具包 访问 Portal 账户 Portal 应用选择器 Portal 后台 Portal 剪贴板 Portal 动态启动器 Portal 电子邮件 Portal 文件选择器 Portal 全局快捷键 Portal 抑制 Portal 输入捕获 Portal 通知 Portal 打印 Portal 远程桌面 Portal 屏幕广播 Portal 屏幕截图 Portal 密钥 Portal 设置 Portal 壁纸 Portal
xdg-desktop-portal-cosmic COSMIC iced
xdg-desktop-portal-dde Deepin Qt 5
xdg-desktop-portal-gnome GNOME GTK 4
xdg-desktop-portal-gtk 通用 GTK 3
xdg-desktop-portal-hyprland Hyprland1 Qt 6
xdg-desktop-portal-kde KDE Plasma Qt 6
xdg-desktop-portal-liri-gitAUR Liri Qt 5
xdg-desktop-portal-lxqt LXQt Qt 6
xdg-desktop-portal-tdAUR theDesk Qt 6
xdg-desktop-portal-wlr wlroots
xdg-desktop-portal-xapp Cinnamon2
  1. 与所有基于 wlroots 的合成器一起工作,但在与 Hyprland 一起使用时提供额外的功能,例如共享单个窗口。
  2. 也为 MATEXfce 提供部分支持。

以下软件包仅提供特定的后端,而不是特定于桌面环境

配置

发出请求时,xdg-desktop-portal 将使用 /usr/share/xdg-desktop-portal/DE-portals.conf 文件,其中 DE 基于 XDG_CURRENT_DESKTOP 环境变量。这些文件由桌面环境本身提供,并确定在特定环境运行时应使用哪些后端。

如果您想覆盖桌面环境默认设置,或者您的桌面环境未提供默认配置,您可以在 $XDG_CONFIG_HOME/xdg-desktop-portal/portals.conf 创建一个 portal 配置文件,以确定您要使用的后端,无论是通常情况下还是针对每个单独的接口。如果您使用多个桌面环境,您还可以为每个环境创建多个 $XDG_CONFIG_HOME/xdg-desktop-portal/DE-portals.conf 文件。

例如,如果您的桌面环境没有 portal 后端,并且您想使用 xdg-desktop-portal-gtk 作为通用后备,但也想通过 xdg-desktop-portal-lxqt 使用 LXQt 文件选择器,您可以使用以下配置

~/.config/xdg-desktop-portal/portals.conf
[preferred]
default=gtk
org.freedesktop.impl.portal.FileChooser=lxqt

有关更多信息,请参阅 portals.conf(5)

强制桌面环境

在某些情况下,例如当您有独立的窗口管理器时,您可能希望使 xdg-desktop-portal 认为您正在使用特定的桌面环境。这可以通过为 xdg-desktop-portal.service 用户单元 使用 drop-in snippet 设置 XDG_CURRENT_DESKTOP 环境变量来实现。例如,要使用与 KDE 关联的后端

~/.config/systemd/user/xdg-desktop-portal.service.d/override.conf
[Service]
Environment="XDG_CURRENT_DESKTOP=KDE"

故障排除

Portal 无法启动

为了使 xdg-desktop-portal-wlrxdg-desktop-portal-hyprland 工作,XDG_CURRENT_DESKTOPWAYLAND_DISPLAY 环境变量必须在 systemd 用户会话中设置。

XDG_CURRENT_DESKTOP 必须设置为您的合成器的名称,例如 XDG_CURRENT_DESKTOP=swayWAYLAND_DISPLAY 由合成器自动设置。

使用 systemctl --user show-environment 检查是否设置了这些变量。如果未设置,请在启动合成器之前运行以下命令,将这些环境变量导入 systemd 用户会话和 dbus(例如,将它们包含在合成器的配置文件中)。

$ systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
$ dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=compositor_name
注意: 这些环境变量需要在合成器启动之前设置。这通常通过合成器自己的配置完成,有关详细信息,请参阅其文档。
提示
  • Sway 提供了一个 drop-in 文件,可以自动执行此操作,请参阅 Sway#配置
  • Hyprland 可能不会自动设置这些环境变量。您可以手动指定它们,请参阅 Hyprland Wiki

有关更多详细信息,请参阅 [1][2]

使用 xdg-desktop-portal-wlr 的多显示器

xdg-desktop-portal-wlr 需要一个外部选择器来选择共享的显示器。默认情况下,它按此顺序查找 slurpwofibemenu。使用 slurp 时,在请求屏幕共享后,您将看到一个十字线光标,您需要单击要共享的屏幕。使用 wofibemenu 时,您将看到一个可共享的可用显示器菜单。如果没有可用的选择器,xdg-desktop-portal-wlr 将回退到找到的第一个显示器。有关更多信息,请参阅 xdg-desktop-portal-wlr(5) § SCREENCAST OPTIONS

KDE Plasma 上 GTK 应用程序字体渲染不良

某些 GTK 应用程序需要在 Plasma 上安装 xdg-desktop-portal-gtk 才能正确渲染字体。安装它然后运行

$ /usr/lib/xdg-desktop-portal --replace

GTK(可能还有其他)文件选择器无法工作

如果应用程序通过 xwayland 在 X 上运行(检查的最简单方法是运行 xeyes 并查看它们是否跟随鼠标在有问题的应用程序上移动),那么 xdg-desktop-portal-gtk 将按需显示,但是在您选择文件后,什么也不会发生。在这种情况下,将 DISPLAY=:0 添加到 xdg-desktop-portal-gtk 环境可能会有所帮助。为此,您可以按照上述关于 import-environment 的说明进行操作,或者只是编辑 xdg-desktop-portal-gtk 的 systemd 用户单元文件。或者,您可以强制应用程序在 wayland 下运行(即,如果它使用 electron)。

参见