Пакет Xt представляет собой базу для создания управляющих элементов -- widget (заготовок). В смысле Xt widget -- это просто структура данных, поля которой включают идентификатор самого элемента, идентификатор его окна, если таковое имеется, и многое другое. Атрибуты такого объекта называются ресурсами. Ресурсами widget могут быть, например, цвет его окна, цвет границы окна, шрифт выводимого текста и т.д.
Каждый объект принадлежит к одному из предопределённых классов (widget class). Класс понимается в привычном для объектно-ориентированного программирования смысле, т.е.: класс можно рассматривать как множество экземпляров (объектов), имеющих одинаковые характеристики. Классы Xt образуют иерархию.
Во время работы программа создаёт сами объекты (экземпляры классов - widget). Они образуют совокупности, каждая из которых также представляет некоторую иерархию. Каждая такая иерархия называется деревом объектов (widget tree). Корнем дерева обязательно является widget, принадлежащий к одному из подклассов специального класса -- Shell. Если среди двух widget A и B дерева объектов первый объект ближе к корню, чем второй, то A является родительским объектом (``родителем'') для B, а B -- подобъектом (или ``дочерним'' объектом (потомком)) для A. Таким образом, shell-объект является родительской widget для всех остальных widget данного дерева объектов. Именно он осуществляет взаимодействие программы и менеджера окон.
Описанная иерархия widget соответствует взаимосвязи их окон, что является свойством X Window. Кроме этого, на объекты накладывается и другая иерархия. Дело в том, что во время работы одни объекты могут управлять другими. Например, если некий объект имеет подобъекты, то при измененим геометрии он может автоматически перестроить геометрии своих потомков. Чтобы это могло осуществиться, между widget устанавливается связь -- связь ``по управлению''. Каждый объект может иметь один или несколько ``управляемых'' им подобъектов.
Для взаимодействия программы, использующей Xt, с widget и X Window предусмотрены три механизма.
Программы, работающие в X, должны выполнить ряд стандартных действий, как то: установить связь с сервером, задать необходимые свойства для менеджера окон, и ещё множество других. Если используется Xt, то всё это делается одной процедурой -- XtInitialize(). Она инициализирует сам пакет, менеджер ресурсов (resource manager) X Window, и выполняет другие необходимые операции. Обращение к XtInitialize() (или XtAppInitialize()) должно предшествовать всем другим вызовам процедур Xt. XtInitialize() возвращает идентификатор shell-widget, которая может использоваться как корень дерева объектов программы. Как правило, имя класса программы совпадает с именем самой программы, только начинается с заглавной буквы. Менеджер ресурсов использует имя и класс программы для поиска её параметров в базе данных ресурсов.
Каждая программа может задать в командной строке некоторые параметры. В Xt определены ``стандартные'' параметры, которые могут быть переданы при запуске программы. Кроме этого, в командной строке могут присутствовать и нестандартные параметры, свойственные только данному приложению. XtInitialize() сканирует командную строку и размещает соответствующие значения в базе данных.
При инициализации создаётся также и контекст программы -- структура, которая хранит всю информацию о приложении. Контекст призван оградить программу от влияния различных миодификаций в операционной системе. XtInitialize() создаёт некоторый стандартный контекст (default context), но, тем не менее, начиная с четвёртой версии X, рекомендуется создавать для каждого отдельного экземпляра программы отдельный ``личный'' контекст, для чего в терминах Xt следует использовать вызов процедуры XtAppInitialize() (вместо XtInitialize()). Заметим здесь, что приложение в Xt может иметь не одно, как обычно, а несколько объектов ``верхнего уровня''.
Следующим после инициализации является этап создания управляющих элементов программы, описания взаимоотношений между ними, задание реакций на различные события (регистрация обработчиков событий и других подобных объектов). Это может делаться разными способами, традиционным же является использование, например, для создания объекта -- процедуры XtCreateWidget(), для передачи управления объектом его родителю -- процедуры XtManageChild(), для регистрации обработчиков событий для widget -- процедуры XtAddEventHandler(), и т.д. и т.п.
После того, как все объекты программы подготовлены к работе, их графические представления (например, соответствующие этим widget окна) показываются на экране процедурой XtRealizeWidget().
Следующий этап -- основной цикл -- цикл получения и отправки событий. Он реализуется вызовом процедуры XtMainLoop() (XtAppMainLoop()).
Программа, использующая только процедцры основной X библиотеки (Xlib), должна сама рассматривать каждое приходящее событие (получая его из очереди событий явным вызовом, например, XNextEvent() или XPeekEvent()) и соответствующим образом реагировать на него. Если окон у задачи несколько, то, прежде чем производить какие-то действия, необходимо определить, в каком из окон произошло событие, и на каком уровне иерархии будет происходить обработка этого события (будет ли обрабатывать это событие данный объект или его родитель?). Всё это достаточно утомительно.
Xt берёт всю рутинную работу на себя. XtMainLoop() получает очередное событие и определяет окно, которому оно предназначено. По окну находится соответствующий widget. Для последнего определяются event handler, action-процедура или callback, зарегистрированные для реакции на произошедшее событие. Если таковые есть, они вызываются. Описанный выше механизм называется рассылкой событий.
XtMainLoop() (XtAppMainLoop()) автоматически завершает программу по требованию менеджера окон.