дальше выше обратно Содержание
Следующий пункт: Lesstif Надпункт: Надстройки над Xt Предыдущий пункт: Athena

Motif

Open Software Foundation Motif (OSF/Motif) представляет собой пакет, включающий менеджер окон, набор утилит для выполнения различных вспомогательных операций, а также библиотеку объектов, построенных на основе X Toolkit Intrinsics. В разделе, посвящённом средствам разработки пользовательскиих интерфейсов (UIDS/UIMS), приводился пример UIDS --- система XFaceMaker3, которая является типичным X-приложением, написанным на основе OSF/Motif.

Вот, пожалуйста, другой пример: это X-приложение тоже использует Motif.

Motif поддерживает все классы Xt и, следовательно, ресурсы этих классов, но для записи имени и класса ресурса объекта используются константы, начинающиеся соответственно с префикса XmN и XmC. Для записи типа ресурса употребляются константы с префиксом XmR (вместо XtR, принятого в Xt).

Motif расширяет множество классов объектов, предоставляемое Xt. В частности, Motif поддерживает достаточно большой набор классов, позволяющих создавать меню, полосы прокрутки (scrollbar), нажимаемые кнопки, редактирующие элементы и т.д.

Кроме этого, Motif предоставляет специальный класс объектов, которые называются gadget -- они образуют в Motif отдельный класс XmGadget, который является подклассом класса RectObj. Они также могут использоваться для создания интерфейсных элементов, но обладают особенностью -- они не имеют собственных окон. Для рисования gadget пользуются окном своего родителя.

Каждый класс widget имеет достаточно широкий выбор как наследуемых, так и дополнительных, специфичных для него ресурсов. Они позволяют управлять такми важными характеристиками объектов, как цвет фона, местоположение на экране, шрифт выводимого текста и т.д.

Некоторые из классов Motif не используются для создания экземпляров widget (такие классы в терминологии объектно-ориетированного программирования называются абстрактными). Они содержат в себе самые общие атрибуты и методы, необходимые для функционирования различных типов widget.

Motif имеет два основных подкласса объектов: XmPrimitive и XmManager (класс XmGadget поминался ранее). Оба этих класса являются абстрактными. Превый из них наследуется от класса Core и используется как базовый для классов объектов, не владеющих другими объектами. Примерами являются нажимаемые кнопки, спсики и т.д. Класс XmManager наследуется от класа Constraint и применяется для создания объектов, которые могут иметь и управлять дочерними объектами.

Классификация объектов

Иерархия классов Motif (Xm) представлена на рисунке. В левой части расположены рисунка классы Xt. В правой части --- собственно классы X Motif.

Иерархия классов Xm (X Motif). (сравните с иерархией классов Xt.)

Класс XmGadget.

