Как моя выбранная тема сообщается в gtk?

443
Sal Valente

Связано с тем, где 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-сервера, что?

2

1 ответ на вопрос

1
grawity

И я предполагаю, что «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).

Похожие вопросы