<< Предыдущий раздел | /\ Содержание | >> Следующий раздел

Иерархия окон

Весь интерфейс программ в X-Window состоит из объектов (в X-Window их называют "widgets" -- в дословном переводе "штучки"). Например, диалоговое окно поиска в программе Netscape содержит объекты строка ввода, два переключателя, полосу-разделитель и три кнопки.

Окно "Find" в Netscape
Дерево объектов окна "Find"
программы NXterm

Причем само окно поиска также является объектом, в который вложены те самые кнопочки. Иерархия объектов может быть и более сложной. Так, окно "Find", в свою очередь, принадлежит окну просмотра Netscape. Другой пример -- система меню: пункты меню расположены внутри объекта "выпадающее меню", тот принадлежит полоске меню в верхней части окна, а она -- самому окну.

Понятие ресурсов

Что такое ресурсы


У каждого объекта есть набор свойств: цвет символов, цвет фона, шрифт и т.д. Конкретный перечень свойств определяется типом объекта -- кнопка, переключатель, строка ввода и т.д. (для обозначения типа используется термин класс объекта). Вот эти свойства объектов и называются ресурсами.

Некоторые свойства, такие, как состояние включено/выключено у объекта "переключатель", определяются и меняются в процессе работы программы.

Другие же, такие, как цвета, шрифты и надписи (например, названия пунктов меню), можно настраивать.

Ресурсы -- это одна из самых базовых концепций X-Window, придающая системе большую гибкость, но одновременно, несмотря на элегантность, и одна из самых трудных для понимания. С понятием ресурсов также тесно связаны понятия "Actions" и "Translations" ("действия" и "соответствия"), часто встречающиеся в man-страницах, но мы их затрагивать не будем.

Отличие от MS Windows


По своему назначению ресурсы в X-Window очень похожи на то, что обозначается тем же термином "ресурсы" в MS Windows. Но вся идеология работы с ресурсами в X в корне отличается.

В частности, в MS Windows ресурсы являются частью бинарного исполняемого файла (например, winword.exe), и могут указываться или при компиляции программы, или меняться при помощи специальных редакторов, которые позволяют модифицировать бинарный файл (что, вообще говоря, является работой для квалифицированного программиста, и зачастую противоречит законам об авторских правах).

В X-Window же ресурсы существуют отдельно от исполняемого кода программы, в виде текстовых файлов, и могут свободно меняться или в этих файлах, или даже при помощи ключей в командной строке.

Таким образом, если в MS Windows, к примеру, перевод всех сообщений некоей программы на русский язык является "хакерской" задачей, то в X-Window подобное действие -- вполне стандартно, доступно любому пользователю и описано в документации.

Как сослаться на ресурс


Для того, чтобы изменить значение какого-либо ресурса, надо как-то на него "сослаться". Для этого надо указать объект, ресурс которого модифицируется, и название этого ресурса.

Полной ссылкой на объект является полный "путь" к нему в "дереве" объектов -- список имен всех объектов от основного окна, которому принадлежит объект, до него самого, разделенных точками.

Сокращенное дерево объектов
программы NXterm
Меню выбора шрифтов
программы NXterm

К примеру, последний пункт меню "VT Fonts" программы NXterm (это пункт "Selection") называется "fontsel", он содержится в меню "fontMenu", которое принадлежит окну "nxterm". Таким образом, полное имя этого объекта --

nxterm.fontMenu.fontsel

Ресурс, содержащий текст "Selection" в данном случае называется "Label". Таким образом, полная ссылка на ресурс в объекте --

nxterm.fontMenu.fontsel.Label

Предупреждение
Заглавные и маленькие буквы как в названиях объектов, так и в названиях ресурсов различаются!

Чтобы указать значение ресурса, надо после ссылки на ресурс указать через двоеточие его значение (пробел после двоеточия необязателен и служит только для читаемости):

nxterm.fontMenu.fontsel.Label: Current selection

Поскольку при помощи текста можно указать далеко не все (например, как можно было бы закодировать в строке картинку или ссылку на функцию?), то возможность модификации ресурсов ограничивается в основном цветами, шрифтами, названиями (тексты меток и т.д), числами (координаты, размеры и т.д.), булевскими значениями (True/False) и геометрией. Впрочем, в практически всегда этого вполне достаточно (а реально есть возможность указывать почти все ресурсы).

Шаблоны


Чтобы, во-первых, не настраивать свойства каждого экземпляра, например, кнопки, по отдельности, а во-вторых, не указывать все время длинные цепочки объектов, существуют шаблоны.

В понятие "шаблон" входит два компонента.

Во-первых, вместо имени конкретного объекта можно указать имя класса, к которому принадлежит этот объект. К примеру, все объекты-пункты меню в NXterm (как, впрочем, и во всех программах на основе библиотеки Athena Widgets) принадлежат к классу "SmeBSB". Таким образом, чтобы поменять шрифт, которым отображаются все пункты меню в "VT Fonts" на "fixed", можно воспользоваться указанием ресурса

nxterm.fontMenu.SmeBSB.font: fixed

Во-вторых, вместо имени объекта или класса в качестве одного из компонентов ссылки на объект можно указать "*". Например, спецификация

nxterm.*.SmeBSB.font: fixed
сменит шрифт во всех трех меню NXterm.

Символ "*" можно указывать и вместо нескольких компонентов сразу, опуская точки: спецификация

nxterm*SmeBSB.font: fixed
сменит шрифт во всех объектах класса "SmeBSB", к какой бы цепочке объектов они не принадлежали (впрочем, в NXterm других цепочек просто нет :).

Другой пример -- спецификация

