Ресурсы, X Window и
ООП
(«Открытые системы», Лето 1994. стр. 67-72)
С. Трифонов
НИИСИ РАН, Москва
info@osp.msk.rи
Так получилось, что автор этих строк практически одновременно постигал премудрости Объектно-Ориентированного Программирования (ООП) на языке C++ и интерфейса X Window в среде Unix. Вместе с этим он овладел и активно распространяющимся профессиональным диалектом, которого пугаются
"настоящие
программисты" и в котором ключевыми словами являются
"объект", "класс",
"метод" и "событие". Бесконечные просторы для совершенствования и дискуссий открылись перед автором, но... К досаде автора, поначалу мало кто из "объектно-ориентированных" собеседников понимал одно словечко из его лексикона -"ресурсы". По прошествии некоторого времени слово стали воспринимать почти все, но ... неправильно. То есть правильно, но не полностью. Вернее, полностью, но не до конца.
X Window как
объектно-ориентированная система
В X Window
есть все перечисленные термины. Механизмы, применяемые в этой системе, воплощают
объектную идеологию. Поклонников других систем интерфейса - любителей
Макинтошей и почитателей MS Window
- этим утверждением, вроде бы, не удивить. Действительно, в их системах те же
принципы и механизмы. Однако, отличия есть. Во многом
они связаны с механизмом ресурсов, в X Window
существенно более гибким и универсальным. Содержательным является даже
автономное использование ресурсов, без остальных частей.
Автор надеется, что рано или поздно понятие
"ресурсы" (или его функциональный эквивалент) обретет свое достойное
место в объектно-ориентируемой технологии разработки программ. Об этом и
написана данная статья. Ее первая часть посвящена самой системе X Window. Во второй части будут
обсуждаться механизмы, возникающие при реализации идеи ресурсов.
Технические детали программных продуктов по
возможности будут опускаться:, их можно найти в обширной литературе, посвящен- . ной как X Window, так и ООП+ООП
(Объектно-Ориентируемое Проектирование +' Программирование, OOD+OOP).
Система X Window - это огромное здание
со сложной архитектурой, ходами-переходами, крышами, анфиладами и кариатидами.
Чтобы разглядеть в этом хозяйстве ресурсы, нам придется нарисовать несколько
планов: сначала общий вид, затем более подробно некоторую часть здания и уже
после этого будет видно, где здесь "ресурсы".... Итак,
начнем
Общий вид с
высоты птичьего полета
X Window
- графическая оконная система, разработанная изначально в расчете
на построение интерфейса распределенных приложений, исполняющихся на сети
разнородных рабочих UNIX-станций.
Основные архитектурные элементы, обеспечивающие сетевую прозрачность. - это Х-сервер и Х-клиент.
В зависимости от конфигурации, под Х-сервером
могут подразумеваться процесс, группа
процессов или отдельный специализированный компьютер. Под процессом
подразумевается процесс в операционной системе UNIX. Существуют, впрочем, адаптации Х-Window
на другие, естественно, многозадачные операционные системы. Там Х-сервер - это
процесс другой операционной системы. Самостоятельный компьютер, отождествляемый
с Х-сервером, называется X-терминалом,
но об этом позже.
Х-сервер берет на себя полностью работу с одним,
а иногда и с несколькими графическими терминалами, одной клавиатурой и одним
устройством типа "мышь". Никакой другой процесс не должен
"мешать" Х-серверу обслуживать и опрашивать эти устройства. Взамен
Х-сервер организует на графическом экране многооконный "мир" и предоставляет
всем другим процессам разнообразные услуги: создавать свои окна, отображать в
них свою информацию, анализировать и реагировать на поток событий, в этом мире
происходящих. Процесс, пользующийся этими услугами, называется Х-приложением,
или Х-клиентом.
Между Х-сервером и его клиентом существует промежуточная
инстанция, Х-протокол. Это строгие и четкие спецификации на то, что сервер
может послать клиенту, а что - клиент серверу. Механизм передачи данных между X-сервером и Х-клиентом
может быть произвольным.
Вот так и рождается модульность и объектность.
Различные Х-серверы решают совершенно одинаковый
комплект задач, оговоренный Х-протоколом, но на различной аппаратуре; если же
аппаратура не в состоянии решить некоторой специальной задачи, в Х-протоколе
предусмотрена возможность цивилизованного отказа от ее выполнения. В
результате, Х-сервер, и только он, обязан учитывать особенности аппаратного
уровня.
Различные инстанции решают задачу поддержки X-протокола: в рамках
одного компьютера, одной комнаты, либо глобальной спутниковой связи. Любая
программа, поддерживающая сравнительно небольшой Х-протокол, годится для
работы. Ни сервер, ни клиент не обязаны знать,
транспортный протокол какого стека используется: TCP/IP, SPX или OSI.
Наконец, Х-клиент не обязан вникать ни в какие
аппаратные проблемы и занимается напрямую обслуживанием
пользователя, эффективностью и комфортом его работы. Клиенту предоставляется
также возможность связываться с другими клиентами, "бегущими" на том
же сервере, чем, впрочем, они могут и не пользоваться.
Достоинства этой модели многочисленны. Вот
некоторые из них:
1. Разделение функций
облегчает отладку модулей, что делает сравнительно легкой адаптацию X Window на новую аппаратуру.
2. Для
процессов, называющихся Х-сервер и Х-клиент, совершенно не важно, работают ли
они на одном компьютере или на разных, в одной ли комнате находятся эти два
компьютера или связаны по международной сети. Если связь между компьютерами
достаточно высока и надежна, никаких неприятностей не возникнет, даже если
разработчики программы-клиента совершенно не задумывались о возможности
использования своей программы на другом конце света. В то же время один клиент
может работать одновременно с несколькими серверами.
3. Относительная
независимость работы Х-клиентов от варианта Х-сервера.
Исключение составляют проблемы бедности аппаратуры:
как "никакие связи не помогут сделать ножку маленькой, а душу - оолыпоп", гак никто не см<),кет
нарисовать красивую радугу на черно-белом терминале либо целиком вместить
подробную карту города Москвы в экран 200 на 200 точек.
4. Равноправность и
независимость друг от друга всех Х-клиентов. Впрочем, это свойство - общее для
любых процессов ОС UNIX.
Когда в одном из процессов происходит ошибка, другие процессы этого не замечают
(если, конечно, два процесса не взаимодействуют явно). Отладка Х-клиентов
осуществляется с применением самых стандартных средств.
5. Процессы
Х-сервера и поддержки Х-протокола являются "рабами лампы": они
выполняют набор строго оговоренных функций, наделены интеллектом, которого
хватает ровно на эти функции, и не имеют дурной привычки вмешиваться в логику
работы клиентов нерегламентированным образом (хотя бы и с самыми хорошими
намерениями, как это принято, например, в MS Windows).
Как правило, в начале сеанса работы в X Window запускается некоторый
специальный клиент, менеджер окон. Различных реализаций этого клиента довольно
много (запускают в сеансе только один!), и решают они следующую задачу:
расположить окна других Х-клиентов на экране терминала способом, удобным
пользователю, окружить для этого окна клиентов приличествующим образом (рамка,
заголовок и пр.). Довольно часто эти менеджеры также предоставляют ряд
полезных возможностей общего плана (например, удалить какое-нибудь окно).
Каждый менеджер оформляет окружение окон в своем стиле, добиваясь (или пытаясь
добиться) зрительной гармонии на графическом экране. Менеджер не является
привилегированным процессом, он, скорее, дежурный у классной доски. За исключением
изменения размеров и местоположения окна на экране (а к этому в любой оконной
системе принято относиться как к должному), никаких
попыток вмешаться в логику работы других Х-клиентов менеджер не делает.
И, наконец, последний объект, видимый с такой
высоты, - X-терминал. Это некоторое аппаратное средство, включающее процессор
и графический терминал, специально предназначенное для выполнения задачи
Х-сервера. Другими словами, в конфигурации с X-терминалом Х-сервер, как процесс, отсутствует,
а реализующий Х-протокол модуль одной стороной "прикреплен"
непосредственно к аппаратному средству. С точки зрения Х-клиентов, никакого
интереса такие "терминалы" не представляют. С точки зрения
Х-пользователей, интерес большой - такая специализированная конфигурация
обеспечивает эффективную работу с графикой и совершенно бесполезна для применений,
не вписывающихся в рамки Х-протокола (в доступные сейчас версии Х-протокола не
входит поддержка, например, средств анимации).
XLib, или о чем разговаривают сервер и клиенты
Самый нижний уровень программирования Х-клиентов обеспечивается
библиотекой функций XLib. Задача этой библиотеки
- предоставить С-интерфейс работы с Х-сервером. В библиотеке масса различных
функций, а ее описание - это солидный том документации. Если быть запредельно
кратким, надо сформулировать следующие постулаты:
1. Х-клиент
связан с сервером и с остальными клиентами двумя видами связи: с помощью
одного вида связи клиент передает серверу инструкции, что и как отрисовывать в окнах, с помощью другого вида - получает
сообщения о событиях, происходящих в процессе работы X Window. Клиент в состоянии
породить и переслать кому-нибудь свое собственное сообщение. Этот механизм
применяется не часто, но иногда оказывается весьма эффективным.
2. Для своей работы
Х-клиент просит Х-сервер выделить для него ресурсы. (Это еще
не те ресурсы, о которых пишется статья, а их омоним. К
сожалению, в X Window
одно и то же слово используется в двух разных смыслах.) Под этим
понимается довольно много различных объектов: окна, графические контексты,
шрифты и прочее.
Всем объектам-ресурсам, выделяемым сервером,
присваиваются уникальные численные идентификаторы, по которым и происходит
адресация объектов. Параметры объектов-ресурсов клиент потом может многократно
менять. По окончании работы с ресурсами клиенту полезно их освободить.
Выполняемые сервером инструкции устроены так, что без специально выделенных
ресурсов ничего сделать нельзя. Например, функция из XLib,
предназначенная для изображения отрезка, требует в качестве параметров не
только координаты отрезка, но и идентификатор дисплея, окно, где будет изображаться
отрезок, и графический контекст изображения (именно он содержит информацию о
свойствах отрезка: его толщине, цвете и многих других параметрах).
3. Окна на экране образуют
иерархическую структуру окон, вложенных в головное окно, причем сколь угодно высокого
уровня. Каждое окно имеет свою систему координат, а часть окна, не умещающаяся
в границы родительского окна, невидима на экране.
4. При движении мыши по экрану,
нажатии клавиш на клавиатуре, необходимости перерисовки области окна и прочих
событиях X Window
создает сообщение об этом и кладет его в очередь событий. Каждое сообщение
адресовано конкретному окну. Х-клиент, пользуясь функциями XLib,
должен регулярно выбирать из очереди сообщения, адресованные его окнам, и
обрабатывать их. Так клиент реагирует на действия пользователя.
Итак, с одной стороны, XLib
поддерживает в достаточно объектном стиле отображение
содержимого окон, а с другой - настраивает программиста на создание событий-но-управляемых (event-driven)
приложений - также типично объектно-ориентированная идея.
Здесь можно было бы поставить точку. X Window, как низкоуровневая и в
то же время универсальная среда, опит сана. Но оказывается, что тут-то как раз
и начинается новая жизнь, которой живет большинство Х-клиентов. Ее суть -
управление сложными данными по классической объектно-ориентированной схеме.
Ящик с
инструментами для Х-про-граммирования – Xtoolkit
Ох, нелегкая это
работа...
Научиться писать приложения под X Window довольно трудно: для
этого необходимо овладеть многими понятия- ми и
механизмами. Однако посте крутого подыми открывается
широкое плато: создание и модификация разнообразных приложений происходит с
использованием одной и той же технологии. Это свойство характерно именно для
систем в рамках объектно-ориентируемой идеологии.
Впрочем, ходить по плато далеко не просто. Для
облегчения этой задачи и появились надстройки Motif (предложенная Open Software
Foundation) и OpenLook
(версия Sun Microsystems).
Сейчас большая часть программистов, связанных с X Window, работает именно с
этими надстройками. И Motif,
и OpenLook,
сохраняя все преимущества работы в среде X Window, берут на себя массу
рутинных проблем, возникающих при создании приложений.
Основу объектно-ориентированной разработки приложений
формирует XToolkit.
Предполагается, что разработчики пользуются не просто этой библиотекой, а
надстройками над ней - библиотеками виджетов.
Наиболее простая такая библиотека, Aphena Widgets, была создана вместе с XToolkit
и доступна так же, как и он сам. Во многом обе названные библиотеки
ученические, экспериментальные. Тем не менее, в них реализованы основные идеи объектного X-программирования.
Основная часть системы X Motif представляет собой
профессиональную библиотеку - замену Aphena
Widgets. Система Open
Look еще более продвинутая:
ее разработчики переписали заново и большую часть XToolkit,
сохранив при этом основные принципы и механизмы.
Языки
профессионального общения
Система X Window написана на С и, несмотря на явную "необъектность"
этого языка, выдержана в строгом объектном стиле.
Программисту, знающему C++, могут показаться
забавными (раздражающими?) усилия, затраченные сотрудниками MIT (Массачусетский Технологический
Институт -"родина" X Window) на имитацию
производных классов и виртуальных функций. Но следует напомнить, что при запуске
этого суперпроекта (1984 год) объектно-ориентированные языки программирования
были не только не модными, но весьма неэффективными (первое издание классической
книги Страуструпа о C++ датировано 1986 годом).
Например, во включаемых файлах X Window довольно часто
встречаются описатели структур типа:
struct DerivedClass {
struct BasedGlass Base;
int make_compiler_happy;
};
Объявлена
структура DerivedClass, состоящая из
структуры
BasedClass и не
использующейся переменной make_compiler_happy. Вернее, последняя переменная используется, но
только чтобы не ругался стандартный компилятор с языка С. В свою очередь, не
исключено, что структура BasedClass не порождена таким же
образом из еще какой-либо, например, ProBasedClass,
а та, в свою очередь... Так что работы компилятору в этих текстах хоть
отбавляй, и пожелание "сделать егр рчартливым" актуально.
На языке C++ разумнее было бы использовать конструкцию
типа:
class DerivedClass: public BasedClass {};
Это историческое досадное обстоятельство имело и
положительную сторону: оно послужило одной из причин появления идеи ресурсов,
до которых мы вскоре доберемся.
(В последнее время появилась информация о новой
версии X Window Release
6. Анонсировано, что переписывание системы на C++ все же
состоялось. Вполне вероятно, что через некоторое время начнется новая страница Х-жиз-ни: новая версия базовых библиотек Х-Window имеет шанс существенно
потеснить сферы применения X Motif
и Open
Look.)
Еще одна попытка
объяснить понятие "виджет"
Автору неизвестно, было ли слово "widget" в английском
языке до наступления времени X и что это слово могло означать. Автору не удалось и найти короткое и вразумительное определение этого
понятия в литературе или услышать его в личной беседе. Короче, термин "виджет" сродни термину "сепульки"
у Станислава Лема. Надо стать инопланетянином, чтобы
прочувствовать слово "сепульки", и надо
программировать объектно-ориентированные системы с оконным интерфейсом, чтобы
понять всеобъемлющий термин "виджет". При
этом знание само по себе не подразумевает способность объяснить смысл термина.
Тем не менее, автор рискует дать свою, быть
может, весьма субъективную, трактовку.
Виджет
- это, бесспорно, объект. Как правило, он связан с окном в смысле библиотеки XLib.
Вообще говоря, верно и обратное: каждое окно при программировании с участием XToolkit
связано с некоторым виджетом (одним). Встречаются,
правда, и исключения. Окна, не связанные с виджетами,
- это эффект программирования на XLib без XToolkit,
своего рода атавизм. Виджеты, не связанные
с окнами, на самом деле с окнами все-таки связаны, но с невидимыми (или
несуществующими для Х-сер-вера).
Цель виджетов - контроль за своими окнами, их правильное отображение и, что
самое главное, поддержка определенного поведения окна, т.е. стиля реакции элементов
окна на события, происходящие в сеансе работы с X Window. Виджеты
служат более или менее автономными кирпичиками, из которых составляется
интерфейс почти всех
Х-клиентов. Наиболее очевидные примеры: кнопки,
полосы прокрутки (Scroll Bars),
окна диалога и многие
другие. Структура объектов-виджетов практически совпадает со структурой их
окон, вложенных в друг друга.
Естественно, первое существенное деление виджетов -
на простые и составные. В отличие от простых, составные виджеты в
состоянии управлять своими потомками. В классической схеме объектно-ориентированного
программирования эта иерархия так и называется - иерархия объектов.
Далее, виджеты делятся
по типам: кнопки - это один тип, полосы прокрутки - другой... Но точно ли
кнопки -это один тип, а не несколько, очень похожих
один на другой, но все же различающихся? Или точно ли при реализации виджетов не приходится отлаживать одни и те же механизмы?
Экономить усилия помогает иерархия классов. Действительно, вместо того чтобы
создавать класс объектов с нуля, разумнее и быстрее взять уже существующий
класс объектов, сколько-нибудь похожий на требуемый, и
модифицировать его.
Способствует и параметризация. Не следует
заводить пару виджетов "красная кнопка" и
"зеленая кнопка", если можно завести один виджет
"кнопка" с параметром "цвет" (тем более, в дальнейшем
разработчику понадобится еще и "желтая кнопка"). Поэтому виджет должен быть достаточно универсальным: у него должно
быть много параметров, списки которых отличаются от вид-жета
к виджету, и, в зависимости от параметров, объект- виджет должен рисоваться и
реагировать на события по-разному.
Так возникает иерархия классов: виджеты могут быть порождены друг из друга путем
модификаций и, естественно, наращиванием числа внутренних параметров. На '
C++, как известно, такое наращивание совершенно естественно, но на С вызывает ряд проблем.
Главная проблема - как задавать и изменять
параметры виджетов? Нет, не умозрительно, а руками,
в программе? В файле настройки или еще где-нибудь? Различные параметры виджета разбросаны по нескольким (иногда десяткам)
вложенных друг в друга структур. Не помнить же наизусть названия всех этих
структур?
Разработчики X Window предложили способ разре- (
шения данной проблемы. Терпеливый читатель,
добравшийся до этого места, наверное, догадался, что на сцене наконец-то появляются
главные герои - ресурсы.
Ресурсы для виджетов или виджеты для
ресурсов?
Имена, типы,
конвертеры
Схема, предложенная разработчиками XToolkit,
такова.
1. Все объекты, классы и
типы надо именовать. Каждому виджету должно
соответствовать две символьных строки: имя класса виджетов
и имя объекта-виджета. Каждому параметру виджета должно соответствовать три имени: имя типа
параметра, имя класса параметра и имя самого параметра. Имена классов и типов
обязаны начинаться с прописных букв, а имена объектов - со
строчных.
2. Именованные параметры виджетов называются ресурсами. При регистрации нового
класса виджетов на уровне библиотеки XToolkit
должен быть указан список ресурсов этого класса и список ресурсов каждого
объекта данного класса. Если виджет является
производным от некоторого другого виджета (а
исключений из этого правила практически не существует), списки ресурсов должны
начинаться со списка ресурсов предка. Про каждый ресурс из обоих списков
требуется указать:
- имя
типа ресурса;
- имя
класса ресурса;
- имя
ресурса;
- привязка
к месту ресурса в структуре данных виджета (или
класса виджетов);
- значение
ресурса по умолчанию.
3. Значения ресурсов
контролируются несколькими способами:
- при регистрации нового
класса впджета надо указать значение его ресурсов по
умолчанию;
- при создании нового объекта-виджета его ресурсы первоначально устанавливаются в
соответствии с правилами умолчания; если в специальных конфигурационных файлах
(см. ниже) указаны другие значения для некоторых ресурсов, то устанавливаются
именно эти значения;
- при
создании виджета, а также при работе с ним, библиотека
XToolkit
предоставляет возможности явно опрашивать и изменять значение любого ресурса в
процессе выполнения приложения.
4. Документация
на каждый виджет должна содержать таблицу всех его
ресурсов с указанием имен ресурсов, имен их типов, значений по умолчанию и
атрибутов изменения значения ресурса. Под последним подразумевается один из
нескольких вариантов:
- (по умолчанию) значение
можно и опрашивать, и менять;
- значение
можно только опрашивать;
- значение
может автоматически измениться при изменении другого ресурса;
- значение
ресурса определяется при создании виджета и не может
измениться в дальнейшем;
- значение
ресурса категорически запрещается менять в сеансе работы, поскольку последствия
непредсказуемы.
5. Каждый ресурс имеет свой
тип. Тип определяет, в скольких байтах оперативной памяти размещается ресурс и
как трактовать их содержимое. XToolkit поддерживает около 40 встроенных типов ресурсов.
Но Х-программист может свободно завести новые типы.
Для задания значения ресурсов разработан
механизм преобразования типов ресурсов.
Теперь можно сделать попытку дать короткое
определение понятия "виджет": это объект,
связанный с окном X Window,
имеющий строго определенный список именованных параметров, называемых
ресурсами, и выполняющий, в соответствии со значениями этих параметров, строго
определенные действия, в основном, по поддержке интерфейса приложения в своем
окне. Объекты-виджеты образуют иерархию вложенных
друг в друга (и, соответственно, подчиненных) объектов; классы виджетов образуют иерархию в соответствии с вложенными друг
в друга списками ресурсов и реализацией методов производных виджетов с использованием методов базовых виджетов.
Определим и XToolkit.
Это библиотека, поддерживающая механизмы по работе с виджетами:
- несколько
"самых базовых" виджетов;
- процедуры поддержки
функционирования иерархии виджетов;
- процедуры
опроса и изменения ресурсов;
- механизмы управления
потоком событий и реакции виджетов на эти события;
- несколько
других, более тонких механизмов. Введение понятия ресурсов снимает, как
минимум, две
проблемы. Во-первых, это проблема адресации
параметров виджетов, затрудненная неадекватностью
языка С объектно-ориентированной идеологии. Во-вторых
- унификация работы с ресурсами Х-сервера; действительно, достаточно написать
конвертор из типа ресурсов "текстовая строка" в тип ресурсов
"шрифт", и работа со шрифтами станет гораздо удобнее.
При более внимательном рассмотрении оказывается,
что введенная схема предлагает универсальное решение еще одной проблемы -
конфигурирования приложений под конкретного пользователя.
Механизм
конфигурирования ресурсов
Как уже говорилось, ресурсы разных типов можно
конвертировать друг в друга. В частности, почти все типы допускают
конвертирование в вид текстовой строки и обратно.
Например, тип "Цвет" естественно
задавать либо в виде трех чисел (формат RGB), либо в виде названия этого цвета. Нетрудно
сформировать (и это сделано в X)
таблицу цветов: название и числа RGB.
Пользователю удобнее работать с этими названиями, куда более содержательными,
чем три числа. Существуют, однако, типы, не поддающиеся
осмысленному конвертированию в вид текстовой строки (в частности, это
внутренние параметры, связанные с расположением объектов в оперативной памяти.
Все нижеследующее на них не распространяется).
-Если
ресурсы почти всех типов можно конвертировать из вида текстовой строки, значит,
можно завести текстовый файл со значениями каких-либо ресурсов. Файлы эти можно
менять, не затрагивая исходный код приложения.
При инициализации механизма XToolkit
в приложении происходит загрузка двух файлов конфигурации: один файл описывает конфигурацию
работы X Window
в целом, другой (если он есть) - специальный файл, описывающий конфигурацию
именно данного приложения. Имена файлов и их расположение в дисковой системе
строго оговорены: они либо фиксированы, либо задаются переменными окружения.
Конфигурационные файлы состоят из директив задания
значения ресурсов. При инициализации эти директивы подгружаются в небольшую
базу данных, поддерживаемую XToolkit. Далее, при создании
каждого виджета, наступает фаза переустановки значений
ресурсов в соответствии с конфигурационными файлами. На этой фазе XToolkit опрашивает свою базу по каждому ресурсу в
отдельности и из всех директив, которые могут относиться к данному ресурсу,
выбирает максимально "специальную" директиву, наиболее подробно
соответствующую этому ресурсу. Правила выбора этой "самой
специальной" директивы достаточно ; сложны, но
интуитивно понятны.
Формат каждой директивы довольно прост:
путь_к_ресурсу: значение ресурса
Постараемся описать, что такое путь к ресурсу.
Ресурс -это часть виджета. Виджет, как правило, входит в состав другого
виджета. Тот в свою очередь... Но рано или поздно эта
цепочка заканчивается головным виджетом приложения.
Остается теперь вспомнить, что у каждого ресурса и у каждого виджета есть целых два имени: имя объекта и имя класса.
Путь к ресурсу состоит из последовательности этих имен, разделенных точками.
Например, если надо задать ресурс label (класс Label), у виджета
а2 (класс А2), находящегося в подчинении виджета al
(класс А1), то директива задания ресурса может выглядеть следующими способами:
А1.А2.Label: Первый вариант
al.a2. label: Второй вариант
А1. а2.Label: Третий вариант
Кроме того, один или несколько элементов и пути
можно не оговаривать, а заменять их звездочкой
("*"):
*.label: Четвертый вариант Al*Label: Пятый вариант
Итак, способов задания ресурсов много, но будет
подобрана одна, наиболее специфическая директива. Например, при указании в конфигурационном
файле всех пяти видов директив, ресурсу присвоится строка "Второй
вариант". Действительно, в этом варианте путь к ресурсу не содержит
пропусков и "пролегает" по именам объектов, более
"специальным", нежели имена классов.
Этот механизм очень удобен и для Х-программиста
(не надо слишком много внимания уделять мелочам визуализации и можно
сосредоточиться на логике программы), и для Х-пользователя, который в любой
момент в состоянии изменить внешний вид приложения в соответствии со своими личными
представлениями о гармонии цветов, шрифтов и размеров.
Для того чтобы механизм зажил, разработчикам
Х-приложения надо соответствующим образом
оформить документацию либо, на худой конец, предоставить файл с
какой-нибудь настройкой своей системы. Далее, с помощью разгадывания мнемоник и
метода проб и ошибок, разумный пользователь, знающий правила игры, в состоянии
переконфигурировать приложение на свой лад.
Резюме
Все, что описано в этрй
статье, не является откровением ни для одного программиста, имеющего X-практику.
Однако автор полагает, что знакомство с Х-Window полезно для самого
широкого круга программистов. Группа молодых людей из MIT сумела провести систему
по минному полю многооконных и многозадачных интерфейсов, создав много полезных
механизмов и сохранив верность идеям демократии. Создавая такую огромную
конструкцию, очень просто скатиться к "авторитаризму". Для
этого достаточно сделать несколько простых "управленческих" шагов:
объявить сервер головным процессом системы, управляющим своими клиентами (а не
только выполняющим их задания); расширить список возможных событий
сотней-другой своих, системных, никому не ведомых типов; зафиксировать список
возможных типов ресурсов.
Система X Window интересна из-за того,
что многие объектные идеи существуют в своем "чистом" виде. Хотя
не всегда их реализация стройна и проста, она всегда открыта.
Обсуждение механизма ресурсов, как внутри X Window, так и в рамках
объектно-ориентированной разработки программ в целом, автор хотел бы
продолжить в следующей статье.