Чтобы облегчить программирование в системе X window, было создано несколько
пакетов. Стандартом де-факто в настоящее время является библиотека X Toolkit Intrinsics
(Xt), которая входит в комплект стандартной поставки системы. Xt упрощает
инициализацию программ и создание окон. Кроме того, библиотека содержит средства для
создания объектов (управляющих элементов), используемых программами при общении с
пользователями. В терминах Xt управляющий элемент называется widget.
В настоящий момент на основе пакета реализованы различные наборы (множества) управляющих
элементов (объектов), например, Athena, OSF/Motif, Open Look. Эти наборы в
совокупности с самой Xt применяются в качестве удобного инструмента для создания
интерфейсов. Они берут на себя рутинную работу, которую при написании собственного
приложения с использованием только процедур базовой библиотеки X Window
программисту пришлось бы выполнить вручную.
Xt предоставляет набор средств для создания объектов, которые используются
программами для общения с пользователем, а в общем случае и с остальным внешним миром.
Каждый создаваемый программой widget есть представитель того или иного класса.
Xt и пакеты, на нём основывающиеся, такие как OSF/Motif, Athena, Tk/tcl, Open Look,
etc., имеют большое количество таких классов. Создание новых widget, не
предусмотренных в стандартных библиотеках, требует и создания (определения) соответствующего
класса, что, обычно, является трудоёмкой задачей.
Каждый класс имеет ряд фиксированных характеристик, являющихся общими для всех его
экземпляров (например, список сallback -процедур). Значения этих характеристик у самих
объектов могут различаться.
Все классы Xt образуют иерархию. Если класс B ближе к вершине иерархии, чем класс D,
то B называется базовым для D, а D называется производным классом (или подклассом) для
B.
Подклассы наследуют характеристики всех своих базовых классов. Это означает, экземпляр класса
имеет характеристики не только своего класса, но и атрибуты всех базовых классов.
В программах каждый класс идентифицируется переменной, которая указывает на
соответствующую структуру данных. Эту переменную называют указателем на класс. Данные этой
структуры заполняются при инициализации Xt.
Основные классы widget:
Object. Абстрактный класс (класс, не порождающий собственного объекта), который используется
в качестве корня дерева всех объектов. Он содержит единственный подкласс:
RectObj. Абстрактный класс, который используется для определения некоторых общих характеристик, необходимых для функционирования различных типов объектов (например, для объектов, не имеющих окна). Он содержит подкласс: | |||||||
Core. Корень дерева классов widget, имеющих окна. Этот класс определяет характеристики, общие для всех объектов, например такие, как размер окна widget и его положение на экране. Содержит подкласс: | |||||||
Composite. Widget, относящиеся к данному классу,
могут быть родительскими по отношению к другим объектам. Экземпляры класса
Composite определяют следующие особенности поведения своих подобъектов:
| |||||||
Constraint. Это класс представляет собой дальнейшее
расширение базового класса. Его экземпляры имеют дополнительные возможности для
управления размером и местоположением своих потомков. Например, подобъекты могут
размещаться в специальном порядке: в ряд, в столбец и т.д. Shell. Это специальный класс, предназначенный для взаимодействия с менеджером окон. widget из этого класса может иметь только одного потомка. Класс Shell содержит подклассы: | |||||||
OverrideShell. Это важный подкласс класса
Shell. Для окна widget данного класса атрибут override_redirect
устанавливается в значение True, т.е. менеджер окон его не контролирует. Как
правило, окна объектов этого класса не имеют аксессуаров, добавляемых менеджером окон
(заголовок, рамка, стандартные кнопочки), и используются в основном для создания меню
различного типа. WMShell. Это специальный подкласс класса Shell, содержащий дополнительные поля, необходимые для взаимодействия с менеджером окон. Содержит: | |||||||
VendorShell. Этот класс предназначен для того, чтобы дать возможность взаимодействия со специальными менеджерами окон. Этот класс содержит подклассы: | |||||||
TopLevelShell. Widget данного класса, как правило, используются как shell -объекты дерева объектов программы. Он содержит: | |||||||
ApplicationShell. Программа может иметь, как правило, только один экземпляр, принадлежащий классу ApplicationShell. | |||||||
TransientShell. Этот класс отличается от предыдущего только особенностями взаимодействия с менеджером окон. Окна widget данного класса не могут быть минимизированы (превращены в пиктограмму). Но если в пиктограмму превращается родитель объекта класса TransientShell, то окно widget убирается с экрана. Класс TransientShell используется для создания диалогов. |
В Xt предусмотрен механизм для работы с файлами (и вообще с внешними устройствами) в
асинхронном режиме. Приложение может зарегистрировать процедуру, которая будет вызываться
по мере готовности данных или при возникновении ошибок чтения/записи.
Xt предоставляет приложению возможность выполнять определённые действия через
заданные промежутки времени. Например, периодически отображать на экране текущее время в
заданном окне и т.п. Для таких целей используется специальный механизм Xt - таймер. Он
обеспечивает вызов через заданный интервал времени специальной функции, заданной
программой.
Xt предоставляет возможность выполнять какие-либо действия, когда очередь событий
пуста. Это реализуется через регистрацию специальной "рабочей" (work) процедуры, которую
Xt вызовет, если очередь событий опустеет. Такие функции обычно используются для
выполнения различных действий и вычислений в течение очень короткого времени.
Каждое приложение при необходимости может модифицировать обычный цикл получения и
рассылки (обработки) событий - Xt предусматривает целый набор процедур для работы с
очередью событий.
Xt имеет механизм, так называемых, акселераторов ( accelerator), который
позволяет вводить зависимости событий и действий. Акселераторы похожи на action -
процедуры с той разницей, что событие (или группа событий), происходящее в одном widget,
инициирует вызов соответствующей action -процедуры для другого объекта.
Xt поддерживает несколько способов работы с окнами widget. Так, программка,
используя процедурки, предоставляемые Xt, может показать окошко, установить для него
тот или иной режим работы, и закрыть окошко, когда оно становится ненужным. В основном эти
процедуры используются для создания pop-up меню и диалогов. Как правило, все
множества widget (например, OSF/Motif) имеют свои намного более удобные
процедуры для создания меню и диалогов.
Надстройки над Xt В настоящее время Xt строго стандартизован X консорциумом,
но стандартов более высокого уровня не существует. Популярностью пользуются:
Athena Widget Set ("множество widget") предоставляется X консорциумом в
комплекте стандартной поставки X. Athena была создана в ходе работы над
базовыми приложениями и утилитами в ходе реализации проекта "Афина" в MIT, результатом
которого и является система X Window.
Athena изначально имела "плоскую" графику - все кнопки, меню и прочие элементы
интерфейса не имели теней, т.е. были плоскими. Около года назад вышла AW3d - вариант
Athena Widgets, в котором это недостаток устранён.
Open Software Foundation Motif (OSF/Motif) представляет собой пакет, включающий
менеджер окон, набор утилит для выполнения различных вспомогательных операций, а также
библиотеку объектов, построенных на основе Toolkit Intrinsics.
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 и применяется для создания объектов,
которые могут иметь и управлять дочерними объектами.
XmPushButton. Представители этого класса суть
прямоугольные нажимаемые кнопки, в которых может быть нарисована строка
текста. Если объект выбирается, например, нажатием левой кнопки мыши, когда её курсор находится на объекте, то цвет границы widget меняется, что создаёт эффект нажатия. После освобождения кнопки, цвет границы восстанавливается. Нажать на такой widget можно и с клавиатуры - для этого надо передать объекту фокус ввода и нажать на клавишу "пробел" (обычно). XmDrawnButton. Объекты данного класса аналогичны нажимаемым кнопкам с той лишь разницей, что в них рисуется не текст, а произвольный рисунок (карта пикселей). XmToggleButton. Объекты данного класса представляют собой маленькую кнопку, рядом с которой, как правило, располагается поясняющий текст. Кнопка может пребывать в двух состояниях: включено и выключено (т.е. это переключатель). Они отмечаются изменением внешнего вида управляющего элемента. Представитель данного класса служит для создания так называемых "отмечаемых кнопок" ( check button), которые мудрее было бы называть "галочками", и "радио-кнопок" ( radio button) - многопозиционных переключателей. Первые служат для задания логических параметров, т.е. имеющих два значения. Вторые служат аналогичной цели, но множество значений в данном случае конечно и содержит более двух элементов. При этом форма графического представления объекта типа XmToggleButton зависит от того, используется ли он как "галочка" или "радио" кнопка. Как правило, widget класса XmToggleButton объединяются в конструкции, которые называются, соответственно, блок отмечаемых кнопок ( check box) и блок радио-кнопок ( radio box). Эти блоки, в свою очередь, представляют модификации объектов класса XmRowColumn, описанного ниже. XmCascadeButton. Объекты данного класса представляют собой нажимаемые кнопки и используются при создании меню. При нажатии на объект появляется подменю следующего уровня. |
XmForm. Отличительная особенность объектов данного
класса (форм) - возможность управления расположением своих подобъектов за счёт
задания связей как между самой формой и дочерней widget, так и между самими
подобъектами. Для каждой дочерней widget можно указать, к чему привязан её левый, правый, нижний или верхний край. Так, если левый и правый края подобъекта привязать к правому краю формы, то расстояние от них до этого края всегда будет оставаться одним и тем же. Если размер формы уменьшится, то подобъект сдвинется влево, а если размер увеличится, то - вправо. Можно привязать один подобъект к другому. Тогда изменение положения подобъекта, к которому привязан widget, приведёт к перемещению привязанного объекта так, чтобы расстояние между ними сохранилось. При изменении размеров формы все связи между её подобъектами сохраняются. XmSelectionBox. Объекты данного класса ("блоки выбора") представляют пример составной widget и включают в себя прокручиваемый список, где пользователь может выбрать нужный ему элемент, а также текстовое поле (объект XmTextField), где отображается выбранный в списке пункт. Пользователь может редактировать сделанный выбор. Список и текстовое поле могут иметь поясняющие надписи, задаваемые с помощью соответствующих widget класса XmLabel. Объект класса XmSelectionBox включает также и три нажимаемые кнопки (объекты XmPushButton). По умолчанию на них нанесены надписи "Ok", "Cancel" и "Help". И, наконец, есть ещё один элемент - нажимаемая кнопка, имеющая по умолчанию название "Apply". Первоначально данный подобъект создаётся, но не включается в список управляемых ( managed) widget. Используя блок выбора, пользователь может указать нужную ему подстроку в списке или ввести её в текстовое поле. Установки подтверждаются нажатием кнопки "Ok". Класс XmSelectionBox включает: | |||
XmCommand. Объекты данного класса дают
пользователю возможность сделать выбор нужной команды, используя список уже
введённых команд, или введя команду в текстовое поле, специально для этого
предусмотренное в widget. XmFileSelection. Объекты данного класса позволяют просматривать текущее содержимое разных директорий и выбрать тот или иной файл. Объекты данного класса содержат элементы:
| |||
Ok - выбор заданного файла; Filter - обновление списка файлов, отображаемого в текстовом поле "Files", в соответствии с текущей маской; Cancel - закрывает окно widget, выбор файла не происходит; Help - зов о помощи. | |||
XmMessageBox. Объекты данного класса предназначены для выдачи пользователю сообщений, возникающих в процессе работы программы. Этот widget является составным. Он имеет область, в которой отображается строка текста (сообщение) и специальная пиктограмма, характеризующая тип сообщения. Кроме этого, в объекте есть три нажимаемых кнопки. По умолчанию на них нанесены надписи: "Ok", "Cancel" и "Help". |
check box - "блок отмечаемых кнопок" (т.е. объектов
класса XmToggleButton или класса XmToggleButtonGadget); среди
имеющихся в "блоке" кнопок одновременно может быть выбрано ("включено")
несколько; radio box - "блок радио-кнопок" (т.е. объектов XmToggleButton или XmToggleButtonGadget); среди имеющихся в "блоке" кнопок одновременно может быть выбрана ("включена") только одна; pulldown menu - "выпадающее меню" - окно подменю, которое появляется после выбора кнопки в меню верхнего уровня ( menu bar); пункты меню располагаются вертикально; option menu - кнопка с ассоциированным меню; при нажатии на кнопку возникает окно меню, из которого выбирается одно значение параметра; пункты меню располагаются вертикально; popup menu - "всплывающее меню", которое, как правило, вызывается нажатием на третью кнопку мышки; окно меню появляется в том месте, где находится её курсор; пункты меню располагаются вертикально; menu bar - меню верхнего уровня, содержащее ряд кнопок (объектов класса XmCascadeButton или XmCascadeButtonGadget), которые используются для вызова различных подменю ( pulldown menu); пункты меню располагаются горизонтально. |
XmMainWindow. Объекты данного класса представляют
отдельную компоненту интерфейса, состоящую, как правило, из следующих частей:
|
Объект класса XmDialogShell |
---|
в |
Объект подкласса XmManager, например, XmBulletinBoard или XmForm |
в |
Разнообразные управляющие элементы: кнопки, поля ввода текста и т.д. |
Tcl - читается: [tikl] - расшифровывается: "tool command language" (инструментальный командный
язык). Состоит из двух частей: собственно языка и библиотеки.
Язык tcl имеет простой синтаксис, программировать на нём легко. В исходном своём виде tcl - это
интерпретатор. Позволяет создавать новые конструкции, как функции или программы, что
предоставляет умелому программисту мощный инструмент разработки не только конечных
приложений, но и своего собственного расширения языка tcl, создания и поддержки своего
собственного стиля.
Библиотека tcl предоставляет возможность использовать в прикладных программах
интерпретаторы языка tcl, а значит и включать в программы скрипты, написанные на командном
языке tcl. Библиотека содержит лексический анализатор языка tcl, функции, реализующие
встроенные команды tcl, позволяет пристраивать пользовательские подпрограммы (вызовы
функций) к командам tcl. Такая компоновка возможна и для C, и для C++.
Tk представляет собой Motif -совместимый инструментарий (toolkit) для разработки
графических пользовательских интерфейсов в среде X Window. В дополнение к
стандартному интерфейсу с C и C++, он включает интерфейс с tcl, предоставляя возможность
использовать средства Tk из среды интерпретатора команд tcl. Это означает, что помимо
стандартного программирования на C и C++, интерфейсные части приложения могут быть
реализованы в виде скриптов на языке tcl и эти интерфейсные части (диалоги, планировки экранов
и т.д.) можно править динамически, в ходе работы конечной программы, используя команды
tcl.
Оконная среда " wish" позволяет создавать приложения с графическими пользовательскими
интерфейсами, пользуясь только средствами языка tcl.
Для облегчения труда программистов, создающих графические пользовательские интерфейсы,
создан интерактивный построитель интерфейсов - вариант UIDS.
Этот "GUI builder", как и всё остальное, описанное в этом разделе, является бесплатным - всё это
можно свободно заполучить в Internet: