主题:matugen(Material You)

整桌面配色只有一个来源:matugen。它从当前壁纸提取一套 Material You 调色板,渲染成各应用的主题文件再触发重载。一处生成、处处生效,我不在十几个配置里手抄色值,这是整套桌面视觉一致的根。

每个被纳管的应用就是 config.toml 里的一个 [templates.*]:给一个模板输入、一个输出路径,模板里用 @{colors.primary.default.hex} 这类占位符引用算出来的颜色,matugen 渲染后写到位、再跑可选的 hook 重载。加一个新应用就是加一段:

[config]
[templates.ghostty]
input_path  = "~/.config/matugen/templates/ghostty"
output_path = "~/.config/ghostty/themes/MaterialYou"

[templates.zellij]
input_path  = "~/.config/matugen/templates/zellij.kdl"
output_path = "~/.config/zellij/themes/MaterialYou.kdl"

覆盖面很广,现在挂着的有 Quickshell、Ghostty、hyprland/hyprlock、fuzzel、fcitx5、GTK3/4、KDE、Zellij……换壁纸时它们一起换。

调色的"性格"由两个旋钮定:--mode light|dark 选明暗,--type 选 Material You 的配色方案(scheme-tonal-spot 是默认那种柔和的、scheme-vibrant/scheme-expressive 更跳、scheme-content 更贴近壁纸主色)。换一种 type,整桌面的浓淡就换一套,但仍是同源一致。

真正让这套体验"活"起来的是两个 post_hook——让已经开着的程序也当场跟着变,而不是等下次启动:

post_hook = 'fcitx5-remote -r || true'   # 输入法皮肤立即重载
# 把生成的 OSC 颜色序列写进每个 pts,所有开着的终端窗口当场换色
post_hook = 'for p in /dev/pts/[0-9]*; do [ -w "$p" ] && cat .../ghostty-sequences.txt > "$p"; done; true'

换壁纸的同时,手头几个终端"唰"地一起变色,这个细节挺上瘾的。

flowchart LR
    W[壁纸] --> M[matugen]
    M --> QS[(quickshell colors.json)]
    M --> G[Ghostty + OSC]
    M --> X[hyprlock / fuzzel / fcitx5 / GTK / Zellij]
    M -. post_hook .-> R[fcitx5 重载 · 终端当场改色]

顺带提一句 waybar:~/.config/waybar 还留着一套当备选状态栏,但顶栏现在交给 Quickshell 了。两套都吃 matugen 的色,想换回去也不用重配颜色。