Как моя выбранная тема сообщается в 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
Если я пишу простую программу gtk hello-world и связываю ее просто с libgtk, без библиотек mate, gnome или desktop, это работает. Отображает выбранный вид. Я почти уверен, что "org.mate.interface" не прописан в libgtk. И я предполагаю, что "gsettings" не жестко запрограммирован в libgtk. Так как это получить мою конфигурацию? Переменная окружения, dotfile, свойство X-сервера, что?
1 ответ
И я предполагаю, что "gsettings" не жестко запрограммирован в libgtk.
Это неверное предположение, поскольку GSettings является основным хранилищем конфигурации для большинства программ GNOME и действительно используется для получения имени темы в GTK 3 в Wayland. В частности, gdkdisplay-wayland использует gtk-theme
в org.gnome.desktop.interface
схемы.
В X11, однако, GTK использует протокол XSETTINGS, где отдельный демон, специфичный для DE, получает различные настройки из любого места и повторно публикует их в стандартном формате, используя механизм выбора X11.
При запуске каждый клиент, который должен идентифицировать окно настроек, вызывает XGetSelectionOwner() для выбора _XSETTINGS_S[N] и выбирает уведомление в окне настроек, вызывая XSelectInput() с маской StructureNotifyMask | PropertyChangeMask.
[…] Затем клиент может перейти к чтению содержимого свойства _XSETTINGS_SETTINGS из окна настроек и выполнить интерпретацию в соответствии с информацией в разделе "Формат _XSETTINGS_SETTINGS" этого документа.
Так как вы используете MATE, mate-settings-daemon
является провайдером XSETTINGS Это читает org.mate.interface
от GSettings и повторно публикует значение как Net/ThemeName
через XSETTINGS, где GTK может наконец получить его.
Использование протокола XSETTINGS делает бэкэнд неактуальным - например, более старые версии GNOME и MATE использовали GConf, в то время как Xfce использует XfConf, и существует автономный xsettingsd, который использует текстовый файл. (С другой стороны, как вы можете видеть, протокол очень специфичен для X11 и не может использоваться в Wayland.)
Пакет xsettingsd также поставляется с dump_xsettings
инструмент, который выдает данные от любого провайдера, который в данный момент работает.
Обратите внимание, что не во всех средах рабочего стола работает поставщик XSETTINGS. Например, используя LXDE lxappearance
просто редактирует файлы конфигурации: ~/.gtkrc-2.0
для GTK 2 и ~/.config/gtk-3.0/settings.ini
для GTK 3. Они всегда читаются, но используются с самым низким приоритетом - указанные параметры GSettings или XSETTINGS всегда побеждают.
Резюме:
- GTK 3 поддерживает $GTK_THEME для временного переопределения темы.
- В Wayland GTK 3 считывает название темы из GSettings с резервным файлом конфигурации.
- В X11 GTK 2/3 получает имя темы из демона XSETTINGS с резервным файлом конфигурации.
- GTK 1 не поддерживает ничего, кроме файловой конфигурации (gtkrc).