16
10月
2024
12:03

xdg-desktop-portal 包的用途是什么,如何使用它

16 10月 2024 12:03

Linux 有多种软件环境 - 原生基于 Linux SystemD 和 D-Bus 服务、第三方 FlatPak 和 Snap。

可能大家都知道FlatPak和Snap应用程序分发系统使用沙箱机制,应用程序在安全的环境中运行。

为了使沙箱内运行的程序能够访问计算机资源,例如文件系统、摄像头、声音服务器,在 Snap/Flatpak 和操作系统之间使用“响应”组件(后端)。 该组件称为“XDG 桌面门户”。 从 Flatpak 文档:

“门户是用于从沙箱外部安全访问资源的框架。它们为应用程序提供了许多常见功能,包括:检测网络状态、使用文件选择器打开文件、打开 URI、截取屏幕截图以及执行屏幕投射 [...]”

门户设计用于与通过 Flatpak 隔离的应用程序一起使用,但任何应用程序都可以使用门户来提供对独立于桌面和工具集的功能的单一访问。 例如,这通常用于允许通过 PipeWire 在 Wayland 中共享屏幕,或者使用 Firefox 的文件打开和保存对话框,这些对话框使用与当前桌面环境相同的工具集。"

什么时候需要 xdg-desktop-portal 组件?

  • 使用 flatpak 和 snap 时需要

如何安装xdg-desktop-portal?

sudo apt update
sudo apt install xdg-desktop-portal xdg-desktop-portal-gtk

如何启动xdg-desktop-portal.service服务?

当访问与操作系统交互的界面时,该服务会在用户环境中自动启动。 如果需要,可以手动启动它来检查操作(状态、状态、错误),但仅限于当前用户的环境。 团队:

systemctl --用户启动 xdg-desktop-portal.service

检查服务状态:

systemctl --user status xdg-desktop-portal.service

! 服务状态 xdg-桌面-portal.service 应该是绿色的——“活动(运行)”。 类似“无法加载 RealtimeKit 属性:GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: 任何 .service 文件均未提供名称 org.freedesktop.RealtimeKit1”和“无要导出的骨架”之类的警告不会影响 xdg-desktop-portal.service 服务的操作;我们忽略这些消息。

xdg-desktop-portal.service的工作原理是什么?

该组件使用 DBus 协议与系统和 Flatpak/Snap 进行通信。

如何删除 xdg-desktop-portal.service?

如果与操作系统的交互是通过 snap 包进行的,则不需要 flatpak。 您可以删除指定的包

sudo apt purge xdg-desktop-portal xdg-desktop-portal-gtk

哪里

  • xdg-desktop-portal - 主包。
  • xdg-desktop-portal-gtk - 大多数操作系统相关功能的默认扩展包(启动应用程序、选择文件、打印、操作系统设置、gnome-keyring 等)

! 在有关的文档中 wiki.archlinux.org/title/XDG_Desktop_Portal 据说每个桌面环境都有自己的软件包。 例如:
Gnome环境-> xdg-desktop-portal-gnome包
KDE 环境 -> 软件包 xdg-desktop-portal-kde
! * LXQt环境->包xdg-desktop-portal-lxqt

如何确保xdg-desktop-portal.service正常工作?

xdg-desktop-portal组件需要环境变量

  • XDG_RUNTIME_DIR
  • XDG_CONFIG_HOME
  • XDG_DATA_DIRS
  • 和其他,请参阅 XDG说明

检查当前桌面环境和其他 XDG 变量:

环境| grep XDG

xdg-desktop-portal 配置文件位于文件夹中 /usr/share/xdg-desktop-portal/。 它们不应该被改变。

此外,该组件需要文件中列出的文件夹名称:
〜/.config/user-dirs.dirs

示例 - 查看用户文件夹列表:

cat ~/.config/user-dirs.dirs

结果:
<代码>#该文件由 xdg-user-dirs-update 写入
#如果您想更改或添加目录,只需编辑您所在的行即可
#感兴趣。 所有本地更改都将在下次运行时保留。
#格式为 XDG_xxx_DIR="$HOME/yyy",其中 yyy 是 shell 转义的
#homedir 相对路径,或 XDG_xxx_DIR="/yyy",其中 /yyy 是
#绝对路径。 不支持其他格式。
#
XDG_DESKTOP_DIR="$HOME/桌面"
XDG_DOWNLOAD_DIR="$HOME/下载"
XDG_TEMPLATES_DIR="$HOME/模板"
XDG_PUBLICSHARE_DIR="$HOME/公共"
XDG_DOCUMENTS_DIR="$HOME/文档"
XDG_MUSIC_DIR="$HOME/音乐"
XDG_PICTURES_DIR="$HOME/图片"
XDG_VIDEOS_DIR="$HOME/视频"

该文件是在执行命令时创建的

xdg-user-dirs-update

