[Bug Report] deepin 25 控制中心无法识别并显示自定义纯 DCI 图标主题 Resolved
Tofloor
poster avatar
汉堡包战士
deepin
18 hours ago
Author

【Bug 反馈】deepin 25 控制中心无法识别并显示自定义纯 DCI 图标主题(附完整复现路径与底层配置割裂现象)

📝 问题概述

在 deepin 25 系统中,用户按照 DSG (Desktop Specs Group) 规范,使用官方推荐的 svgs2dci 工具制作了纯 DCI 格式的第三方图标主题。将该主题放置在标准目录(/usr/share/dsg/icons/)下后,控制中心的“图标主题”列表中完全无法识别并显示该主题。

同时,系统存在控制中心显示状态与实际底层配置不同步的严重 Bug,导致用户替换主题目录内的图标文件后毫无反应。

💻 环境信息

  • 系统版本:deepin 25
  • 桌面环境:DDE (X11 会话,非 Wayland/Treeland)
  • 关键组件版本:deepin-desktop-theme 1.1.30 (已高于社区反馈的修复版本 1.1.14)
  • 制作工具:svgs2dci (基于 Qt6/DTK 6.7)
  • 磐石系统状态:已关闭 (sudo deepin-immutable-ctl disable-system-protect enable),/usr 目录完全可写。
    image.png
    image.png

🔄 完整复现步骤

第一阶段:制作与放置自定义 DCI 主题

  1. 使用 svgs2dci 工具将自己设计的 SVG 图标(Win11 风格)批量打包为 .dci 文件。
  2. 创建系统级主题目录:sudo mkdir -p /usr/share/dsg/icons/win11full
  3. 为了防白块,将系统默认的 bloom-classic 里的所有 .dci 复制到 win11full 中,再用自己做的同名 .dci 覆盖。
  4. 控制中心刷新/重启后,“图标主题”列表中找不到 win11full。

