如何以便携方式设置文件扩展名的图标,无需 sudo

如何以便携方式设置文件扩展名的图标,无需 sudo

我正在创建一个应用程序,它想要安装图标对于特定于应用程序的扩展(.crystalopen),这种方式不仅适用于 Ubuntu/GNOME,而且可移植到其他桌面环境比如 KDE。

应用程序会自行安装到~/.local/bin(而不是安装到/usr/bin),因此不需要 root 权限。因此我希望图标安装在~/.local/如果可能的话。

我尝试过的方法

注册 MIME 类型application/vnd.crystal-opener)为.crystalopen扩展创建一个application-vnd.crystal-opener.xml如下内容:

<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
    <mime-type type="application/vnd.crystal-opener">
        <comment>Crystal Opener</comment>
        <glob pattern="*.crystalopen"/>
    </mime-type>
</mime-info>

并使用以下命令进行安装:

$ xdg-mime install --mode user application-vnd.crystal-opener.xml

其内部:

  1. 将其复制到~/.local/share/mime/packages,并根据需要创建任何中间目录;并且
  2. 运行update-mime-database ~/.local/share/mime/以更新~/.local/share/mime/mime.cache

验证 MIME 类型是否已注册通过创建一个具有文件扩展名的非空1文件并查询其 MIME 类型:

$ echo OPEN > OPEN.crystalopen
$ xdg-mime query filetype OPEN.crystalopen
application/vnd.crystal-opener

或等效地(在 GNOME 上):

$ gio info OPEN.crystalopen | grep standard::content-type
  standard::content-type: application/vnd.crystal-opener

创建图标图像使用适合 MIME 类型的正确文件名application-vnd.crystal-opener.svg

<svg height="128" width="128">
  <ellipse cx="43" cy="32" rx="32" ry="32" style="fill:red" />
  <ellipse cx="84" cy="32" rx="32" ry="32" style="fill:green" />
</svg>

图标主题规范说我应该能够在所有其他主题都继承自的“hicolor”主题中安装这样的图像。但这似乎不起作用。特别是如果我执行以下操作:

$ sudo cp application-vnd.crystal-opener.svg /usr/share/icons/hicolor/scalable/mimetypes
$ sudo update-icon-caches /usr/share/icons/*

那么文件应用程序中文件的图标OPEN.crystalopen不会更改为新图像。

也许文件应用程序没有正确实现主题继承?2

相反,我确定哪个特定主题是系统的默认主题并在那里安装图标,这感觉不太可靠或便携:

  • 确定系统默认主题的候选主题通过查找常见 MIME 类型的图标,例如text/html
$ find /usr/share/icons -name 'text-html.*'
/usr/share/icons/Yaru/... (10 lines)
/usr/share/icons/HighContrast/... (1 line)
/usr/share/icons/Humanity/... (7 lines)
  • 最终Humanity竟然成为了本系统(Ubuntu 23)的系统默认主题。

  • 首先,我尝试将图标安装到机器范围的主题目录中:

$ sudo cp application-vnd.crystal-opener.svg /usr/share/icons/Humanity/mimes/256
$ sudo update-icon-caches /usr/share/icons/*
  • 这样就成功了,成功将文件应用程序中文件的图标更新OPEN.crystalopen为新图像。
  • 但我想安装到用户的主题目录而不是整个机器的主题目录,因此我改为这样做:
$ mkdir -p ~/.local/share/icons/Humanity/mimes/256
$ cp application-vnd.crystal-opener.svg ~/.local/share/icons/Humanity/mimes/256
$ sudo update-icon-caches /usr/share/icons/*  # not sufficient to update: ~/.local/share/icons/*
  • OPEN.crystalopen这也有效,成功将文件应用程序中的文件图标更新为新图像。(尽管不幸的是sudo,在下次注销和登录之前,需要更新机器范围的图标缓存才能立即显示图标。)

大问题

如何将图标安装到用户主题目录中,以便文件应用程序中相关文件的图标以可靠且便携的方式更新为新图像它不仅可以在 GNOME 上运行,还可以在 KDE 和其他桌面环境中运行?

特别是,是否可以安装一个图标到主题中~/.local/share/icons/hicolor,该图标记录在图标主题规范是否始终可用?


1空文件通常会被识别为 MIME 类型,application/x-zerosize而不是任何新注册的自定义 MIME 类型。

2 “Nautilus 不遵守 [主题] 继承规则” 根据https://askubuntu.com/a/752316/1724736

答案1

由于主题之间的图标继承似乎无法正常工作,我只好编写了一个脚本来安装我的应用程序图标到全部系统上的主题。混乱但有效。

请参见124 行自定义安装代码我曾经实现过这个。

相关内容