При создании экземпляров обычных классов объектов Motif (widget) порождается и соответствующее окно. Если программа использует много widget, то это приводит к значительному замедлению работы приложения. Время тратится и на создание окон, и на дальнейшую работу с ними. Но легко видеть, что наличие для каждого объекта отдельного окна совсем необязательно. Метки (label, кнопки, да и многие другие widget с успехом могли бы использовать для рисования окна своих родительских объектов. Нет окна -- не надо обращаться лишний раз к серверу, растёт производительность и не тратится дополнительная память.

Проводя именно эту идею в жизнь, разработчики Motif продублировали некоторые классы объектов, создав две версии -- с окном и без окна. Версии объектов, не имеющие окон, ведут свою иерархию от абстрактного класса -- XmGadget, и обобщающее название у них такое же. Этот специальный класс объектов наследует свои характеристики от класса RectObj, который, в свою очередь, есть абстрактный класс, заключающий в себе базовые механизмы управления геометрией объектов.

Кроме того, что gadgets не имеют собственных окон, на них накладываются и другие ограничения. Так, для них нельзя определить обработчики событий (event handler), таблицы трансляции(*). Кроме того, gadget не могут иметь объектов-потомков. В остальном функциональность gadget и соответствующих widget одинакова, поэтому описывать их отдельно мы не будем, только перечислим.

Класс XmGadget содержит подклассы:

XmArrowButtonGadget.
XmLabelGadget.
XmPushButtonGadget.
XmToggleButtonGadget.
XmCascadeButtonGadget.

XmSeparatorGadget.

Класс XmPrimitive.

Этот абстрактный класс содержит:

XmArrowButton.
Экземпляр класса представляет собой кнопку, на которой нарисована направленная стрелка. На кнопку можно нажать с помощью мыши или клавиатуры. Граница управляющего элемента может иметь тень, она используется для отображения различных состояний, в которых может быть объект: свободном (``отжатом'') и нажатом.
XmLabel.
Представители этого класса (метки) -- одни из простейших объектов Motif. Метки предназначены для отображения информации: текста или рисунков (битовых (пиксельных) карт).
XmPushButton.
Представители этого класса суть прямоугольные нажимаемые кнопки, в которых может быть нарисована строка текста.

Если объект выбирается, например, нажатием левой кнопки мыши, когда её курсор находится на объекте, то цвет границы widget меняется, что создаёт эффект нажатия. После освобождения кнопки, цвет границы восстанавливается. Нажать на такой widget можно и с клавиатуры -- для этого надо передать объекту фокус ввода и нажать на клавишу ``пробел'' (обычно).

XmDrawnButton.
Объекты данного класса аналогичны нажимаемым кнопкам с той лишь разницей, что в них рисуется не текст, а произвольный рисунок (карта пикселов).
XmToggleButton.
Объекты данного класса представляют собой маленькую кнопку, рядом с которой, как правило, располагается поясняющий текст. Кнопка может пребывать в двух состояниях: включено и выключено (т.е. это переключатель). Они отмечаются изменением внешнего вида управляющего элемента.

Представитель данного класса служит для создания так называемых ``отмечаемых кнопок'' (check button), которые мудрее было бы называть ``галочками'', и ``радио-кнопок'' (radio button) -- многопозиционных переключателей. Первые служат для задания логических параметров, т.е. имеющих два значения. Вторые служат аналогичной цели, но множество значений в данном случае конечно и содержит более двух элементов. При этом форма графического представления объекта типа XmToggleButton зависит от того, используется ли он как ``галочка'' или ``радио'' кнопка.

Как правило, widget класса XmToggleButton объединяются в конструкции, которые называются, соответственно, блок отмечаемых кнопок (check box) и блок радио-кнопок (radio box). Эти блоки, в свою очередь, представляют модификации объектов класса XmRowColumn, описанного ниже.

XmCascadeButton.
Объекты данного класса представляют собой нажимаемые кнопки и используются при создании меню. При нажатии на объект появляется подменю следующего уровня.

XmList.
Представители данного класса -- это одни из наиболее интересных объектов Motif. Они предназначены для показа списка строк и дают пользователю возможность произвести различные действия с элементами списка. Пользователь может выбрать одну или несколько строк, представленных в этом объекте, при этом они подсвечиваются. Кроме того, если список имеет фокус ввода, то один из его элементов выделяется пунктирной рамкой. Эту рамку называют курсором списка.
XmScrollBar.
Объекты данного класса -- полосы прокрутки (скролл-бары), как правило, используются в совокупности с другими объектами, такими, как список (XmList), текст (XmText) и другими. Скролл-бар предназначен для прокрутки области, если представленная в ней информация (список, текст, рисунок и т.п.) не может быть показана в окне полностью. Объекты класса XmScrollBar представляют собой полосу (горизонтальную или вертикальную), по краям которой находятся кнопки со стрелками. Нажатие на какую-либо из них приводит к прокрутке в направлении указанном стрелкой. На самой полоске скролл-бара располагается ползунок (бегунок) -- выделенный цветом прямоугольник. Если ``зацепить'' его мышью и ``тащить'', то это, как правило, также приводит к прокрутке области.
XmSeparator.
Объекты данного класса -- разделители -- используются, как правило, в целях улучшения внешнего вида окон приложения. Такой widget представляет собой вертикальную или горизонтальную полоску (линию), разделяющую группы объектов. Например, разделители могут применяться в меню для отделения одних команд от других, в диалогах -- обособляя группу нажимаемых кнопок от остальных элементов и т.д.
XmText.
Объекты данного класса позволяют отобразить одну или несколько строк текста. Если строки не помещаются в окне, то изображение можно прокручивать влево-вправо и вверх-вниз. Текст можно редактировать -- режим редактирования может изменяться соответствующей установкой ресурсов объектов.

Motif предоставляет ряд удобных процедур, позволяющих производить с widget этого класса самые разнообразные операции: получить и модифицировать данные, скопировать выделенную часть данных в системный буфер (clipboard) и прочая.

XmTextField.
Объекты данного класса позволяют просматривать и редактировать одну строку текста.

Класс XmManager.

Данный класс является абстрактным, т.е. не используется для порождения объектов. Он определяет базовые параметры, необходимые для построения классов widget, которые могут управлять другими объектами. Эти ресурсы нужны для правильного отображения дочерних widget и управления получением ими фокуса ввода.

Класс XmManager содержит:

XmBulletinBoard.
Объекты данного класса могут иметь подобъекты, которые размещаются в окне произвольным образом. Координаты окон дочерних widget измеряются в системе координат, начало которой находится в левом верхнем углу окна объекта класса XmBulletinBoard.

При изменении размера объекта, например, с помощью мыши, начальное расположение подобъектов либо не меняется, либо они перемещаются так, чтобы избежать взаимопересечения. Если окно widget становится меньше, то части подобъектов могут стать невидимыми.

Класс XmBulletinBoard содержит:

XmForm.
Отличительная особенность объектов данного класса (форм) -- возможность управления расположением своих подобъектов за счёт задания связей как между самой формой и дочерней widget, так и между самими подобъектами.

Для каждой дочерней widget можно указать, к чему привязан её левый, правый, нижний или верхний край. Так, если левый и правый края подобъекта привязать к правому краю формы, то расстояние от них до этого края всегда будет оставаться одним и тем же. Если размер формы уменьшится, то подобъект сдвинется влево, а если размер увеличится, то -- вправо. Можно привязать один подобъект к другому. Тогда изменение положения подобъекта, к которому привязан widget, приведёт к перемещению привязанного объекта так, чтобы расстояние между ними сохранилось.

При изменении размеров формы все связи между её подобъектами сохраняются.

XmSelectionBox.
Объекты данного класса (``блоки выбора'') представляют пример составной widget и включают в себя прокручиваемый список, где пользователь может выбрать нужный ему элемент, а также текстовое поле (объект XmTextField), где отображается выбранный в списке пункт. Пользователь может редактировать сделанный выбор. Список и текстовое поле могут иметь поясняющие надписи, задаваемые с помощью соответствующих widget класса XmLabel. Объект класса XmSelectionBox включает также и три нажимаемые кнопки (объекты XmPushButton). По умолчанию на них нанесены надписи ``Ok'', ``Cancel'' и ``Help''. И, наконец, есть ещё один элемент -- нажимаемая кнопка, имеющая по умолчанию название ``Apply''. Первоначально данный подобъект создаётся, но не включается в список управляемых (managed) widget.

Используя блок выбора, пользователь может указать нужную ему подстроку в списке или ввести её в текстовое поле. Установки подтверждаются нажатием кнопки ``Ok''.

Класс XmSelectionBox включает:

XmCommand.
Объекты данного класса дают пользователю возможность сделать выбор нужной команды, используя список уже введённых команд, или введя команду в текстовое поле, специально для этого предусмотренное в widget.
XmFileSelection.
Объекты данного класса позволяют просматривать текущее содержимое разных директорий и выбрать тот или иной файл.

Объекты данного класса содержат элементы:

  • 2 текстовых поля: ``Filter'' и ``Selection'' (объекты класса XmNextField);
  • 2 списка: ``Directories'' и ``Files'' (объекты класса XmList);
  • 4 нажимаемые кнопки: ``Ok'', ``Filter'', ``Cancel'' и ``Help'' (объекты класса XmPushButton);
Текстовое поле ``Filter'' задаёт маску (шаблон), для отбора из всего множества файлов некоторого подмножества, удовлетворяющих задаваемому в этом поле условию -- подходящих под шаблон -- именно это подмножество и показывается в списке ``Files''. В списке ``Directories'' отображаются поддиректории текущего каталога. В текстовом поле ``Selection'' отображается файл (его название), выбранный в списке ``Files'', и в это же текстовое поле пользователь может ввести и полное имя нужного ему файла вручную. Четыре нажимаемые кнопки используются для осуществления различных действий:
Ok
-- выбор заданного файла;
Filter
-- обновление списка файлов, отображаемого в текстовом поле ``Files'', в соответствии с текущей маской;
Cancel
-- закрывает окно widget, выбор файла не происходит;
Help
-- зов о помощи.

XmMessageBox.
Объекты данного класса предназначены для выдачи пользователю сообщений, возникающих в процесе работы программы. Эта widget является составной. Она имеет область, в которой отображается строка текста (сообщение) и специальная пиктограмма, характеризующая тип сообщения. Кроме этого, в объекте есть три нажимаемых кнопки. По умолчанию на них нанесены надписи: ``Ok'', ``Cancel'' и ``Help''.

XmDrawingArea.
Объекты данного класса предоставляют программе окно для рисования и отображения информации. В самом классе не предусмотрены параметры, которые можно было бы непосредственно применять для вывода графики. Но имеющиеся в этом классе списки callback-процедур позволяют получать извещения о необходимости перерисовки окна widget и о получении фокуса ввода.
XmFrame.
Объекты данного класса используются для того, чтобы выделить некоторые объекты среди остальных, обведя их рамкой. Особенность widget данного класса состоит в том, что они могут иметь и управлять только одним подобъектом.
XmPanedWindow.
Объекты данного класса могут объединять разнородные widget. Подобъекты отделяются друг от друга, и между ними помещается специальный элемент, который имеет название sash. Он выглядит, как маленький квадрат, и используется для изменения размеров дочерних widget. Так, если объект класса XmPanedWindow имеет два подобъекта, то можно проделать следующее: ``зацепить'' sash мышкой и ``оттащить'' его в нужную сторону (вниз-вверх или влево-вправо) -- при этом продольный размер (размер вдоль направления, в котором был ``оттащен'' sash) одного дочернего объекта увеличится ``за счёт'' другого (размер другого уменьшится), поперечные размеры обоих подобъектов сохранятся. ``Поперечный'' размер объекта класса XmPanedWindow определяется максимальным аналогичным размером его подобъектов.
XmRowColumn.
Объекты данного класса могут объединять разнородные widget. Подобъекты располагаются в определённом порядке -- в виде матрицы. Widget класса XmRowColumn являются основой для создания следующих объектов:
check box
-- ``блок отмечаемых кнопок'' (т.е. объектов класса XmToggleButton или класса XmToggleButtonGadget); среди имеющихся в ``блоке'' кнопок одновременно может быть выбрано (``включено'') несколько;
radio box
-- ``блок радио-кнопок'' (т.е. объектов XmToggleButton или XmToggleButtonGadget); среди имеющихся в ``блоке'' кнопок одновременно может быть выбрана (``включена'') только одна;
pulldown menu
-- ``выпадающее меню'' -- окно подменю, которое появляется после выбора кнопки в меню верхнего уровня (menu bar); пункты меню располагаются вертикально;
option menu
-- кнопка с ассоциированным меню; при нажатии на кнопку возникает окно меню, из которого выбирается одно значение параметра; пункты меню располагаются вертикально;
popup menu
-- ``всплывающее меню'', которое, как правило, вызывается нажатием на третью кнопку мышки; окно меню появляется в том месте, где находится её курсор; пункты меню располагаются вертикально;
menu bar
-- меню верхнего уровня, содержащее ряд кнопок (объектов класса XmCascadeButton или XmCascadeButtonGadget), которые используются для вызова различных подменю (pulldown menu); пункты меню располагаются горизонтально.

XmScale.
Объект данного класса представляет собой прямоугольную область, содержащую фиксирующий бегунок (slider), используя который пользователь может выбрать значение параметра, ассоциированного с объектом, из указанного диапазона.
XmScrolledWindow.
Объект данногого класса предоставляет возможность выводить и просматривать некоторую информацию (текст, рисунок, список). Такого рода widget, как правило, содержит подобъект, в котором расположены данные, предназначенные для просмотра (это может быть объект класса XmText, XmDrawingArea и др.) Для более удобного просмотра данных могут использоваться горизонтальные и вертикальные полосы прокрутки.

Данный класс содержит подкласс

XmMainWindow.
Объекты данного класса представляют отдельную компоненту интерфейса, состоящую, как правило, из следующих частей:
  • меню верхнего уровня,
  • окно команд,
  • ``рабочая'' область,
  • окно сообщений,
  • и два скролл-бара (горизонтальный и вертикальный).
Подобъекты могут быть разделены сепараторами.

Классы XmMenuShell и XmDialogShell.

Motif предусматривает класс объектов XmMenuShell для создания различных меню. Этот класс наследуется от класса OverrideShell (из Xt).

Как уже упоминалось при описании Xt, класс TransientShell используется для создания объектов программы, которые, с одной стороны, непосредственно контактируют с менеджером окон, а с другой стороны, имеют особенности, отличающие их от обычных окон верхнего уровня. Основной из этих особенностей является та, что widget класса TransientShell нельзя минимизировать. Но они убираются с экрана, если в пиктограмму превращается родитель. Такого рода widget, как правило, используются для создания вспомогательных окон программы.

Motif использует указанные свойства класса TransientShell и развивает их в производном классе XmDialogShell. Последний служит в качестве shell-объекта диалога.

Структуру диалогового окна в Motif можно представить следующим образом:

Библиотека имеет набор процедур, облегчающих создание описанной конструкции.

Диалоги

Как было указано, конструкция диалогового окна в Motif следующая: сначала идёт объект класса XmDialogShell, в который потом включается widget одного из подкласов класса XmManager, этот объект используется для размещения разнообразных объектов.

В библиотеке предусматриваются специальные процедуры для создания диалогов. Они различаются по типу widget, являющейся дочерней по отношению к объекту класса XmDialogShell.

Вывод текста

В библиотеке достаточно большое количество widget, которые используются для отображения текстовой информации. Это XmLabel со подклассы, XmText и др. Для задания возможных шрифтов, которые можно применять при рисовании строк, используется ресурс XmNfontlist. Он имеет тип XmFontlist. Значение его -- множество пар ``шрифт''/``тэг шрифта''.

Тэги (метки) предназначены для того, чтобы сделать программы независимыми от конкретных шрифтов, задаваемых пользователем. Делается это следующим образом: приложение создаётся так, что во всех функциях, работающих со строками текста, присутствуют не сами шрифты, а их метки. Когда задача скомпилирована и стартует, определяется соответствие между тэгами и конкретными шрифтами. Последние и используются для рисования.

Motif имеет средства для работы не только со строками текстов, выводимыми единым шрифтом, но и позволяет работать с такими объектами, как ``составные строки'' -- т.е. строками текста, в которых используется много шрифтов. Имеется набор средств для создания таких строк, работы с ними и преобразования их к обычным, ``одношрифтовым'', строкам.

Работа с изображениями

Сам Motif работает с изображениями, представляя их во внутреннем формате, представляющем собой простейшую битовую карту (bitmap), которая задаётся с помощью структуры XImage.

Управление фокусом ввода

Motif поддерживает две модели передачи фокуса ввода. Первая из них неявная (pointer): фокус отдаётся той widget, в которую перемещается курсор мыши. Вторая модель -- явная (explicit): для передачи фокуса надо поместить курсор мыши в окно widget и нажать на левую кнопку мыши. Когда widget или gadget получают фокус ввода, их граница подсвечивается.

Кроме этих моделей передачи и получения фокуса ввода существует ещё механизм передачи фокуса ввода от одной widget к другой. Объекты могут быть объединены в группы -- это может делаться заданием необходимых значений соответствующих ресурсов, а может быть отдано на откуп системе. В последнем случае Motif автоматически связывает widget, используя встроенные правила. Так, например, объект класса XmMessageBox содержит три группы: одна -- ``основной'' объект диалога (класс XmForm), вторая -- ``метка'', в которой представлено сообщение пользователю, третья -- нажимаемые кнопки.

Фокус ввода передаётся как от одного объекта (в группе) к другому, так и от группы к группе.

Передача фокуса внутри группы производится с помощью клавиш стрелок, а от группы к группе -- с помощью клавиши табуляции (поэтому сами группы называют Tab-группами). При передачи фокуса группе, фокус ввода в ней передаётся первому объекту, который может получить фокус (объекту можно запретить получать фокус, установкой подобающего значения соответствующего ресурса). Порядок передачи фокуса ввода внутри группы совпадает с порядком, в котором созданы её widget. При этом, обычно, комбинация клавиш <Shift-Tab> перемещает фокус в противоположном направлении.

Motif предоставляет также ряд процедур, с помощью которых можно управлять фокусом ввода.

Пример окна X-приложения, использующего Motif.


дальше выше обратно Содержание
Следующий пункт: Lesstif Надпункт: Надстройки над Xt Предыдущий пункт: Athena

WebMaster at Bolizm
Sat Oct 5 20:29:45 MSD 1996
...трансляции --- Относится к акселераторам, всколзь упомянутым выше.