第二阶段:排查配置文件与目录结构

  1. 社区有人建议在 /usr/share/deepin-themes/ 下添加 index.theme。尝试后发现,添加后会把它识别成“全局主题”出现在桌面主题列表(且缩略图空白),而不是图标主题。
  2. 删除 deepin-themes 下的配置,仅保留 /usr/share/dsg/icons/win11full/ 下的纯 .dci 文件,依然不显示。
  3. 排除了根目录散落 .dci 文件干扰(/usr/share/dsg/icons/*.dci 被移走测试)。

第三阶段:发现底层配置与界面显示的割裂(核心 Bug)

  1. 在控制中心界面中,用户选中了 organic-glass。
  2. 使用终端查询底层实际的图标主题配置:
    gsettings get com.deepin.dde.appearance icon-theme
    # 返回结果竟然是:'bloom'
    
  3. 现象:控制中心界面显示已切换为 organic-glass,但底层 gsettings 配置仍是 bloom。
  4. 用户尝试将自定义的 com.qq.weixin.deepin.dci 覆盖到 /usr/share/dsg/icons/organic-glass/ 下,注销重启后,微信图标无任何变化。
  5. 这也解释了为什么替换 organic-glass 文件无效——系统底层根本就没去读取这个主题,一直在读 bloom。

🐛 发现的核心问题 (Bug 列表)

  1. 第三方 DCI 主题无法上架控制中心:控制中心的 iconThemeViewModel 没有提供扫描并注册 /usr/share/dsg/icons/ 下自定义文件夹的机制。
  2. 控制中心 UI 与 GSettings 状态脱节:在 X11 环境下,图形界面选中的图标主题,未能正确写入底层 com.deepin.dde.appearance 的 GSettings 中。这导致了“所见非所读”的割裂状态。
  3. DCI 图标渲染缓存/回退机制异常:在主题文件夹内有同名文件的情况下,替换后不生效,疑似散落文件 fallback 逻辑或 dde-desktop 缓存未更新。

🤔 已有的社区线索

在前期排查中,参考了社区的相关讨论:

  • 有用户指出,纯 DCI 主题不需要 index.theme,只需放入 $DSG_DATA_DIR/icons/ 即可被 DTK 程序读取,但如何在控制中心显示是个未解之谜。
  • 官方人员曾表示,商店中的第三方主题由于不是“完整主题包”,只会出现在图标/光标模块。但这无法解释纯 DCI 自建包为何完全不显示。
  • 有反馈指出,商店下载的第三方图标主题在 25.0.7 版本后无法应用,官方已提单追踪。

💡 期望的解决方案

  1. 希望官方明确:目前 (deepin 25) 是否支持普通用户自建的纯 DCI 主题在控制中心列表中选择?如果支持,标准的目录结构和必须的元数据文件(如配置文件格式)是什么?
  2. 修复控制中心界面与 GSettings 底层的同步 Bug,确保用户点击切换后,gsettings get 的返回值能实时对应。
  3. 修复 DCI 图标的 fallback 和缓存机制,确保用户覆盖同名 .dci 文件后,重启桌面进程能够立即生效。

🔧 目前的临时绕过方案

鉴于以上 Bug 存在,目前只能采用“寄生”方案强行替换:
既然底层 gsettings 明确返回当前使用的是 bloom,则不管控制中心显示什么,直接将所有自定义的 .dci 文件覆盖到 /usr/share/dsg/icons/bloom/ 目录下,重启系统或重启 dde-desktop 服务,以此达到更换图标的目的。

或使用旧版xdg文件规范(应用商店内主题使用逻辑)


感谢开发团队的辛勤付出,希望 deepin 25 的自定义图标功能早日完善!

Reply Favorite View the author
All Replies
avatar
hotime
deepin
15 hours ago
#1

刚刚看了下商店里的图标主题deb包里的内容,测试了一下。

单纯在/usr/share/dsg/icons/目录放置自己的图标目录比如my-icon-theme还不够

需要在/usr/share/icons/目录放置同名目录比如my-icon-theme,目录里需要有index.theme(参照其他目录的index.theme),不然控制中心不知道这套图标的名称是什么。

比如我这里精简以后,文件内容是:

[Icon Theme]
Name=my-icon-theme
Directories=./

目前/usr/share/dsg/icons/my-icon-theme目录下只放了一个图标 dde-file-manager.dci

这里的Directories我们其实走dsg目录的话,我们不会往/usr/share/icons/my-icon-theme/目录放那些目录actions、apps之类的各种目录,但是这个字段必须有值,这里直接任意写了个./(暂时还没发现什么问题,我这就一个图标)。

效果是这样的:

图片.png

Reply View the author
avatar
hotime
deepin
15 hours ago
#2

对了,目前控制中心 - 个性化 - 颜色和图标 - 图标主题中,显示自己的图标主题时,下方展示的五个图标,这里暂时还是从 /usr/share/icons/自己的图标目录中找的,还没有支持直接从dsg/主题目录去找(应该需要优化一下)。

比如我们暂时直接放到图标主题目录下:/usr/share/icons/my-icon-theme/dde-file-manager.svg
或者放到图标主题目录的apps目录下/usr/share/icons/my-icon-theme/apps/512/dde-file-manager.svg
都行。

纠正一下,我这里说错了,不用额外往/usr/share/icons/xxx目录放这五个应用的图标,注销重新登录它就会显示dsg/xxx目录的正确dci图标了。

图片.png

Reply View the author
avatar
𰻞𰻝面
deepin
9 hours ago
#3

完全可以,看看我的:

image.png

image.png

image.png

image.png

录屏_dde-shell-desktop_20261015093138.gif

Reply View the author
avatar
汉堡包战士
deepin
8 hours ago
#4
𰻞𰻝面:

完全可以,看看我的:

image.png

image.png

image.png

image.png

录屏_dde-shell-desktop_20261015093138.gif

你这是xdg旧版规范吧confused

Reply View the author
avatar
𰻞𰻝面
deepin
8 hours ago
#5
汉堡包战士:

你这是xdg旧版规范吧confused

不知道是什么规范,也是用你那软件弄的。启动器里可以双色切换,任务栏只能显示浅色图标。

Reply View the author
avatar
汉堡包战士
deepin
8 hours ago
#6
hotime:

刚刚看了下商店里的图标主题deb包里的内容,测试了一下。

单纯在/usr/share/dsg/icons/目录放置自己的图标目录比如my-icon-theme还不够

需要在/usr/share/icons/目录放置同名目录比如my-icon-theme,目录里需要有index.theme(参照其他目录的index.theme),不然控制中心不知道这套图标的名称是什么。

比如我这里精简以后,文件内容是:

[Icon Theme]
Name=my-icon-theme
Directories=./

目前/usr/share/dsg/icons/my-icon-theme目录下只放了一个图标 dde-file-manager.dci

这里的Directories我们其实走dsg目录的话,我们不会往/usr/share/icons/my-icon-theme/目录放那些目录actions、apps之类的各种目录,但是这个字段必须有值,这里直接任意写了个./(暂时还没发现什么问题,我这就一个图标)。

效果是这样的:

图片.png

感谢大佬🙏,按照您的方案终于成功了😂

kissing_heart

Reply View the author