跳转到内容

XDG 桌面门户

来自 Arch Linux 中文维基

引自 Flatpak 文档

门户是用于安全访问沙箱外资源的框架。沙箱内程序可以使用的特性包括:检测网络状态;使用文件选择器来打开文件;打开 URI;阻止设备睡眠、休眠或关机;打印;发送邮件;显示通知;截取屏幕或录屏[……]

门户(portals)系统最初专为 Flatpak 应用程序设计,但任何应用程序均可借助门户访问跨桌面环境和 UI 框架的统一功能。这一功能得到了广泛使用,例如通过 PipeWireWayland 上实现屏幕共享,或让 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
  1. 适用于所有基于 wlroots 的混成器,但提供针对 Hyprland 的额外功能,例如可在截屏或屏幕录制时共享单个窗口。
  2. 其也为 MATEXfce 提供部分支持。

除此以外,以下后端跨桌面环境实现了特定接口:

配置

[编辑 | 编辑源代码]

当收到请求时,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-wlrxdg-desktop-portal-hyprland 正常工作,必须在 systemd 用户会话中设置 XDG_CURRENT_DESKTOPWAYLAND_DISPLAY 环境变量。

XDG_CURRENT_DESKTOP 需要设置为混成器名称,例如 XDG_CURRENT_DESKTOP=swayWAYLAND_DISPLAY 则由混成器自动设置。这两个变量通常会在混成器启动时自动设置,但如果 systemd 用户会话先于混成器启动,混成器启动时需要导入这两个变量。

注意:Hyprland 不会自动设置 XDG_CURRENT_DESKTOP 环境变量,需要手动配置。请参阅 Hyprland Wiki

使用 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=混成器名称
注意:这些环境变量需要在混成器启动时设置,通常通过混成器自身的配置完成,请参见混成器的文档说明。
提示:Sway 提供了一个可自动完成此操作的插入文件,请参阅 Sway#配置

更多详情请参阅 [1][2]

在多显示器环境下使用 xdg-desktop-portal-wlr

[编辑 | 编辑源代码]

xdg-desktop-portal-wlr 需要一个外部选择器来选择要共享的显示器。默认按顺序查找 slurpwofibemenu。若使用 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 运行(最简单的检查方法是运行 xeyes,然后将鼠标指针移至应用程序窗口内,若程序运行在 Xwayland 下,其中眼睛会看向鼠标指针),那么 xdg-desktop-portal-gtk 会按需启动,但在选择文件后可能没有任何反应。这种情况下,为 xdg-desktop-portal-gtk 的环境添加 DISPLAY=:0 可能会解决问题。要实现此操作,可以按照前文(#门户无法启动)关于 import-environment 的说明进行设置,或者直接编辑 xdg-desktop-portal-gtk 的 systemd 用户单元文件。此外,也可以尝试通过配置开启应用程序的原生 Wayland 支持(例如对于 Electron 程序)。

参见

[编辑 | 编辑源代码]