nxterm*font: fixed
позволяет изменить шрифт во всех объектах программы.

В большинстве программ (к сожалению, в их число не входит NXterm) можно использовать еще более короткое указание:

*font: fixed

При использовании шаблонов может возникнуть ситуация, когда к одному и тому же ресурсу подходят несколько шаблонов. К примеру,

nxterm*SmeBSB.font:          7x14
nxterm.fontMenu.SmeBSB.font: fixed

В таких ситуациях действует правило: используется та спецификация, которая наиболее точно ссылается на объект. В приведенном выше примере во всех меню, кроме меню "fontMenu" ("VT Fonts"), используется шрифт "7x14", а в "fontMenu" -- шрифт "fixed".

Как узнать имена объектов и названия ресурсов

Названия ресурсов, вообще говоря, зависят от библиотеки объектов, на основе которой создана конкретная программа. Имена же объектов -- от конкретной программы.

Поскольку редко когда требуется поменять значение "какого-нибудь" ресурса, то самое простое -- посмотреть так называемый app-defaults-файл для данной программы (см. ниже), в нем обычно перечислено большинство "интересных" ресурсов.

Кроме того, в таблице ниже приведены самые часто используемые имена ресурсов для библиотек Athena Widgets и Motif.

Часто используемые ресурсы
РесурсНазначение
foreground Цвет букв ("цвет переднего плана")
background Цвет фона
font Шрифт (Athena Widgets)
fontList Шрифт (Motif)
label Метка -- текст на кнопке, на пункте меню и т.д. (Athena Widgets)
labelStringМетка (Motif)

Откуда берутся значения ресурсов

Мы довольно подробно рассмотрели синтаксис спецификации ресурсов, но остался вопрос -- а как и где, собственно, можно изменить значение ресурса для конкретной программы?

Для ответа на этот вопрос приведем список источников (по мере уменьшения приоритета), из которых программа узнает значения ресурсов при запуске.

  1. Программа может установить значение ресурса при создании объекта.
  2. Ресурс можно указать в командной строке при помощи ключа "-xrm".
  3. Спецификации ресурсов могут быть загружены в память X-сервера (это делается автоматически при старте X-Window скриптом xinitrc из содержимого файлов /etc/xinit/.Xresources и ~/.Xresources).
  4. Если (и только если) в памяти X-сервера ресурсы отсутствуют, то просматривается файл ~/.Xdefaults. Поскольку .Xdefaults в большинстве реализаций прекращает поиск (и все дальнейшие пункты просто не используются), лучше его никогда не заводить, а если уже есть -- избавляться от него.
  5. Если есть файл ~/имя-класса-программы, то просматривается он, а затем, если есть, одноименный файл из директории

    /usr/X11R6/lib/X11/app-defaults/
    Эти файлы содержат "настройки по умолчанию" (app-defaults).

    Имя класса программы обычно указывается в документации, кроме того, чаще всего это просто название программы, первая буква в котором заглавная, а остальные -- маленькие (если первая буква -- "X", то иногда вторую также делают заглавной). В любом случае, стоит воспользоваться командой

    ls /usr/X11R6/lib/X11/app-defaults/ | grep -i имя-программы
  6. Если (и только если) не найден ни один из app-defaults-файлов, то используется список ресурсов, "вшитый" в программу (т.н. "fallback resources"). Если заглянуть внутрь программы, к примеру, командой

    strings /usr/X11R6/bin/xman | less
    то можно увидеть строки, очень похожие на содержимое файла /usr/X11R6/lib/X11/app-defaults/Xman.

"Ручное" изменение ресурсов: ключ "-xrm"

Самый простой способ изменить значение ресурса -- воспользоваться ключом "-xrm", которому указывается в качестве параметра спецификация ресурса. Поскольку она обычно содержит пробелы и/или символы "*", лучше указывать ее в одинарных кавычках:

nxterm -xrm 'nxterm*SmeBSB.font: fixed'

Ключ "-xrm" можно указывать несколько раз:

nxterm -xrm 'nxterm*SmeBSB.font: fixed' -xrm 'nxterm*background:red'

Естественно, значение ресурса меняется только для данного экземпляра программы.

Общие рекомендации -- как же все-таки настраивать ресурсы

Как видно из приведенного выше списка, значения ресурсов можно менять в огромном количестве мест. Поэтому для большей определенности приведем один из сценариев.

Первым делом следует отладить спецификацию ресурса "методом проб и ошибок" при помощи ключа "-xrm".

Если ресурс -- общий для многих программ (например, цвет фона), то следует поместить его спецификацию в файл .Xresources. При настройке для всех пользователей -- в общесистемный /etc/xinit/.Xresources, а любой пользователь может изменить свой личный ~/.Xresources.

При настройке ресурсов конкретной программы следует поменять ее app-defaults-файл. Аналогично, при настройке для всех пользователей -- файл из /usr/X11R6/.../app-defaults/, а при персональной настройке любой пользователь может скопировать файл из .../app-defaults/ к себе в home-директорию и поправить под свой вкус; поскольку, хотя просматриваются оба файла, приоритет отдается настройкам из персонального.

Где еще брать информацию

Базовые понятия и определения ресурсов имеются в man-странице по X (см. подраздел "RESOURCES").

Кроме того, подробное описание синтаксиса указания ресурсов и порядка, в котором они берутся из разных источников, есть в разделе 10.2 книги "X Toolkit Intrinsics Programming Manual" от O'Reilly & Associates (имеется в электронном виде в системе insight на компьютерах Silicon Graphics (в ИЯФ -- компьютер Sky)).


<< Предыдущий раздел | /\ Содержание | >> Следующий раздел