
Mate デスクトップを使用しています。外観設定は gsettings に保存されているようです。
$ gsettings get org.mate.interface gtk-theme
'TraditionalOk'
$ gsettings get org.mate.interface font-name
'Ubuntu 11'
$ gsettings get org.mate.font-rendering dpi
173.0
単純な gtk hello-world プログラムを作成し、mate や gnome やデスクトップ ライブラリなしで libgtk のみにリンクすると、プログラムが動作します。選択した外観が表示されます。"org.mate.interface" が libgtk にハードコードされていないことは確かです。また、"gsettings" が libgtk にハードコードされていないことも想定しています。では、どのように構成を取得するのでしょうか。環境変数、ドットファイル、X サーバー プロパティ、何でしょうか。
答え1
また、「gsettings」は libgtk にハードコードされていないと想定します。
それは間違った仮定です。GSettingsはほとんどの GNOME プログラムの主な設定ストレージであり、Wayland の GTK 3 でテーマ名を取得するために使用されます。具体的には、gdkdisplay-wayland はスキーマgtk-theme
で使用しますorg.gnome.desktop.interface
。
しかし、X11ではGTKはXSETTINGS プロトコル、別の DE 固有のデーモンが必要な場所からさまざまな設定を取得し、X11 の選択メカニズムを使用して標準形式で再公開します。
起動時に、各クライアントは、_XSETTINGS_S[N]選択に対してXGetSelectionOwner()を呼び出すことによって設定ウィンドウを識別し、StructureNotifyMask|PropertyChangeMaskのマスクを使用してXSelectInput()を呼び出すことによって設定ウィンドウで通知を選択する必要があります。
[…] その後、クライアントは設定ウィンドウから_XSETTINGS_SETTINGSプロパティの内容を読み取り、このドキュメントの「_XSETTINGS_SETTINGSフォーマット」セクションの情報に従って解釈することができます。
MATE を使用しているため、mate-settings-daemon
は XSETTINGS プロバイダーです。これはorg.mate.interface
GSettings から読み取り、値を XSETTINGS 経由で再公開しNet/ThemeName
、GTK が最終的に値を取得できるようになります。
XSETTINGSプロトコルを使用すると、バックエンドは無関係になります。たとえば、古いGNOMEとMATEバージョンではGConfが使用されていましたが、XfceではXfConfが使用され、スタンドアロンのx設定dテキスト ファイルを使用します。(一方、ご覧のとおり、このプロトコルは X11 に特化しており、Wayland 内では使用できません。)
のx設定dパッケージには、dump_xsettings
現在実行中のプロバイダーからデータをダンプするツールも付属しています。
すべてのデスクトップ環境でXSETTINGSプロバイダが動作するわけではないことに注意してください。たとえば、LXDEを使用する場合は、GTK 2の場合はlxappearance
設定ファイルを編集するだけで済みます。GTK 3の場合は設定ファイルを編集するだけで済みます。~/.gtkrc-2.0
~/.config/gtk-3.0/settings.ini
いつも読み取られますが、最も低い優先順位で使用されます。GSettings または XSETTINGS で指定されたパラメータが常に優先されます。
まとめ:
- GTK 3は$GTK_THEMEをサポートし、一時的にテーマを上書きします。
- Wayland では、GTK 3 は設定ファイルをフォールバックとして使用して、GSettings からテーマ名を読み取ります。
- X11 では、GTK 2/3 は設定ファイルをフォールバックとして使用して、XSETTINGS デーモンからテーマ名を取得します。
- GTK 1 は、ファイルベースの構成 (gtkrc) 以外は何もサポートしていません。