Motif дает возможность использовать различные стили программирования приложений. Приложение выполняющее большинство задач, таких как обработка некоторых видов ввода пользователя и отображение некоторых видов вывода, может делать это несколькими способами. Пока эта гибкость одна из сильных сторон Motif, набор компонентов разработан с учетом различных принципов программирования. Эта глава объясняет общее назначение используемых Motif виджетов и других возможностей набора компонентов. Следующая глава дает набросок общей структуры Motif программ, и последующие главы описывают возможности набора комполнентов в деталях.
Следующие общие принципы позволяют понять как писать любые Motif программы:
Применяйте ориентированную на пользователя перспективу. В большинстве Motif программ приложение производит свою работу в ответ на команды или другие виды ввода информации от пользователя. Важной частью разработки интерфейсов является предоставление возможности точного принятия решения пользователем на основании команд, параметров и другой информации, предоставленной приложением. Интерфейс в большей части состоит из процедур которые исполняют команда пользователя или иным образом реагируют на вводимые пользователем данные.
Разделяйте разработку ядра приложения от интерфейса пользователя. Ядро приложения не должно зависеть от любого интерфейса пользователя. Хорошей идеей является определение обобщенного набора общих подпрограмм и структур данных для обслуживания ввода и отображения вывода. В последующем разработчик будет иметь возможность реализовать эти подпрограммы различными способами для предоставления различных интерфейсов пользователя для приложения.
Следуйте Руководству по стилю Motif при разработке интерфейсов пользователя. Поскольку приложение может использовать виджеты Motif в различных конфигурациях для пользователя некоторые из них будут более общими, понятными и комфортабельными чем другие. Руководство по стилу Motif содержит требования и рекомендации для удобных приложений, а также дополнительные пояснения в части разработки приложений.
Делайте наброски иерархии виджетов. Однажды Вы остановитесь на нескольких вариантах комбинаций виджетов, тогда Вы сможете найти более удачную реализацию если у Вас будут эскизные наброски дерева всех виджетов, которые использует программа. Конструирование дерева виджетов позволяет раскрывать расхождения и неуклюжесть в разработке. Присоединение диалогов и меню к иерархии может помочь обеспечить соответствие и завершенность в представлении и требованиях к информации.
Используйте наиболее высокоуровневые интерфейсы как только возможно. Motif приложение должно использовать некоторые интерфейсы X Toolkit Intrinsics (Xt) и оно может вызывать другие публичные подпрограммы Xt и Xlib. Для некоторых задач, таких как рисование графики, приложение должно вызывать низкоуровнывые подпрограммы. Тем не менее, Motif предоставляет интерфейсы типа ресурсов, списков процедур обратного вызова и разнообразные удобные подпрограммы для решения большинства задач. Motif также содержит как простые так и сложные виджеты которые выполняют большую часть работы связанной с их специфичными функциями, такими как редактирование текста или основанное на ограничениях управление геометрией. Использование высокоуровневых интерфейсов Motif вместо сравнимой последовательности низкоуровневых вызовов делает код более простым и облегчает его сопровождение.
Используйте файлы ресурсов и язык описания интерфейсов пользователя (User Interface Language - UIL) для определения характеристик интерфейса. Избегайте включения описания и данных интерфейса полизователя в код приложения. Использование ресурсов дает пользователю возможность переопределять предоставляемые приложением значения по умолчанию. UIL предоставляет удобную возможность для отделения иерархии виджетов от приложения. При использовании как ресурсов, так и UIL разработчик получает возможность изменять интерфейс без перекомпиляции кода приложения. Эти механизмы какже предоставляют возможности для приспособления интерфейса и данных для специфических языковых окружений.
Базовым принципом программирования в Motif и Xt является забота приложения о пользователе. За исключением редких случаев программа выполняет действия в ответ на команды или другой вводимые пользователем данные. Как факт, типичная Motif программа проводит большую часть времени в ожидании ввода информации пользователем.
Основным типом объектов в Motif интерфейсах является виджет. Некоторые виджеты отображают выходную информацию, брабатывают входную информацию или выполняют и то и другое. Некоторые виджеты предназначены для содержания других виджетов. Виджет обычно связан с окном или прямоугольной областью экрана. Виджет также имеет атрибуты, называемые ресурсами, которые могут быть установлены пользователем или приложением. Приложение организует виджеты в оду или более иерархий или деревьев родительских виджетов и их потомков.
Motif и Xt определяет набор типов или классов виджетов. Класс видета может быть подклассом другого класса; в этом случае он наследует некоторые атрибуты и поведение от суперкласса. Motif имеет три базовых класса виджетов:
Примитивы являются базовыми элементами для ввода и вывода. Примитивы обычно не содержат потомков. Специализированные примитивы Motif включают метки, разделители, кнопки, полосы прокрутки, списки и текстовые виджеты. Некоторые классы примитивов имеют эквивалентные объекты, называемые гадгетами. Они очень похожи на примитивы за исключением того, что для увеличения производительности они не имеют связанного с ними окна.
Менеджеры сложные виджеты, которые могут содержать примитивы, гадгеты или другие менеджеры. Менеджеры отвечают за геометрическое расположение своих потомков. Они также обрабатывают и распределяют ввод для своих гадгет потомков. Специализированные Motif менеджеры включают рамки, скроллируемые и панельные окна, меню, менеджеры геометрии основанной на ограничениях и различные виды диалогов.
Оболочки это виджеты основное назначение которых заключается во взаимодействии с менеджером окон. Большинство оболочек могут иметь только одного потомка, и они поддерживают такой же размер и расположение как и потомок. Специализированные оболочки Motif существуют для окружения приложения, диалогов и меню.
Определение иерархии виджетов является одной из двух основных задач Motif приложения. Другая задача - определение набора процедур обратного вызова. Процедуры обратного вызова являются основным механизмом посредством которого приложение реагирует на ввод пользователя. Когда пользователь совершает действие типа нажатия на клавишу или кнопку мыши X сервер отправляет приложению событие. Xt распределяет зто событие соответствующему виджету, обычно тому которому пользователь направил ввод. Xt отображает события на одну или более подпрограмм действий виджета. Действие может изменить состояние виджета и, если приложение запросило оповещение об этом действии, может произвести "обратный вызов" программы посредством вызова процедур обратного вызова приложения.
Многие Motif виджеты ресурсы, являющиеся списками процедур обратного вызова. Motif вызывает процедуры из этого списка когда пользователь производит действие некоторого вида. Например, большинство кнопок имеют процедуры обратного вызова вызываемые Motif когда пользователь актвизирует кнопку. Пользователь может активировать кнопку несколькими способами, такими как нажатием клавиши osfSelect или кнопки Btn1 мыши. События, составляющие активизацию и другие значащие действия пользователя определены в общем виде в Руководстве по стилю Motif и описаны для каждого виджета в Справочнике программиста Motif.
Действия пользователя могут заставить Motif изменить состояние и внешний вид виджета. Например, когда пользователь нажимает osfSelect на PushButton, Motif может изменить внешний вид кнопки как будто она была нажата, а затем отпущена, аналогично обычной механической кнопке. Действие может иметь и другой эффект в зависимости от контекста. Например, Motif содержит диалоговый виджет называемый FileSelectionBox, используемый для поиска и выбора файла. Когда пользователь активизирует PushButton кнопку Фильтр в FileSelectionBox, Motif производит поиск и отображает имена файлов которые совпадают с шаблоном отображаемым в другом месте FileSelectionBox.
В общем Motif берет на себя заботу по изменению состояния и внешнего вида виджета в ответ на соответствующие действия пользователя. По умолчания тем не менее эти действия не оказывают никакого эффекта на приложение. Разработчик приложения должен интерпретировать смысл этих действий для приложения предоставляя процедуры обратного вызова, которые Motif будет вызывать когда пользователь выполнит действие. Процедуры обратного вызова могут изменить состояние приложения, например, изменением значения переменной когда пользователь выбирает новое значение с помощью виджета Scale. Процедура обратного вызова может заставить приложение получить действие. Она также может изменить состояние одного или нескольких его виджетов или может создать совершенно новую иерархию виджетов.
Когда Motif и приложение заканчивают обработку действия пользователя, приложение ожидает от пользователя дальнейшего ввода. Xt предоставляет подпрограмму в которой приложение проводит большую часть своего времени. Эта подпрограмма ожидает поступления события, диспетчеризирует его соответствующему виджету и затем ожидает другого события. После инициализации набора компонентов и создания начальной иерархии виджетов большинство приложений входят в этот цикл и выполняют его пока пользователь не остановит программу.
Motif и Xt предоставляют приложению другие способы получения и обработки событий, но для простых программ фактически полный интерфейс между пользователем и приложением состоит из процедур обратного вызова.