Приложение не взаимодействует с X сервером напрямую. Вместо этого, оно использует одну или несколько библиотек которые предоставляют высокоуровневый интерфейс к X протоколу. Принципиально для Motif приложений доступны три библиотеки: Xlib, X Toolkit Intrinsics (Xt) и Motif toolkit (Xm).
X клиентам не необходимости взаимодействовать с сервером на уровне X протокола. X имеет интерфейс клиента на языке C к протоколу, называемый Xlib. Среди других Xlib предоставляет следующие возможности:
Подпрограммы для создания и управления основными ресурсами сервера, включающими окна, пиксельные изображения, шрифты, курсоры, графические контексты и свойства.
Подпрограммы для отрисовки текста и графики в отрисовываемых элементах.
Буферизацию запросов к серверу и постановку в очередь событий от сервера.
Структуры данных представляющие события всех типов и подпрограммы для выбора и чтения событий.
Подпрограммы для обслуживания цветовых палитр и для использования аппаратно-независимых цветовых пространств.
Подпрограммы для генерации текстового ввода и вывода в различных локализациях.
Менеджер ресурсов X (Xrm - X resource manager), базу данных параметров указанных пользователем для приложения.
Менеджер ресурсов это ключевой момент в основных принципах X: как прользователь и приложение должны управлять внешним видом, стилем взаимодействия и другими вспомогательными характеристиками клиента. Например, цвета заднего и переднего плана и шрифты, используемые приложением должны быть представлены как ресурсы. Обычно приложение предоставляет значения по умолчанияю для таких ресурсов, но позволяет пользователю перекрывать значения по умолчанию.
Ресурс состоит из трех компонент: имени, класса и значения. Класс может включать набор ресурсов с различными именами. Ресурсы могут быть расположены в виде иерархии; имя и класс могут состоять из компонент, каждый указывая имя или класс некоторого уровня иерархии. Полностью определенное имя или класс ресурса есть список имен или классов на всех уровнях, начиная с имени или класса приложения и заканчивая именем или классом самого ресурса.
Менеджер ресурсов позволяет пользователю или приложению указывать значения в файле, в командной строке при запуске приложения или вызовом подпрограмм Xrm в программе. Спецификация ресурса должна включать имя или класс ресурса, но может быть как полностью так и частично определенным относительно имен, класс или смесь компонентов имен и классов. Результирующая база данных ресурсов может содержать как общие так и конкретные спецификации ресурсов. Когда приложение запрашивает в базе данных значение ресурса, оно предоставляет полностью определенное имя и класс. Менеджер ресурсов использует алгоритм поиска возвращающий значение из наиболее конкретной спецификации которая попадает под запрашиваемые имя и класс.
Поскольку Xlib предоставляет базовые возможности взаимодействия с X серверо, разработка сложного приложения с использованием только Xlib будет очень сложной задачей. Xlib в сущности предоставляет примитивы для X клиента. Сложные приложения нуждаются в объединеии этих примитивов в конструкции, которые позволяют взаимодействовать с сервером более обобщенным способом.
X включает библиотеку X Toolkit Intrinsics (сокращенно Xt) поддерживающую некоторые из таких высокоуровневых интерфейсов. Три наиболее важных возможности Xt следующие:
Объекты, известные как виджеты, используемые для содержания данных и представления интерфейса для пользователя.
Управление геометрией виджетов.
Диспетчеризации и обработки событий.
Ядром Xt является набор абстракций данных построенных в объектной модели. Каждый из этих объектов, называемых виджетами, является комбинацией данных и процедур. Каждый экземпляр виджета является членом класса. Класс виджета объединяет набор процедур и структур данных являющихся общими для всех виджетов класса. Экземпляр виджета содержит процедуры и структуры данных свойственные только к этому виджету. Зкземпляр виджета также содержит ссылку на свой класс.
Каждый виджет обычно предоставляет обобщенное поведение сязанное с специфическим видом взаимодействия с пользователем. Например, Motif содержит класс виджетов предназначенных для предоставления пользователю возможности ввода и редактирования текста. Этот класс предоставляет общие возможности для поддержки ввода и отображения текста, включая редактирование, выделение, удаление и вставку текста в/из буфера обмена. Класс содержит структуры данных связанные не только с содержащимся текстом, но и с внешним видом на экране. Для использования этого класса приложение создает экземпляр этого класса виджетов и предоставляет некоторые свои данные и процедуры для экземпляра виджета.
Xt поддерживает простое наследование классов виджетов. Это значит, что класс виджетов может быть подклассом другого класса, называемого суперклассом. Подкласс часто является специализированным вариантом более общего суперкласса. Подкласс может наследовать, переопределять или добавлять процедуры и структуры данных своего суперкласса. Xt обычно предоставляет классы разработанные для того чтобы быть суперклассами для других классов. Motif предоставляет подклассы из которых приложение создает экземпляры виджетов. Раздел 1.3 содержит полную информацию об иерархии классов виждетов Motif и Xt.
Экземпляры виджетов организованы в другую иерархию. Каждый виджет приложения, кроме виджета (или виджетов) верхнего уровня, имеет родительский виджет. Виджеты некоторых классов, называемых композитными, могут иметь дочерние виджеты. Другие виды виджетов, называемые примитивами и гадгетами, обычно не могут иметь дочерних виджетов. Приложение создает одну или несколько деревьев экземпляров виджетов составляя ее из композитных виджетов, примитивных виджетов и гадгетов. Например, меню может состоять из композитного родителя представляющего меню и некоторого числа примитивных дочерних виджетов представляющих кнопки. Меню и его дочерние компонеты являются одной из ветвей общего дерева виджетов в приложении.
Xt и Motif предоставляют все классы виджетов обычно необходимые для приложений. Любое приложение может доопределить новые классы виджетов, но это требует знания внутреннего устройства которое не будет обсуждаться в этой книге. Типичное приложение создает экземпляры виджетов встроенных классов, предоставляя свои процедуры и данные для этих виджетов.
Xt использует расширение механизма ресурсов для представления данных экземпляров виджетов доступных приложению. Каждый класс виджетов определяет набор ресурсов, применимых к виджетам этого класса. Класс может наследовать или прекрывать ресурсы суперкласса по своему усмотрению.
Класс виджетов определяет имен и класс каждого своего ресурса. Xt и Motif дают имя каждому своему классу виджетов, а приложение дает имя для каждого экземпляра виджета. Наконец, разработчик приложения предоставляет имя и класс для своего приложения. Для получения ресурса данного виджета, поностью определенным именем являетсясписок именначинающийся с имени приложения, затем содержащий имя виджета верхнего уровня и затем, спускаясь вниэ по дереву виджетов до данного виджета, имена виджетов и, наконец, имя самого ресурса. Полностью определенный класс это список классов начиная с класса приложения, затем класса виджета верхнего уровня и затем классов всех виджетов по пути вниз по дереву виджетов до данного виджета, и заканчивающийся классом ресурса.
Пользователь, приложение и классы виджетов совместно предоставляют значения ресурсам и тем самым контроль за внешним видом и другими атрибутами компонентов приложения. Как пользователь, так и разработчик приложения могу предоставлять как конкретные так и общие спецификации для ресурсов виджетов в различных файлах ресурсов или из командной строки. Также возможно предоставление различных спецификаций ресурсов в зависимости от локализации, параметров экрана или других произвольных критериев.
Когда приложение запускается, Xt объединяет эти спецификации с начальной базой данных ресурсов. Когда приложение создает виджет, Xt назначает начальные значения ресурсам виджета с использованием спецификаций из базы данных, значений указываемых приложением во время создания или значений по умолчания определяемых классом виджета. После создания ввиджета приложение использует подпрограмму XtGetValues для получения значения ресурса виджета и XtSetWidget для назначения ресурсу нового значения.
Большинство виджетов или имеют связанное с ним окно или занимают определенную прямоугольную область на окне своего родителя. Каждый виджет имеет высоту, ширину и положение относительно своегжо родителя, выражаемое как x и y координаты верхнего левого угла виджета. Определения положения и размеров виджетов относительно других виджетов составляют раскладку или геометрию приложения.
Геометрия приложения является результатом воздействия следующих факторов:
Пользователь или приложение может предоставить значения для ресурсов, оказывающих влияние на геометрию, например высоту и ширину виджета.
Менеджер окон, специальная клиентская программа которая управляет положением и размерами окно верхнего уровня, запускается на большинстве дисплеев. Motif предоставляет менеджер окон называемый менеджером окон Motif (MWM - Motif Window Manager). Пользователь часто изменяет размер окон верхнего уровня посредством средств менеджера окон.
Дочерний виджет может иметь предпочтения относительно своего размера. Например, виджет отображающий метку может желать имет ширину, достаточную для отображения всего текста метки.
Родительский виджет может иметь предпочтения о своем размере и положении сових дочерних виджетов. Например, виджет меню может желать расположить свои дочерние кнопки расположив их в несколько строк или рядов.
Процесс учета всех этих факторов и определения расположения виджетов называют управлением геометрией. Xt предоставляет существенные возможности для управления геометрией:
Все виджеты имеют ресуры указывающие, как непосредственно так и косвено, геометрию подразумеваемую пользователем или приложением.
Xt имеет специальные виджеты, называемые оболочками, чьи функции в основном предназначены для взаимодействия между приложением и внешними агентами типа менеджеров окон.
Процедуры классов виджетов могут запросить родительский виджет изменить геометрию виджета, могут вычислить предпочтительный размер и могут пересчитать раскладку виджета когда виджет получит новый размер.
Родительские виджеты имеют абсолютный контроль над геометрией своих детей. Процедуры класса родительского виджета могу принять или отвергнуть запрос дочернего виджета на изменение его геометрии. В общем случае родительский виджет может изменить геометрию дочернего виджета в любой момент.
Виджет считается управляемым если он и его родитель готовы к согласованию геометрии. В общем, виджет может быть отображен на экране только после того, как он взят на управление.
Смотрите Главу 14 для дополнительной информации об управлении геометрией и специфических правилах управления Motif виджетов.
Xt содержит процедуру обработки событий которая читает события из сервера и распределяет их сообветствующим виджетам. Каждый виджет который имеет связанное с ним окно может также иметь таблицу транстляции. Эта таблица отображает определения событий на имена процедур, называемые действиями. Когда Xt читает событие связанное с виджетом, он ищет описание события в таблице трансляции и распределяет событие соответствующей подпрограмме-действию.
Приложение может предоставлять свои собственные подпрограммы действий, но\ многие такие подпрограммы содержатся в классах виджетов. Подпрограмма действия часто производит некоторые действия над ее владельцем и затем оповещает приложение посредством вызова процедур приложения, называемых процедурами обратного вызова. Многие виджеты содержат ресурсы, чьими значениями являются списки процедур обратного вызова. Виджет вызывает процедуры этих списков в определенном случае, обычно когда виджет принимает некоторые виды событий. Xt предоставляет и другие возможности для приема и ответа на события, но многим приложениям необходимо только добавить соответствующие процедуры обратного вызова. Эти процедуры обратного вызова выполняют большую часть работы приложения в части проведения диалога с пользователем.
Механизм обработки событий в Xt естественно приводит к событийно-управляемой структуре прикладной программы. Большинство приложений имеют сходный общий вид:
Инициализация приложения.
Создание в взятие на управление виджетов.
Предоставление процедур обратного вызова вызываемых виджетами.
Вызов цикла обработки событий в Xt, который обычно никогда не завершается.
Xt предоставляет фундамент для создания наборов виджет, ответственных за специфические возможности прользовательского интерфейса. Motif использует фундамент Xt для построения как базовых классовтак и различных специализированных подклассов виджетов. Раздел 1.3 содержит описание набора виджетов Motif.
В дополнение к предоставляемым виджетам, Motif добавляет некоторые возможности которые обычно используются приложением и пользователем. Этот раздел содержит описание некоторых из этих возможностей.
Виджеты Motif имеют характерные визуальные стили. Многие виджеты имеют тень c трехмерным видом что делает изобржения виджетов выступающими из или погруженными в задний фон. Виджеты, содержащие клавиатурных фокус могут иметь прямоугольную рамку подсветки. Когда пользователь нажимает кнопку Btn1 мыши и фокус находится в кнопке цвет изображения кнопки изменчяется для индикации того, что пользователь выбрал или "нажал" кнопку.
Motif автоматически создает цвета по умолчанию для изображения, теней, подсветки и выделения виджета. Пользователь или приложение могут предоставить свои собственные цвета или пиксельные изображения как значения ресурсов виджета.
Глава 12 предоставляет дополнительную информацию по использованию цветов и пиксельных изображений в Motif.
Система X Window устанавливает соглашения для своих клиентов которые позволяют пользователю переносить данные из одного приложения в другое. Такой перенос работает посредством выделений нескольких видов включая первичное, вторичное и выделение области обмена. Выделение это совместно используемый ресурс, которым может владеть только один клиент в один момент времени на данном дисплее. Когда пользователь запрашивает перенос данных из одного приложения в другое, принимающий клиент просит владельца выделения преобразовать данные в вид известный клиенту, и затем приемник вставляет данные. Этот механизм также позволяет переносить данные виджетами одного и того же приложения.
Виджеты Text и TextField поддерживают первичное, вторичное выделения и выделение буфера обмена. Motif также содержит подпрограммы обрабатывающие выделение буфера обмена, позволяя приложениям проще копировать данные в и из буфера обмена. Xt предоставляет более общие подпрограммы для переноса данных посредством выделений.
Motif содержит обширный механизм drag and drop для переноса данных. Пользователь начинает перенос нажатием кнопки мыши, назначенной для функции переноса (обычно Btn2) когда указатель находится над источником данных. Пользователь перетаскивает иконку представления данных в точку которая принимает данные, называемой \{drop site местом выброса}. Когда пользователь отпускает кнопку мыши данные перемещаются, копируются или связываются с местом выброса.
Подклассы виджетов Text, TextField, List и Label автоматически поддерживают drag and drop перенос данных в текстовом и некоторых пиксельных форматах. Motif включает обширный программный интерфейс объектов и подпрограмм которые позволяют приложению устанавливать свои источники перетаскивания и места выброса, контролировать договоренность между отправителем и приемноком, настраивать визуальные элементы и преобразовывать различные виды данных.
Дополнительную информацию о переносе данных можно найти в Главе 13.
Motif предоставляет два стиля переноса клавиатурного фокуса с одного виджета на другой. В одном стиле виджет, содержащий указатель содержит фокус. При другом стиле пользователь нажимает клавишу или кнопку Btn1 для перемещения фокуса на другой виджет, а положение указателя не влияет на фокус.
При втором стиле Motif различает переход на композитный виджет или виджет с внутренней навигацией, называемой табуляционной группой, и навигацию между виджетами или элементами внутри табуляцинной группы. Motif имеет несколько ресурсов и подпрограмм для контроля перехода с использованием этого стиля.
Глава 13 содержит дополнительную информацию о клавиатурных переходах и других возможностях ввода.
Motif представляет большинство текстовых данных с использованием типа данных, называемого композитными строками (Также известного как XmString). Это поток компонентов, представляющих текст, направление отображения и тэги воспроизведения. Эти тэги воспроизведения указывают как текст должен выглядеть при отрисовке, включая следующие параметры:
Шрифт
Цвет
Позиции табуляции (если используются)
Подчеркивание
Другие возможности
Композитная строка состоит из нескольких текстовых сегментов, возможно с различными направлениями и тэгами воспроизведения. Motif использует композитные строки для представления всех текстовых данных за исключением виджетов Text и TextField.
Для каждого виджета который содержит текст Motif поддерживает информацию о шрифтах, цвете, позициях табуляций и других свойствах написания текста использую тип данных называемый таблицей воспроизведения. Таблица воспроизведения является списком входов, каждый из которых состоит из (шрифта или набора шрифтов) и информации воспроизведения. Набор шрифтов это конструкция представляющая группу шрифтов необходимых для отображения текста в локализации приложения.
Когда Motif отображает текст сегмента композитной строки, он сопоставляет тег воспроизведения сегмента строки с таблицей воспроизведения виджета. Затем он использует соответствующий шрифт или набор шрифтов для отображения текста из сегмента. Специальный тэг воспроизведения (называемый _MOTIF_DEFAULT_LOCALE) указывает что текст должен разбираться в кодировке текущей локализации и отображаться с использованием шрифтов, необходимых для этой локализации.
Смотрите Главу 9 для получения дополнительной информации о композитных строках, шрифтах, визуальных воспроизведениях и таблицах воспроизведения. Глава 11 содержит информацию об использовании этих инструментов для подготовки приложения к использованию в различных языковых окружениях.
Менеджер окон Motif (MWM) является клиентской программой, которая способна управлять окнами как Motif так и не Motif приложений. MWM предоставляет декорации для окна и функции перемещения, изменения размера, подъема, опускания, максимизации и минимизации окон. Пользователь может отображать иконки как на корневом окне, так и в icon box. MWM имеет много ресурсов, которые позволяют пользователю устанавливать их внешний вид и предпочтения.
В Главе 18 находится дополнительная информация о интерфейсе приложнения к MWM. Смотрите справочную страницу \textbl{mwm}(1) в Motif. Справочник программиста для получения информации о ресурсах и функциях MWM.
Motif содержит язык описания, называемый Языком Интерфейса Пользователя (User Interface Language - UIL). Разработчики используют UIL для задания виджетов и данных в текстовом файле и затем компиляции этого файла в бинарный формат. Во время выполнения приложение, используя подпрограммы Менеджера Ресурсов Motif (Motif Resource Manager - MRM), извлекают описания виджетов и данных из бинарного файла и MRM создает виджеты и структуры данных по этому описанию.
UIL и MRM работают вместе с набором компонентов Motif. Приложение задает процедуры обратного вызова и общается с используемыми виджетами исключительно через набор компонентов Motif. При использовании UIL для определения иерархии виджетов программы разработчик должен отделить опредение пользовательского интерфейса от кода приложения. Разработчик должен изменять интерфейс посредством редактирования и перекомпиляции текстового файла без перекомпиляции и сборки прикладной программы. Как и с файлами ресурсов пользователь должен использовать различные UIL файлы содержащие текст, таблицы визуализации и другие данные, специфические для конкретной локализации.
Смотрите Главу 4 для получения информации об использовании UIL и MRM в приложениях. Смотрите справочную страницу \textbl{UIL}(5) в книге Motif. Справочник программиста для получения информации о синтаксисе UIL.
Xt создан как надстройка над Xlib, а Motif - как надстройка над Xt. Единственная цель Xt это предоставление приложению набора высокоуровневых интерфейсов и объектов освобождают программу от взаимодействия с большим количеством простых подпрограмм Xlib. Задача Motif - предоставить приложению устойчивый высокоуровневый интерфейс и, в частности, разнообразный набор виджетов для освобождения программы от необходимости определять свои собственные виджеты для большинства задач.
Тем не менее, Xt не стремится заменить все интерфейсы Xlib, а Motif не ставит своей задачей заменить все интерфейсы Xt. Даже простое Motif приложение должно использовать подпрограммы Xt для инициализации набора компонентов, управления виджетами, создания окон для виджетов, получения и установки ресурсов, добавления процедур обратного вызова и входа в цикл обработки событий.
Многие Motif приложения не нуждаются в использовании подпрограмм Xlib. Тем не менее, Motif не содержит своих собственных графических подпрограмм, средств работы с цветовыми пространствами или поддержки управления методами ввода для приложения. Программы которым необходимы эти возможности должны использовать инструментальные средства других производителей или же напрямую вызывать подпрограммы Xlib.
Как общее правило, приложение должно использовать наиболее высокоуровневый интерфейс достаточный для решаемых задач. Это обычно дает не только короткую программу, но также обеспечивает то, что функционирование программы сохранится, когда процедуры высокого уровня будут заменены на процедуры низкого уровня.
Например, Xlib, Xt и Motif все содержат подпрограммы для установки фокуса клавиатуры в окно или виджет. Xt и Motif оба поддерживают внутренне состояние для отслеживания изменения фокуса. Если Motif приложение использует подпрограммы Xt или Xlib, то это может привести Motif или Xt к внутреннему нессответствию.
По соглашению, имена подпрограмм и структур данных Xlib начинаются с "X"; имена подпрограмм и структур данных Xt начинаются с "Xt"; и, наконец, имена подпрограмм и структур данных Motif начинаются с "Xm".
Эта книга не описывает интерфейсов Xlib и Xt. Разработчик Motif приложений должен знать основные интерфейсы прикладных программ Xt и должен иметь общее представление о Xlib. Для дополнительной информации по Xlib смотрите стандарт X Consortium Xlib - Интерфейс с X на языке C. Для дополнительной информации по Xt смотрите документ X Window System X Toolkit Intrinsics - Интерфейс на языке C.