XDG 桌面门户
引自 Flatpak 文档:
- 门户是用于安全访问沙箱外资源的框架。沙箱内程序可以使用的特性包括:检测网络状态;使用文件选择器来打开文件;打开 URI;阻止设备睡眠、休眠或关机;打印;发送邮件;显示通知;截取屏幕或录屏[……]
门户(portals)系统最初专为 Flatpak 应用程序设计,但任何应用程序均可借助门户访问跨桌面环境和 UI 框架的统一功能。这一功能得到了广泛使用,例如通过 PipeWire 在 Wayland 上实现屏幕共享,或让 Firefox 采用与当前桌面环境相同 UI 框架的文件打开/保存对话框。
安装 xdg-desktop-portal包 以及至少一个 #后端,该软件包包含一个 systemd/用户服务,通过 D-Bus 自动触发启动。
当一个软件通过 XDG 桌面门户发起请求时,xdg-desktop-portal包 会将这个请求转发至可用的后端实现,由后端实现适合桌面环境的 UI,并访问特定于桌面环境的 API 处理诸如打开 URI、录制屏幕之类的请求。后端可以安装多个,例如使用 Sway 可以安装 xdg-desktop-portal-wlr包 支持屏幕共享,并同时安装 xdg-desktop-portal-gtk包 作为后备,处理 xdg-desktop-portal-wlr包 未实现的接口。
门户后端配置储存在 /usr/share/xdg-desktop-portal/portals/*.portal 中。门户后端配置文件包含其支持的接口和桌面环境。
| 后端 | 支持的桌面环境 | 使用的 UI 框架 | 接口支持情况 | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 对话框 | 账户信息 | 应用程序选择器 | 后台活动 | 剪贴板 | 桌面启动项 | 电子邮件 | 文件选择器 | 全局快捷键 | 用户会话管理 | 输入设备捕获 | 系统通知 | 打印 | 远程桌面 | 屏幕录制 | 截屏 | 密钥 | 系统设置 | 壁纸 | |||
| xdg-desktop-portal-cosmic包 | COSMIC | iced | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 是 | 否 | 是 | 否 |
| xdg-desktop-portal-dde包 | 深度桌面环境 | 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 | – | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 是 | 否 | 是 | 是 |
除此以外,以下后端跨桌面环境实现了特定接口:
- darkman包 实现了系统设置接口(仅颜色方案设置)。
- gnome-keyring包 实现了密钥接口。
- kwallet包 实现了密钥接口。
- pikeruAUR 使用自己的 GUI 实现了文件选择器接口。
- xdg-desktop-portal-shanaAUR 通过将请求重定向至 GNOME/GTK/KDE/LXQt 后端实现了文件选择器接口。
- xdg-desktop-portal-termfilechooser-gitAUR 使用终端文件选择器实现了文件选择器接口。
当收到请求时,xdg-desktop-portal 将会使用位于 /usr/share/xdg-desktop-portal/桌面环境-portals.conf 的配置文件,其中桌面环境由环境变量 XDG_CURRENT_DESKTOP 决定。配置文件由桌面环境提供,决定应当使用的后端。
如果需要自定义配置,或者使用的桌面环境并没有提供默认配置,可以创建门户配置文件 $XDG_CONFIG_HOME/xdg-desktop-portal/portals.conf 以决定全局或者特定接口使用的后端。如果使用多个桌面环境,也可以创建并配置特定桌面环境的配置文件 $XDG_CONFIG_HOME/xdg-desktop-portal/桌面环境-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 以为正在使用特定的桌面环境。可以在 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 则由混成器自动设置。这两个变量通常会在混成器启动时自动设置,但如果 systemd 用户会话先于混成器启动,混成器启动时需要导入这两个变量。
使用 systemctl --user show-environment 检查这些变量是否已设置。如果未设置,请在启动混成器时运行以下命令(例如,将其写入混成器的配置文件),将这些环境变量导入到 systemd 用户会话和 D-Bus 中:
$ systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP $ dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=混成器名称
xdg-desktop-portal-wlr 需要一个外部选择器来选择要共享的显示器。默认按顺序查找 slurp包、wofi包 和 bemenu包。若使用 slurp,收到屏幕共享请求后,鼠标指针会变成十字形,需要点击要共享的屏幕。若使用 wofi 或 bemenu,会出现一个可用显示器的菜单供选择。如果没有任何选择器可用,xdg-desktop-portal-wlr 会回退到找到的第一个显示器。详见 xdg-desktop-portal-wlr(5) § SCREENCAST OPTIONS。
部分 GTK 应用程序在 Plasma 环境中需要安装 xdg-desktop-portal-gtk包 才能正确渲染字体。请安装该软件包,然后运行:
$ /usr/lib/xdg-desktop-portal --replace
如果应用程序通过 Xwayland 运行(最简单的检查方法是运行 xeyes,然后将鼠标指针移至应用程序窗口内,若程序运行在 Xwayland 下,其中眼睛会看向鼠标指针),那么 xdg-desktop-portal-gtk 会按需启动,但在选择文件后可能没有任何反应。这种情况下,为 xdg-desktop-portal-gtk 的环境添加 DISPLAY=:0 可能会解决问题。要实现此操作,可以按照前文(#门户无法启动)关于 import-environment 的说明进行设置,或者直接编辑 xdg-desktop-portal-gtk 的 systemd 用户单元文件。此外,也可以尝试通过配置开启应用程序的原生 Wayland 支持(例如对于 Electron 程序)。