Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Литература / photon_old.doc
Скачиваний:
40
Добавлен:
02.04.2015
Размер:
7.88 Mб
Скачать
          1. Неисключительное событие

Для неисключительного события выполните следующее:

  • Установите идентификатор генерирующего региона (т.е. event–>emitter.rid) равным значению идентификатора целевого региона – это приведёт к тому, что событие будет сгенерировано автоматически из этого региона.

  • установите флаг Ph_EVENT_INCLUSIVE в члене flags события – в результате менеджер Photon'а сгенерирует это событие в генерирующий регион перед тем, как запускать его в пространство событий.

Если Вы не хотите, чтобы неисключительно нацеленное событие продолжило прохождение через пространство событий, Вы должны сделать генерирующий регион непрозрачным для этого типа событий либо использовать вместо этого направленное событие.

          1. Направленное событие

Для направленного события выполните следующее:

  • Установите идентификатор генерирующего региона (т.е. event–>emitter.rid) равным значению идентификатора региона Вашего приложения.

  • Установите идентификатор региона-накопителя (т.е. event–>collector.rid) равным значению идентификатора целевого региона.

  • Установите флаг Ph_EVENT_DIRECT в члене flag события – это приведёт к тому. что менеджер Photon'а сгенерирует событие непосредственно из генерирующего региона в регион-накопитель.

      1. Нацеливание на определённые виджеты

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

  • событие доставлено в надлежащее окно

  • виджет ещё имеет фокус – перед Вашим событиемв очередь могли поступить и другие события.

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

int PtSendEventToWidget(PtWidget_t *widget,

PhEvent_t *event);

      1. События, генерируемые клавиатурными клавишами

Иногда Вам может понадобиться в Вашем приложении эмулировать нажатие клавиши. В зависимости от того, чего именно Вы желаете достичь, Вы можете выбирать из нескольких способов генерирования событий клавиатуры:

  • Генерировать событие Ph_EVENT_KEY из региона устройств:

event–>emitter.rid = Ph_DEV_RID;

Набор прямоугольников должен состоять из одного пикселя – если Вы не используете менеджер окон, или, если Photon'овский менеджер окон установлен на использование фокуса курсора, позиция этого пикселя определит, какое окно откликнется на событие.

  • Если Вы знаете регион, которому Вы хотите отослать событие, сгенерируйте событие Ph_EV_KEY непосредственно на этот регион:

event –>collector.rid = rid;

event –>flags |= Ph_EVENT_DIRECT;

Вот пример:

static void send_key( long key ) {

struct {

PhEvent_t event;

PhRect_t rect;

PhKeyEvent_t pevent;

} new_event;

PhEvent_t event;

PhKeyEvent_t key_event;

PhRect_t rect;

rect.ul.x = rect.ul.y = 0;

rect.lr.x = rect.lr.y = 0;

memset( &event, 0, sizeof(event));

memset( &key_event, 0, sizeof(key_event) );

event.type = Ph_EV_KEY;

event.emitter.rid = Ph_DEV_RID;

event.num_rects = 1;

event.data_len = sizeof(key_event);

event.input_group = 1;

key_event.key_cap = key;

key_event.key_sym = key;

if ( isascii( key ) && isupper( key ) ) {

key_event.key_mods = Pk_KM_Shift;

}

/* Генерирование нажатия клавиши */

key_event.key_flags = Pk_KF_Sym_Valid | Pk_KF_Cap_Valid | Pk_KF_Key_Down;

PhEmit( &event, &rect, &key_event );

/* Генерирование отпускания клавиши */

key_event.key_flags &= ~(Pk_KF_Key_Down | Pk_KF_Sym_Valid) ;

PhEmit( &event ,&rect, &key_event );

return;

}

Соседние файлы в папке Литература