logo search
Литература_1 / photon_old

Добавление ответных реакций

Приложение регистрирует ответные реакции, манипулируя ресурсами ответной реакции виджета. Для этих ресурсов в классах виджетов Photon'а используется соглашение по именованию: они все начинаются с Pt_CB_.

Ответные реакции могут быть добавлены в список ответных реакций, хранимых для этих ресурсов, использованием функции PtAddCallbacks() для добавления в список нескольких функций ответных реакций или функции PtAddCallback() для добавления только одной. В любом случае первыми двумя аргументами функции являются виджет и имя ресурса ответной реакции, которая добавляется. Остальные аргументы зависят от того, какая функция используется.

В функции PtAddCallbacks() третьим аргументом является массив записей ответных реакций. Каждая запись содержит указатель на функцию ответной реакции и указатель на данные присоединённого клиента, которые будут передаваться функции ответной реакции при её вызове. Каждая из этих записей ответных реакций скопирована во внутренний список ответных реакций виджета.

Например, мы можем захотеть, чтобы, когда пользователь выбрал кнопку (т.е. нажал её), приложение выполнило некое действие. Класс PtButton виджетов предоставляет ресурс ответной реакции Pt_CB_ACTIVATE для уведомления приложения, когда кнопка нажата. Чтобы создать виджет и присоединить к этому ресурсу ответной реакции функцию ответной реакции, мы используем код такого вида:

{

PtWidget_t *button;

int push_button_cb( PtWidget_t *, void *, PtCallbackInfo_t *);

PtCallback_t callbacks[] = { {push_button_cb, NULL} };

...

button = PtCreateWidget(PtButton, window, 0, NULL);

PtAddCallbacks(button, Pt_CB_ACTIVATE, callbacks, 1);

}

где push_button_cb – имя функции приложения, которая должна вызываться, когда пользователь нажимает кнопку. Для определения списка ответных реакций используется структура PtCallback_t; более подробно см. "Справочник виджетов Photon'а".

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

{

PtWidget_t *button;

int push_button_cb( PtWidget_t *, void *, PtCallbackInfo_t *);

button = PtCreateWidget(PtButton, window, 0, NULL);

PtAddCallback(button, Pt_CB_ACTIVATE, push_button_cb, NULL);

}

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

{

PtArg_t arg[5];

int push_button_cb( PtWidget_t *, void *, PtCallbackInfo_t *);

PtCallback_t callbacks[] = { {push_button_cb, NULL} };

...

PtSetArg(&args[0], Pt_CB_ACTIVATE, callbacks, 1);

PtCreateWidget(PtButton, window, 1, arg);

}

Каждый из этих методов имеет свои достоинства. Использование PtAddCallback(), конечно, простое. Использование функции PtAddCallbacks() более эффективно, когда имеется несколько ответных реакций. Использование функции PtSetArg() и передача результата в PtCreateWidget() позволяет автоматически осуществлять создание виджета и прикрепить список ответных реакций.