<< Предыдущий раздел | /\ Содержание | >> Следующий раздел
Весь интерфейс программ в 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.nxterm.*.SmeBSB.font: fixed
Символ "*" можно указывать и вместо нескольких компонентов сразу, опуская точки: спецификация
сменит шрифт во всех объектах класса "SmeBSB", к какой бы цепочке объектов они не принадлежали (впрочем, в NXterm других цепочек просто нет :).nxterm*SmeBSB.font: fixed
Другой пример -- спецификация
позволяет изменить шрифт во всех объектах программы.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) |
Мы довольно подробно рассмотрели синтаксис спецификации ресурсов, но остался вопрос -- а как и где, собственно, можно изменить значение ресурса для конкретной программы?
Для ответа на этот вопрос приведем список источников (по мере уменьшения приоритета), из которых программа узнает значения ресурсов при запуске.
Эти файлы содержат "настройки по умолчанию" (app-defaults)./usr/X11R6/lib/X11/app-defaults/
Имя класса программы обычно указывается в документации, кроме того, чаще всего это просто название программы, первая буква в котором заглавная, а остальные -- маленькие (если первая буква -- "X", то иногда вторую также делают заглавной). В любом случае, стоит воспользоваться командой
ls /usr/X11R6/lib/X11/app-defaults/ | grep -i имя-программы
то можно увидеть строки, очень похожие на содержимое файла /usr/X11R6/lib/X11/app-defaults/Xman.strings /usr/X11R6/bin/xman | less
Самый простой способ изменить значение ресурса -- воспользоваться ключом "-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)).
<< Предыдущий раздел | /\ Содержание | >> Следующий раздел