# atzlinux-icons-misc **Repository Path**: atzlinux/atzlinux-icons-misc ## Basic Information - **Project Name**: atzlinux-icons-misc - **Description**: atzlinux 项目程序图标软件包 - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: atzlinux/latest - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2020-10-08 - **Last Updated**: 2025-04-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 自定义文件扩展名图标的技术原理 2020-10-8, Careone #### 示例1:自定义 DEB 文件扩展名的图标 1. 在 /usr/share/mime/packages/ 目录下,找到 freedesktop.org.xml 文件。 这个文件里,包含了大量的通用 MIMETYPE 定义数据。 在这个文件里,搜索 *.deb,可以找到类似这样一段内容 (位置大约在 9896-9959行): ---------------- Debian package Debian 软件包 Debian 軟體包 ---------------- 把 中间的数据,复制并另存为同目录下的另一个 文件,如 001.xml, 并在文件开头、尾部加上相应的格式标签。如: * 文件头标签: * 文件尾标签: 然后,保存文件 001.xml。完整的文件目录位置应该是这样的: /usr/share/mime/packages/001.xml 最后,再以 root 用户,或者 sudo 运行命令 sudo update-mime-database /usr/share/mime 即可更新 MIMETYPE 数据库。 提示: 如果没有手动运行 update-mime-database 命令,但是如果后面有安装或删除软件 包的操作,系统通常也会自动更新 MIMETYPE 数据库。 解析如下: #### 1. MIMETYPE 类型定义 这一行,定义了 mimetype 类型为 application/vnd.debian.binary-package (注:我们可以自定一个新类型,例如:application/package-deb。相同的扩展名, 可以定义为不同的类型,根据 "magic 内容检测" 和不同的 "优先级 priority" 先后 顺序,来实际确认文件真实类型,而不被扩展名蒙蔽和欺骗。 ) * 例1:同样是 PGN 扩展名,文件实际内容,可能是中国象棋的棋局文件,也可能是 国际象棋的棋局文件。 * 例2:同样是 BAK 扩展名,文件实际内容,可能是备份文件,也可能是早期版本的 WPS 文档备份副本。 #### 2. 文件图标定义 这一行,定义了图标的文件名。图标的扩展名格式通常选用 PNG 或者 SVG 格式。 默认图标目录位置,一般为 /usr/share/icons/hicolor/scalable/mimetypes/*.svg /usr/share/icons/hicolor/64x64/mimetypes/*.png /usr/share/icons/hicolor/48x48/mimetypes/*.png /usr/share/icons/hicolor/32x32/mimetypes/*.png /usr/share/icons/hicolor/24x24/mimetypes/*.png /usr/share/icons/hicolor/22x22/mimetypes/*.png /usr/share/icons/hicolor/16x16/mimetypes/*.png 如:/usr/share/icons/hicolor/scalable/mimetypes/package-x-generic.svg 说明:如果系统找不到对应尺寸的图标,则会根据找到的其它尺寸的图标,自动缩放 调整大小 。 另外,如果是其它图标主题,上面目录名的 hicolor, 可能对应其它名称,如 /usr/share/icons/gnome/scalable/mimetypes/ /usr/share/icons/oxygen/scalable/mimetypes/ /usr/share/icons/Faenza/scalable/mimetypes/ /usr/share/icons/Papirus/scalable/mimetypes/ 最后,再以 root 用户,或者 sudo 运行命令 sudo update-icon-caches /usr/share/icons 即可更新 图标 数据库。 提示: 如果没有手动运行 update-icon-caches 命令,但是如果后面有安装或删除软件 包的操作,系统通常也会自动更新 MIMETYPE 数据库。 #### 3. 扩展名和 MIMETYPE 类型的优先级 这一行的数字 50, 代表优先级。通常 freedesktop.org.xml 文件的默认优先级数值是 50 ,(当然,某些扩展名,默认的数值也可能 60 或者其它)。我们自定义的类型 的 DEB ,优先级数值应大于这里的默认值 50。比如,我们自定义为 59 (范围 51-99)。 #### 4. 对应的扩展名 这两行,表示扩展名为 deb 和 udeb 的文件,都按上面的规则定义来识别和判断文件 类型。 #### 5. 其它标签功能 * 1. magic (通过读取文件前面少量内容,来实际确认文件类型。即使文件名不带扩 展名,如文件名为 001 (而不是 001.xml),也可以通过这种方式,来实际确认文件 类型,并以对应的图标来显示区分。 提示:这个特色功能, 非常实用。在 Windows 操作系统上,是无法做到的。 * 2. alias 和 , alias 可以指定文件类型的别名。即不同的定义(如来自不同厂家的 CAD 图纸文件, 可能定义的 dwg 和 dxf 图纸文件的 MIMETYPE 并不是一样的)。 好比菜市场买菜,有人说西红杮,也有人叫番茄,实际指的都是同一种东西。 #### 6. 文件打开关联 以 DEB 扩展名为例,通常我们都希望以 gdebi-gtk 程序来打开 DEB 软件包,可以查 看 /usr/share/applications/gdebi.desktop 这个快速启动菜单文件(功能大致相当于 Windows 操作系统下的快捷方式)。 里面有几项内容是相关的。示例如下: --------- Exec=gdebi-gtk %f Icon=gnome-mime-application-x-deb MimeType=application/vnd.debian.binary-package; --------- 1. Exec 即默认打开时运行的命令。 小写的 %f 表示可以打开单个文件,大写的 %F 表示可以打开多个文件。另外还有 %u, %U 等附加选项,这里不多解说。 2. Icon 指定图标。图标的命名规则和搜索目录位置,与前面介绍的原理相同。 提示:如果是 /usr/share/pixmaps/ 目录下有同名的图片(不包含扩展名),如 gnome-mime-application-x-deb.png gnome-mime-application-x-deb.xpm gnome-mime-application-x-deb.svg 等等,也可以被程序搜索到。 当然,也可以直接指定完整图标文件位置,如 /usr/share/pixmaps/xxx.png 3. MimeType 类型 后面的数据,对应 /usr/share/mime/packages/ 目录下的 freedesktop.org.xml (或者其它 xxx.xml 文件)中的 mime-type 相应标签。 注意: MimeType 最后面一定要有一个英文分号。另外,支持多个 MIMETYPE 类型,示例: --------- MimeType=application/vnd.debian.binary-package;application/package-deb; --------- 最后,再以 root 用户,或者 sudo 运行命令 sudo update-desktop-database /usr/share/applications 即可更新 desktop 数据库。 提示: 如果没有手动运行 update-desktop-database 命令,但是如果后面有安装或删除 软件包的操作,系统通常也会自动更新 "desktop (快捷菜单命令)" 数据库。 ## 技术细节 (2023-5-18 补充) 严格按照 freedesktop.org.xml (完整路径:/usr/share/mime/packages/freedesktop.org.xml) 里的原始 mime 定义,来命名图标文件名。 如 CAD *.dwg 图纸,对应 MIME 类型是 image/vnd.dwg ,那么图片文件名命名规则就是: image-vnd.dwg.png (或者 svg 图片格式)。 这样,系统会优先在 /usr/share/icons/ 图标目录下,查找叫这个文件名的图标,而忽略 xml 文件里的 generic-icon 定义。