操作系统中的用户文件夹的命名考虑了用户配置文件中当前的区域语言设置。 语言设置本地化还定义了环境变量,可以使用命令查看 语言环境:

语言环境

要安装俄语:

sudo update-locale LANG=ru_RU.UTF-8

如果安装操作系统时选择俄语,则无需配置。

2026 年起新增:
如果安装了 FlatPak,请编辑 ~/.bashrc 文件。
例如,使用 nano 文本编辑器:

nano ~/.bashrc

在其末尾添加以下行:
export XDG_DATA_DIRS="/usr/local/share/:/usr/share/:/var/lib/flatpak/exports/share:/home/vladimir/.local/share/flatpak/exports/share"

保存文件并退出nano:
Ctrl+S、Ctrl+X。

如果 xdg-desktop-portal 未启动,如何确保它正常工作?

通过将系统变量导入到用户环境中:

在大多数操作系统上这已经足够了:

systemctl --user import-environment XDG_CURRENT_DESKTOP

在韦兰:

systemctl --user import-environment WAYLAND_DISPLAY  XDG_CURRENT_DESKTOP

重新启动并检查门户是否正常工作:

systemctl --user start xdg-desktop-portal.service
systemctl --user status xdg-desktop-portal.service

如何查看xdg-desktop-portal.service服务?

1)您需要安装FlatPak应用程序,在其中安装另一个应用程序,例如,如所写的Chromium浏览器 在上一篇文章中

2) 首先,我们检查浏览器是否存在于已安装的 FlatPak 应用程序列表中。

flatpak list

3)让我们启动

flatpak run org.chromium.Chromium

4) 选择“打开文件”项 - 按 键 Ctrl+O。 应出现一个系统对话框,显示主文件夹的内容。 这意味着门户正在运行。

调试

dbus-monitor --session

并在另一个窗口中启动应用程序

flatpak run org.chromium.Chromium

并按 Ctrl+O:

橱窗里 dbus监控器 将会输出很多文本:
字符串“org.freedesktop.impl.portal.Request"

错误时间=1729069549.930735 发件人=:1.49 -> 目的地=:1.46 error_name=org.freedesktop.DBus.Error.UnknownMethodreply_serial=163
string“路径“/org/freedesktop/portal/desktop/request/1_88/handle_0”处的对象不存在"

方法调用时间=1729069549.931375 发送者=:1.46 -> 目的地=:1.49 序列=164 路径=/org/freedesktop/portal/desktop;接口=org.freedesktop.impl.portal.FileChooser;成员=打开文件
对象路径“/org/freedesktop/portal/desktop/request/1_88/handle_0"

字符串“org.chromium.Chromium"

字符串“x11:0x3a00019"

字符串“打开文件"

数组[
dict entry(
string "modal"
variant boolean true
)
dict entry(
string "filters"
variant array [
]
)
]

使用 xdg-open 开始查看 URL 或文档

您可以使用一个简单的命令,而不是启动应用程序并从中打开文档 xdg-开放“文件名”或 URL。

例如:

xdg-open https://bfm.ru

xdg-open 388643rus.pdf

用于测试的 PDF 文件 - “教科文组织总干事致辞*奥黛丽·阿祖莱 值此 2024 年 2 月 13 日世界无线电日之际”: 388643rus.pdf

  • 联合国教科文组织——联合国教育、科学和文化组织。

! xdg-open 实用程序包含在 xdg-utils 软件包中,并且默认安装在 Linux 上。 它启动的进程在 Flatpak 容器内运行。 还有一个包 flatpak-xdg-utils,它有一个特殊版本的 xdg-open 和一个名为 flatpak-spawn 的应用程序,它允许在容器外部的系统上进行操作。 这个特别版 xdg-开放 以不同的方式安装: /usr/libexec/flatpak-xdg-utils/ 而不是 /usr/bin/xdg-open。 安装包 flatpak-xdg-utils 通常,不需要。

!!! 为了管理Flatpak容器应用程序的权限(权限),有一个图形应用程序Flatseal(com.github.tchx84.Flatseal)。

sudo flatpak install com.github.tchx84.Flatseal
flatpak run com.github.tchx84.Flatseal

平面密封 允许你限制应用程序权限,类似于Android设置“应用程序和通知”-“应用程序权限”:

例如,FlatPak 的 Chromium 浏览器的权限:_

  • 网络 - 是
  • 进程间通信 - 是
  • X11 窗口系统 - 是的。
  • PulseAudio 声音服务器 - 是
  • 打印系统 - 是
  • GPU 加速 (device=dri) - 默认 No -> 可以更改为 Yes
  • 所有设备(网络摄像头)- 是
  • 所有用户文件 (filesystem=home) - 是
  • 后台(可以在后台工作)- 否
  • 通知(可以发送通知)- 否

文档链接:

Flatpak 桌面集成
XDG 桌面门户
*flatpak-xdg-utils



相关出版物