XDG 桌面门户
来自 Flatpak 文档
- 门户是安全访问应用程序沙箱外部资源的框架。它们为应用程序提供了一系列常用功能,包括:确定网络状态、使用文件选择器打开文件、打开 URI、截取屏幕截图和录制屏幕视频 [...]
门户旨在与通过 Flatpak 沙箱化的应用程序一起使用,但任何应用程序都可以使用门户来提供独立于桌面和工具包的统一功能访问。例如,这通常用于 Wayland 上通过 PipeWire 实现屏幕共享,或在 Firefox 中 使用文件打开和保存对话框,这些对话框使用与您当前 桌面环境 相同的工具包。
安装
安装 xdg-desktop-portal 和一个或多个 后端。该软件包包含一个 systemd/User 服务,该服务将通过 D-Bus 自动启动。
后端
当应用程序向门户发送请求时,它会被 xdg-desktop-portal 处理,然后转发到后端实现。这允许实现提供适合用户桌面环境的合适用户界面,并访问特定于环境的 API 来处理打开 URI 或录制屏幕等请求。可以同时安装和使用多个后端。例如,Sway 设置可能会使用 xdg-desktop-portal-wlr 来支持屏幕共享,并使用 xdg-desktop-portal-gtk 作为 xdg-desktop-portal-wlr 未实现的对所有其他接口的备用方案。
门户后端定义位于 /usr/share/xdg-desktop-portal/portals/*.portal。每个门户后端文件包含它可以处理的接口列表,以及它支持的桌面环境。
后端和接口列表
下表列出了所有可用的后端及其对某些常见接口的支持。
| 后端 | 支持环境 | 工具包 | 访问门户 | 账户门户 | 应用程序选择器门户 | 背景门户 | 剪贴板门户 | 动态启动器门户 | 电子邮件门户 | 文件选择器门户 | 全局快捷键门户 | 禁用门户 | 输入捕获门户 | 通知门户 | 打印门户 | 远程桌面门户 | 屏幕录制门户 | 屏幕截图门户 | 秘密门户 | 设置门户 | 壁纸门户 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| xdg-desktop-portal-cosmic | COSMIC | iced | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 是 | 否 | 是 | 否 |
| xdg-desktop-portal-dde | Deepin | Qt 6 | 是 | 是 | 是 | 是 | 否 | 否 | 否 | 是 | 是 | 是 | 否 | 是 | 否 | 否 | 否 | 是 | 是 | 是 | 是 |
| xdg-desktop-portal-gnome | GNOME | GTK 4 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 是 | 否 | 否 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 是 | 是 |
| xdg-desktop-portal-gtk | generic | GTK 3 | 是 | 是 | 是 | 否 | 否 | 是 | 是 | 是 | 否 | 是 | 否 | 是 | 是 | 否 | 否 | 否 | 否 | 是 | 否 |
| xdg-desktop-portal-hyprland | Hyprland1 | Qt 6 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 是 | 是 | 否 | 否 | 否 |
| xdg-desktop-portal-kde | KDE Plasma | Qt 6 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 是 | 否 |
| xdg-desktop-portal-luminousAUR | wlroots | Slint | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 是 | 是 | 否 | 是 | 否 |
| xdg-desktop-portal-lxqt | LXQt | Qt 6 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
| xdg-desktop-portal-phosh | Phosh | GTK 4 | 否 | 是 | 是 | 否 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 是 | 是 |
| xdg-desktop-portal-tdAUR | theDesk | Qt 6 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 是 | 否 | 是 | 否 |
| xdg-desktop-portal-wlr | wlroots | – | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 是 | 否 | 否 | 否 |
| xdg-desktop-portal-xapp | Cinnamon2 | – | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 是 | 否 | 是 | 是 |
以下软件包仅提供特定的后端,而非特定于桌面环境
- darkman 实现设置门户后端(仅用于配色方案设置)。
- gnome-keyring 实现秘密门户后端。
- keepassxc 实现秘密门户后端。
- kwallet 实现秘密门户后端。
- pikeruAUR 实现文件选择器门户后端,并带有自己的 GUI 应用程序。
- xdg-desktop-portal-shanaAUR 实现文件选择器门户后端。它将请求重定向到 GNOME/GTK/KDE/LXQt 后端。
- xdg-desktop-portal-termfilechooser-gitAUR 实现文件选择器门户后端。它允许使用 终端文件管理器 作为文件选择器。
- xdg-desktop-portal-termfilechooser-hunkyburrito-gitAUR 是现已存档的 xdg-desktop-portal-termfilechooser-git 的一个新分支,它实现了文件选择器门户后端,并允许使用 终端文件管理器 作为文件选择器。
- portty-gitAUR 实现文件选择器门户后端。它可以启动交互式终端会话,其中包含用于使用任何命令行工具选择文件的 shell 脚本。还支持无头模式,用于从现有终端控制对话框而无需启动新窗口,以及队列模式,用于在应用程序请求对话框之前预先选择文件。
配置
当发出请求时,xdg-desktop-portal 将使用 /usr/share/xdg-desktop-portal/DE-portals.conf 文件,其中 DE 基于 XDG_CURRENT_DESKTOP 环境变量。这些文件由桌面环境本身提供,并决定在运行特定环境时应使用哪些后端。
如果您想覆盖桌面环境的默认设置,或者您的桌面环境未提供默认配置,您可以创建一个门户配置文件 $XDG_CONFIG_HOME/xdg-desktop-portal/portals.conf,以确定您想要使用哪些后端,无论是通用的还是针对每个单独的接口。如果您使用多个桌面环境,您还可以为每个环境创建多个 $XDG_CONFIG_HOME/xdg-desktop-portal/DE-portals.conf 文件。
例如,如果您的桌面环境没有门户后端,并且您想使用 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 认为您正在使用特定的桌面环境。这可以通过使用 drop-in snippet 为 xdg-desktop-portal.service 用户单元 设置 XDG_CURRENT_DESKTOP 环境变量来实现。例如,要使用与 KDE 关联的后端:
~/.config/systemd/user/xdg-desktop-portal.service.d/override.conf
[Service] Environment="XDG_CURRENT_DESKTOP=KDE"
故障排除
门户未启动
为了让 xdg-desktop-portal-wlr 和 xdg-desktop-portal-hyprland 工作,必须在 systemd 用户会话 中设置 XDG_CURRENT_DESKTOP 和 WAYLAND_DISPLAY 环境变量。
XDG_CURRENT_DESKTOP 必须设置为您的合成器的名称,例如 XDG_CURRENT_DESKTOP=sway。WAYLAND_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#Configuration。
- Hyprland 可能不会自动设置这些环境变量。您可以手动指定它们,请参阅 Hyprland Wiki。
使用 xdg-desktop-portal-wlr 进行多显示器操作
xdg-desktop-portal-wlr 需要一个外部选择器来选择共享的显示器。默认情况下,它按以下顺序查找 slurp、wofi 和 bemenu。使用 slurp 时,在请求屏幕共享后,您将看到一个十字准星光标,并且需要单击要共享的屏幕。使用 wofi 或 bemenu 时,您将看到一个包含可用显示器的菜单。如果没有任何选择器可用,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)。