С каждым widget сопоставлен набор операций, которые над ним можно производить. Так, любой элемент может быть создан и уничтожен, "нажимаемая" кнопка (push button) может быть "нажата" с помощью мыши или клавиши "пробел" и т. д. Каждому из таких предопределенных действий соответствует ресурс объекта, значение которого - список процедур библиотеки Xt и самой программы, которые автоматически вызывактся, когда совершается предусмотренное действие. Эти процедуры и называют процедурами обратного вызова (callback-процедуры). Рассмотренные нами ресурсы widget имеют тип XtCallbackList.
Все widget имеют по крайней мере один список callback. Он соответствует операции уничтожения объекта и наследуется от класса Core. Имя ресурса XtNdestroyCallback.
Программа может добавлять и убирать процедуры в (из) список (списка) callback. Добавить функцию в список можно с помощью процедуры
XtAddCallback (Widget prWidget, String psCallbackName, XtCallbackProc pProcedure, XtPointer pUserData); |
Здесь prWidget задает объект, список которого модифицируется, psCallbackName есть имя списка, pProcedure добавляемая функция, pUserData - указывает на данные, передаваемые callback-процедуре при ее вызове.
Каждая процедура обратного вызова должна иметь прототип:
void CallbackProc (Widget prWidget, XtPointer pUserData, XtPointer pCallData); |
Здесь первый аргумент задает widget, в списке которого находится функция. Второй аргумент указывает на данные, передаваемые из программы в процедуру. Третий аргумент указывает на данные, подготовленные для callback самой Xt или пакетом, построенным на ее основе (например, OSF/Motif). Обычно это структура, содержащая дополнительную информацию о действии, приведшем к вызову функции.
Примеры использования callback-процедур для различных классов объектов приведены в главе 4.
Для модификации списка процедур обратного вызова можно также использовать функцию
void XtAddCallbacks (Widget prWidget, String psCallbackName, XtCallbackList pCallbacks); |
которая позволяет задавать несколько callback одновременно для одного и того же списка.
Здесь первый аргумент задает widget, чей список callback-процедур меняется. Его имя определяется вторым аргументом функции. Третий аргумент задает сами процедуры и передаваемые им параметры. Этот аргумента имеет специальный тип, определяемый следующим образом:
typedef struct { XtCallbackProc callback; /* Указатель на процедуру */ caddr_t client_data; /* Указатель на данные */ } XtCallbackRec, *XtCallbackList; |
Здесь первое поле задает callback-процедуру , а второе поле используется для передачи ей при вызове некоторых данных. При обращении к XtAddCallbacks( ) последний элемент массива pCallbacks должен быть равен NULL.
Удалить процедуру из списка callback можно с помощью функции XtRemoveCallback( ).