Motif является графическим интерфейсом пользователя, с его помощью прикладная программа получет вводимые пользователем данные и производит отображение выходных данных для пользователя приложения. Motif предоставляет промежуточный механизм для взаимодействия между приложением и пользователем. С обоих сторон этом механизм выглядит как набор объектов имеющих графическое представление на экране. Программа создает и отображает объекты разных типов, предоставляемых Motifом, для отображения специфической информации и запроса необходимых видов данных. Пользователь производит ввод манипулированием экранных представлений этих объектов с помощью устройства указания, клавиатуры или обоих.
Эта книга описывает программый интерфейс приложений (API - Application Programming Interface). Это набор средств которые Motif предоставляет разработчику приложения для создания и взаимодействия с Motif для создания приложения. Эта книга не является справочником, она не пытается дать исчерпывающее описание всех деталей Motif. Она фокусирует внимание на обзоре архитектуры Motif, разъясняет концепции и соглашения, необходимые для использования его API и предоставляет некоторые примеры. Эта книга дополняет другие из набора документации на Motif:
Справочник программиста Motif детально определяет каждый элемент интерфейса прикладных программ Motif. Он организован как справочные страницы по одной на каждый элемен интерфейса.
Спецификация окружения приложения - окружение пользователя описывает как каждый элемент интерфейса должно использовать приложение для достижения максимальной совместимости. Все реализации Motif должны поддерживать интерфейсы, описанные в этой книге.
Руководство по стилю Motif описывает как приложение должно использовать интерфейсы для обеспечения максимальной согласованности с другими Motif приложениями.
Руководство пользователя описывает внешний вид и стиль взаимодействия с Motif с точки зрения пользователя.
Иитерфейс прикладных программ Motif реализован на языке C. Motif требует, чтобы приложения написанные на C согласовывались с диалектом ANSI C. Эта книга подразумевает знание ANSI C, также как и остальные справочные и учебные книги. Также возможно написание программ на других языках, включая C++, но эта книга дает объяснения и примеры только для приложений написанных на C.
Motif основан на системе X Window, также сокращенно называемой X. В своей основе система X Window является протоколом с помощью которого приложение генерирует изображение на компьютере имеющем растровый дисплей и получает информацию от устройств связанных с дисплеем.
X основан на клиент-серверной модели вычислений. Прикладная программа является клиентом, взаимодействующим посредством X протокола с сервером, который производит непосредственный ввод и вывод информации на дисплее. Эта модель имеет несколько важных возможностей:
Клиент и сервер могут быть запущены как на одной машине, так и на разных машинах, связанных посредством сети.
Только сервер нуждается в непосредственном доступе к аппаратуре дисплея. X протокол является аппаратно-независимым, т.е. клиент без изменений использует любые возможности дисплея поддерживаемые протоколом.
Сервер может обрабатывать несколько клиентов на одном дисплее в одно время. Эти клиенты могут взаимодействовать друг с другом использую передачу информации через сервер.
Клиент может взаимодействовать с несколькими серверами.
Дисплей является абстракцией, предсавляющей устройства ввода и вывода, контролируемые одним сервером. Типично дисплей состоит из клавиатуры, устройства указания и одного или более экранов. Экран является абстракцией, представляющей одно растровое устройство вывода.
Каждый клиент создает одно или более окно на одном или более экранах данного дисплея. Окно это прямоугольная область экрана на которой клиент производит отображение. Окна организованы в иерархию как родительские и дочерние. Сервер поддерживает дерево окон для каждого экрана. Окно самого верхнего уровня называется корневым окном экрана. Каждый клиент обычно создает зотябы одно окно дочернее к корневому, и любые другие окна клиента являются потомками этого окна. Окна могут перекрываться и сервер поддержывает организованный в виде стэка порядок всех окон на экране. Дочернее окно может выходить за диапазоны своего радителя, но весь вывод будет отсечен или подавлен вне границ родительского окна.
Клиент запрашивает сервер для создания или уничтожения окон, а окна являются ресурсами управляемые сервером. Сервер поддерживает другие ресурсы, включая следующие:
Пиксельные изображения являются прямоугольными внеэкранными областями в которых приложение может производить отрисовку. Совместно окна и пиксельные изображения являются отрисовываемыми элементами или элементами на которых клиент может производить рисование. Единицей измерения высоты и ширины окон и пиксельных изображений является пиксел. Каждый пиксел имеет определеную глубину, представляющую из себя количество бит или плоскостей. Таким образом пиксел имеет суммарное значение, диапазон которого зависит от глубины отрисовываемого элемента. Пиксельные изображения имеющие единичную глубину называются битовыми изображениями. Каждый пиксел в битовом изображении имеет одно из двух возможных значений: 0 или 1.
Цветовая палитра является связью между значениями пикселов и цветами. Каждый цвет представляется тройкой значений красной, зеленой и синей составляющих которая дает конкретный цвет на конкретном экране. Каждое окно имеет связанную с ним палитру которая определяет какие цвета используются для отображения каждого пикселя.
Шрифт это набор битовых образов символов используемых для отображения текста.
Курсор это объект, содержащий информацию необходимую для графического представления положения устройства указания. Он состоит из исходного битового изображения, битового изображения формы, горячей точки или положения представляющего реальную точку положения устройства указания и двух цветов.
Графический контекст или GC является набором атрибутов, определяющих как любые графические операции будут влиять на отрисовываемый элемент. Каждая графическая операция над отрисовываемым элементом выполняется с использованием графического контекста указанного клиентом. Некоторые из атрибутов графического контекста это значения пикселя для фона и изображения, ширина линии и область отсечения.
Свойство это именованная структура данных, связанная с окном. Клиенты часто используют свойства для взаимодействия друг с другом.
Каждый клиент открывает соединения с одним или более сервером. Клиенты и серверы взаимодействуют друг с другом посредством запросов, ответов, ошибок и событий. Клиент отправляет запрос на сервер запрашивая выполнение некоторой операции, типа создания окна или рисования линии в пиксельном изображении. Некоторые запросы, такие как информационные запросы, заставляют сервер сгенерировать ответ для клиента. Запрос, превевший к возникновения ошибочной ситуации, может побудить сервер сгенерировать для клиента ответ об ошибке. Сервер выполняет запросы от каждого клиента в порядке их приема от клиентов, хотя сервер может выполнять запросы от других клиентов в любое время.
Сервер оповещает клиентов об изменении состояния посредством событий. Событие может быть побочным эффектом запроса клиента или иметь полностью асинхронный характер, такой как нажатие пользователем клавиши или перемещение указателя. В дополнение клиент может посредством сервера отправить событие другому клиенту.
Каждый клиент запрашивает сервер посылать ему события отдельных типов происходящие в конкретных окнах. Сервер обычно сообщает о событиях произошедших в некотором окне. Например, клавиатура концептуально подключена к одному из окон, называемых окном фокуса. Когда пользователь нажмет клавишу, сервер обычно сообщает о произошедшем событии окну фокуса. Если клиент запросил сервер отправлять ему события типа \eventtype{KeyPress} происходящие в некотором окне, сервер будет отправлять клиенту событие когда пользователь нажимает клавишу пока это окно имеет фокус.
С точки зрения клиента он читает события от сервера, события являющиеся результатом запросов клиента поступают в последовательности в которой он делал запросы. Несмотря на это, эти события могут идти вперемешку с событиями произошедшими по другим причинам, таким как ввод пользователя или действия других клиентов. Более того, клиент может буферизировать запросы, а сервер может буферизировать события перед их фактической передачей дркгому, т.е. события могут поступить намного позже после того как клиент сделает запрос, который создаст событие.
В большей своей части обработке событий в X свойственна асинхронность. Большая часть клиентских приложений выполняет бесконечный цикл в котором читает событие, обрабатывает его (возможно делая запросы в процессе обработки), а затем читает другое событие. Клиент не предпологает, например, когда данное событие будет сгенерировано после данного запроса клиента поскольку клиент читает событие после того как сделает запрос. Многие события имеют метку времени для обозначения момента когда сервер действительно сгенерировал событие. Клиент который зависит от временной последовательности поступления событий должен анализировать эти метки.