[Share Experiences] 巧用XDG规范自定义文件关联图标,以QGIS为例
Tofloor
poster avatar
MeGusta
deepin
7 hours ago
Author

qgis-default-icons-20260319.zip

知识点:在XDG(Cross-Desktop Group,或Freedesktop.org)规范中,用户可以通过下面的文件来定义文件类型信息:

~/.local/share/mime/packages/*.xml

现状:与Windows下,各种软件争抢默认文件关联方式和默认图标的情况类似,目前UOS/deepin下也存在这种问题,主要分以下两种情况:

1.系统预装主题中,制作了相关的文件类型图标,随着用户切换主题,文件关联图标会随着发生变化;

2.软件开发商在制作deb安装包时,将相关的文件关联图标和打开方式在系统中置顶,来强制修改全局设置,例如WPS和中望CAD。

这个帖子主要讨论第1种情况。

下面是QGIS数据文件,在不同主题下的各种文件图标:

截图_选择区域_20260319104852.png

截图_选择区域_20260319104529.png

截图_选择区域_20260319104549.png

截图_选择区域_20260319104600.png

问题:除了QGIS默认的文件图标之外,其他主题的辨识度不高,与长期积累的经验不符,很容易与其他普通文件弄混。

随着主题切换而变化的图标,让人很难用直觉快速识别这些特殊格式的文件。

在桌面上各种文件比较多的情况下,体验尤其不好,不注意的话,容易造成文件误删。

如何让这些文件图标固定下来,不要随着系统主题的切换而发生变化呢?

解决方案

之前找了一些方法,要么过于复杂,要么是在gnome、kde等其他桌面环境下才生效,都不理想。

今天再问gemini的时候,ai给出了一个大道至简的方法,直接在用户配置目录中,自定义mimetype的xml文件,修改icon文件名定义,让系统不要再去找预装的图标文件。

简单示例

1.复制QGIS软件自带的qgis.xml,原始内容如下(...指略去的内容):

  
    ...
    
    ...
  

2.修改图标定义,以.qgs文件为例:

通用的图标名称为 qgis-qgs,在前面加个前缀字符串,如 default-,即 default-qgis-qgs

或者直接批量替换字符串:icon name="qgisicon name="default-qgis

  
    ...
    
    ...
  

修改完之后,另存为 default-qgis.xml

3.从QGIS的安装资源中复制图标文件,并修改名称:

QGIS的默认文件图标是按照 hicolor主题目录的方式组织的。

这里只需要让ai写个bash脚本,遍历QGIS的 hicolor目录中的所有文件,在文件名中添加前缀 default-,如下图:

截图_选择区域_20260319112244.png

4.将 default-qgis.xml复制到 ~/.local/share/mime/packages/

hicolor目录复制到 ~/.local/share/icons/

5.刷新一下刷新文件关联及图标:

# 更新mime数据库
update-mime-database ~/.local/share/mime
# 更新桌面数据库
update-desktop-database ~/.local/share/applications
# 更新图标缓存
update-icon-caches ~/.local/share/icons/*

6.经过如此的修改,系统不再去找通用的 qgis-qgs.png,而是回退到用户的hicolor主题目录,寻找自定义的 default-qgis-qgs.png

另一方面,由于用户设置优先级高于系统设置,即便是在 /usr/share/mime/packages/下有原始的 qgis.xml,优先级也低于用户的 ~/.local/share/mime/packages/,用户设置也不受系统影响。

这样,图标显示就完成了自定义,不会再跟随系统主题而变化了。

总结

通过修改,或者创建mimetype的xml定义文件,可以在比较细的粒度上对个别的文件图标进行自定义,同时避免对系统文件的修改,简化了操作。

修改保存在用户配置目录下,即便是重装系统,这些修改依然持久存在。

有兴趣的朋友,可以举一反三,对其他的文件图标进行自定义。

Reply Favorite View the author
All Replies
mozixun
Moderator
7 hours ago
#1

好文,前排blush

Reply View the author
晚秋(lateautumn)
Moderator
3 hours ago
#2

学习了,谢谢大佬分享applaud

Reply View the author