4 分で読了 #tools #hyprland

テーマ:matugen(Material You)

デスクトップ全体の配色は、ただ一つのソースから来ています:matugen。これは現在の壁紙から Material You のパレットを抽出し、各アプリケーションのテーマファイルにレンダリングしてリロードをトリガーします。一箇所で生成すれば、あらゆる場所で有効になり、私は十数ある設定ファイルに色値を手動でコピーする必要がなくなります。これが、デスクトップの視覚的な一貫性を保つ根本的な理由です。

管理対象の各アプリケーションは、config.toml 内の [templates.*] セクションとして定義されます。テンプレートの入力パス、出力パスを指定し、テンプレート内で @{colors.primary.default.hex} といったプレースホルダを使用して計算された色を参照します。matugen がレンダリングして値を書き込んだ後、オプションのフックを実行してリロードを行います。新しいアプリケーションを追加するには、単に以下のようなセクションを追加するだけです:

[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 などです。壁紙を変更すると、これらが一斉に色を変更します。

配色の「性格」は2つのパラメータで決定されます:--mode light|dark で明暗モードを切り替え、--type で Material You の配色スキームを選択します(scheme-tonal-spot はデフォルトの柔らかいスタイル、scheme-vibrant/scheme-expressive はより鮮やかで、scheme-content は壁紙のメインカラーに近づきます)。type を変更すると、デスクトップ全体のトーンが一変しますが、依然として同源の一貫性を保ちます。

この体験を「生きた」ものにしているのが、2つの post_hook です。これにより、次回起動を待たずに、すでに実行中のプログラムも即座に色を変更することができます:

post_hook = 'fcitx5-remote -r || true'   # IME スキンの即時リロード
# 生成された 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 の色を使用しており、戻したい場合でも色設定を再構成する必要はありません。