Настройка X-программ: ресурсы -- глобальные, личные
Иерархия окон
Весь интерфейс программ в 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) |
Откуда берутся значения ресурсов
Мы довольно подробно рассмотрели синтаксис спецификации ресурсов, но
остался вопрос -- а как и где, собственно, можно изменить значение
ресурса для конкретной программы?
Для ответа на этот вопрос приведем список источников (по мере
уменьшения приоритета), из которых программа узнает значения ресурсов
при запуске.
- Программа может установить значение ресурса при создании объекта.
- Ресурс можно указать в командной строке при помощи ключа
"-xrm".
- Спецификации ресурсов могут быть загружены в память X-сервера (это
делается автоматически при старте X-Window скриптом xinitrc из
содержимого файлов /etc/xinit/.Xresources и
~/.Xresources).
- Если (и только если) в памяти X-сервера ресурсы отсутствуют, то
просматривается файл ~/.Xdefaults. Поскольку .Xdefaults в
большинстве реализаций прекращает поиск (и все дальнейшие пункты просто
не используются), лучше его никогда не заводить, а если уже есть --
избавляться от него.
- Если есть файл ~/имя-класса-программы, то
просматривается он, а затем, если есть, одноименный файл из директории
/usr/X11R6/lib/X11/app-defaults/
Эти файлы содержат "настройки по умолчанию" (app-defaults).
Имя класса программы обычно указывается в документации, кроме того,
чаще всего это просто название программы, первая буква в котором
заглавная, а остальные -- маленькие (если первая буква -- "X", то
иногда вторую также делают заглавной). В любом случае, стоит
воспользоваться командой
ls /usr/X11R6/lib/X11/app-defaults/ | grep -i имя-программы
- Если (и только если) не найден ни один из 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)).
Русификация
Что включает в себя русификация Unix вообще и X-Window в частности
В русификацию системы входят:
- Русификация консоли.
- Настройка системы на правильную "интерпретацию" русских букв (т.е.
чтобы, например, символ с кодом 215 ("в") считался маленькой буквой).
- Добавление в X-Window шрифтов с русскими буквами.
- Добавление возможности вводить в X-Window русские буквы с
клавиатуры.
- Смена шрифтов, используемых в графических программах на русские (в
основном это относится к Xterm/NXTerm). Для
большинства программ это делается в app-defaults-файлах, в
window-manager'ах -- в их файлах конфигурации, а Netscape при
наличии шрифтов koi8 автоматически обнаруживает их при запуске и дает
возможность настроить в окне конфигурации: Options -> General
Preferences... -> Fonts в Netscape3, и Edit ->
Preferences -> Appearance -> Fonts в Netscape4.
- Кроме того, некоторые текстовые программы требуют отдельной
настройки -- к примеру, в Midnight Commander надо включить пункты "Full
8 bits output" и "Full 8 bits input" в окне
"Options|Display Bits...".
Русификация вывода
Это самое простое -- надо сделать в (обычно в
/usr/X11R6/lib/X11/fonts/) директорию, содержащую русские
шрифты в кодировке koi8-r и добавить ее к списку директорий со шрифтами
в файле /etc/X11/XF86Config (директива FontPath в
секции "Files").
В Internet есть множество мест, где лежит много вариантов русских
шрифтов. Например, можно взять их по адресу
http://www.inp.nsk.su/~bolkhov/teach/inpunix/soft/koi8fonts.tgz
-- этот файл надо распаковывать, находясь в корневой директории --
внутри него все файлы уже находятся в
usr/X11R6/lib/X11/fonts/75dpi.koi8/.
Кроме того, шрифты семейства "Cronyx" входят в дистрибутив XFree86.
В версии 3.3.2, поставляемой в составе RedHat 5.2 они содержатся
непосредственно в пакете XFree86. В версии 3.3.3, расположенной в
каталоге updates/, они перекочевали в отдельный пакет
XFree86-cyrillic-fonts.
Русификация клавиатуры
Для русификации клавиатуры также существует множество вариантов. В
частности, возможность смены раскладки клавиатуры предусмотрена в самой
системе X-Window при помощи расширения Xkb, но вследствие очень
нестандартных представлений авторов Xkb о русской кодировке его лучше
отключать (или, из соображений совместимости с некоторыми пакетами
(например, Applix), лучше оставлять включенным, но без русской раскладки).
Лучше всего воспользоваться пакетом xruskb. Он лежит в разделе
contrib, в ИЯФ для RedHat 5.x -- в NFS-директории
/net/rdist/dist/contrib/libc6/i386/
по FTP она видна как
ftp://rdist.inp.nsk.su/pub/Linux/contrib/libc6/i386/
Для RedHat 4.2 вместо "libc6" следует смотреть в директории
"libc5".
Хотя в документации, прилагаемой к xruskb, есть довольно подробные
инструкции, приведем один из простейших вариантов использования.
Собственно, надо сделать три шага: установить пакет xruskb,
отключить расширение X-сервера Xkb, и сделать так, чтобы русификатор
запускался автоматически при старте X-Window.
Отключение Xkb
Для того, чтобы отключить Xkb, надо найти в файле
/etc/X11/XF86Config закомментированную директиву
XkbDisable и включить ее, убрав символ "#". Т.е.
фрагмент текста
# To disable the XKEYBOARD extension, uncomment XkbDisable.
# XkbDisable
|
должен превратиться в
# To disable the XKEYBOARD extension, uncomment XkbDisable.
XkbDisable
|
Предупреждение.
Некоторые современные пакеты требуют для работы наличия Xkb. В таком случае
можно не отключать Xkb, а просто не устанавливать ему русскую раскладку.
Настройка автоматического запуска русификатора
Что интересно, хотя пакет называется xruskb, сама программа --
xrus. Русификатор можно запускать с единственным параметром --
именем файла, содержащего раскладку клавиатуры. Файл раскладки "ЙЦУКЕН"
для koi8 в xruskb версии 1.5 называется
/usr/lib/xruskb/jcuken-koi8-xrus.xmm
а в версии 1.9 --
/usr/share/xruskb/jcuken-koi8.xmm
Таким образом, в версии 1.5 для запуска надо воспользоваться
командой
xrus /usr/lib/xruskb/jcuken-koi8-xrus.xmm
Но ведь надо, чтобы это делалось автоматически при старте X-Window!
Лучший способ -- поместить эту команду в начало файла
/etc/X11/xinit/Xclients, непосредственно перед всеми
командами.
Переключать клавиатуру с русского на английский можно или щелчком
левой кнопки мыши на пиктограмме "RUS/LAT" (она помещается в левый нижний угол
экрана), или одновременным нажатием обеих клавиш <Shift>
Практические задания
- Изменить конфигурацию X-сервера так, чтобы при запуске
автоматически устанавливалась глубина цвета 16 бит/пиксел и включалось
разрешение 1024*768, а не 640*480.
- На компьютерах уже установлены (в составе дистрибутива)
русские шрифты "Cronyx", они лежат в директории
/usr/X11R6/lib/X11/fonts/cyrillic/. Сделать так, чтобы
X-сервер их использовал.
- Установить дополнительные русские шрифты из файла
/net/class/home/teachers/bolkhov/koi8fonts.tgz и сделать так,
чтобы X-сервер их использовал.
- Настройки цветов в AnotherLevel расположены в файлах в
директории /etc/X11/AnotherLevel/decors/. Изменить (как
"root") для режима MWM цвет заголовка активного окна на
зеленый, неактивного -- на синий, цвет фона меню -- на розовый.
- Размер виртуального десктопа в AnotherLevel определяется
строкой вида "3x3". Найдя (при помощи grep) в каком файле это
устанавливается, сделать в своей home-директории личную копию этого
файла и изменить размер десктопа на "4x4".
- Настроить общесистемный app-defaults-файл для
NXTerm так, чтобы все шрифты, выбираемые в меню "VT Fonts"
были русскими, а в названиях, выводимых в этом меню, указывался бы
размер шрифта (например, в пунктах).
- Установить пакет xruskb-1.5 и сделать так, чтобы
русификатор автоматически запускался при старте X-Window. Не забыть
отключить Xkb! Пакет xruskb расположен в директории contrib/, видной
как /net/class/mnt/rdist/contrib/libc6/i386/.
© 1999 Дмитрий Болховитянов