web-dev-qa-db-ja.com

選択したテーマはどのようにgtkに伝達されますか?

関連 Gtk +のデフォルトテーマはどこに保存されていますか

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

単純なgtkhello-worldプログラムを作成し、それをlibgtkのみにリンクし、mate、gnome、またはデスクトップライブラリを使用しない場合は機能します。選択した外観が表示されます。 「org.mate.interface」がlibgtkにハードコードされていないことは間違いありません。そして、「gsettings」はlibgtkにハードコードされていないと思います。では、どのようにして構成を取得するのでしょうか?環境変数、ドットファイル、Xサーバープロパティ、何ですか?

2
Sal Valente

そして、「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プロバイダーです。 GSettingsからorg.mate.interfaceを読み取り、XSETTINGSを介して値をNet/ThemeNameとして再公開し、GTKが最終的に取得できるようにします。

XSETTINGSプロトコルを使用すると、バックエンドは無関係になります。古いGNOMEとMATEバージョンはGConfを使用し、XfceはXfConfを使用し、テキストを使用するスタンドアロンxsettingsdがあります(一方、ご覧のとおり、プロトコルはX11に非常に固有であり、Wayland内では使用できません。)

xsettingsdパッケージには、現在実行中のプロバイダーからデータをダンプするdump_xsettingsツールも付属しています。

すべてのデスクトップ環境がXSETTINGSプロバイダーを実行しているわけではないことに注意してください。たとえば、LXDEのlxappearanceを使用すると、構成ファイルが編集されます。GTK2の場合は~/.gtkrc-2.0、GTK3の場合は~/.config/gtk-3.0/settings.iniです。これらは常に読み取りますが、最も低い優先度で使用されます–GSettingsまたはXSETTINGSで指定されたパラメーターが常に優先されます。

概要:

  • GTK 3は、$ GTK_THEMEをサポートして、テーマを一時的にオーバーライドします。
  • Waylandでは、GTK 3はGSettingsからテーマ名を読み取り、構成ファイルをフォールバックとして使用します。
  • X11では、GTK 2/3は、フォールバックとして構成ファイルを使用して、XSETTINGSデーモンからテーマ名を取得します。
  • GTK 1は、ファイルベースの構成(gtkrc)以外はサポートしていません。
2
user1686