Wie wird mein ausgewähltes Thema an gtk übermittelt?

431
Sal Valente

Verbunden mit Wo wird Gtk + Standarddesign gespeichert

Ich verwende Mate-Desktop. Ich sehe, dass meine Aussehenseinstellungen in gsettings gespeichert werden:

$ 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 

Wenn ich ein einfaches gtk-Hallo-Welt-Programm schreibe und es mit libgtk, ohne Mate- oder Gnome- oder Desktop-Bibliotheken, verknüpfe, funktioniert es. Es zeigt das ausgewählte Erscheinungsbild. Ich bin mir ziemlich sicher, dass "org.mate.interface" nicht in libgtk fest codiert ist. Und ich gehe davon aus, dass "gsettings" nicht in libgtk fest codiert ist. Wie bekommt es meine Konfiguration? Umgebungsvariable, Dotfile, X-Server-Eigenschaft, was?

2

1 Antwort auf die Frage

1
grawity

Und ich gehe davon aus, dass "gsettings" nicht in libgtk fest codiert ist.

Dies ist eine schlechte Annahme, da GSettings der primäre Konfigurationsspeicher für die meisten GNOME-Programme ist und tatsächlich zum Abrufen des Themennamens in GTK 3 unter Wayland verwendet wird. Insbesondere verwendet gdkdisplay-wayland gtk-themeim org.gnome.desktop.interfaceSchema.

Bei X11 verwendet GTK jedoch das XSETTINGS-Protokoll, bei dem ein separater DE-spezifischer Dämon von jedem beliebigen Ort aus verschiedene Einstellungen erhält und sie mithilfe des Auswahlmechanismus von X11 in einem Standardformat erneut veröffentlicht.

Beim Starten jedes Client, der das Einstellungsfenster durch Aufrufen von XGetSelectionOwner () für die Auswahl von _XSETTINGS_S [N] identifizieren soll, und im Einstellungsfenster eine Benachrichtigung durch Aufrufen von XSelectInput () mit einer Maske von StructureNotifyMask | PropertyChangeMask auswählen.

[…] Der Client kann dann den Inhalt der Eigenschaft _XSETTINGS_SETTINGS aus dem Einstellungsfenster lesen und gemäß den Informationen im Abschnitt "_XSETTINGS_SETTINGS-Format" dieses Dokuments interpretieren

Da Sie MATE verwenden, mate-settings-daemonist der XSETTINGS-Anbieter. Es liest org.mate.interfaceaus GSettings und veröffentlicht den Wert erneut Net/ThemeNameüber XSETTINGS, wo GTK ihn abrufen kann.

Die Verwendung des XSETTINGS-Protokolls macht das Backend irrelevant - z. B. verwenden ältere GNOME- und MATE-Versionen GConf, während Xfce XfConf verwendet, und es gibt ein eigenständiges Xsettingsd, das eine Textdatei verwendet. (Auf der anderen Seite ist das Protokoll, wie Sie sehen können, sehr spezifisch für X11 und kann nicht in Wayland verwendet werden.)

Das xsettingsd- Paket enthält auch ein dump_xsettingsTool, das Daten von dem jeweils aktiven Provider ausgibt .

Beachten Sie, dass nicht alle Desktop-Umgebungen einen XSETTINGS-Provider ausführen. Bei Verwendung von LXDE werden beispielsweise lxappearancedie Konfigurationsdateien einfach bearbeitet: ~/.gtkrc-2.0für GTK 2 und ~/.config/gtk-3.0/settings.inifür GTK 3. Diese werden immer gelesen, aber mit der niedrigsten Priorität verwendet - die angegebenen Parameter von GSettings oder XSETTINGS gewinnen immer.

Zusammenfassung:

  • GTK 3 unterstützt $ GTK_THEME, um das Thema vorübergehend zu überschreiben.
  • In Wayland liest GTK 3 den Designnamen von GSettings mit der Konfigurationsdatei als Fallback.
  • In X11 ruft GTK 2/3 den Namen eines Themes von einem XSETTINGS-Dämon ab, wobei die Konfigurationsdatei als Fallback dient.
  • GTK 1 unterstützt nichts außer der dateibasierten Konfiguration (gtkrc).