3.2.5.1. Процедуры обратного вызова (callback).

    С каждым 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( ).