QNX.ORG.RU

Разработка => Программирование под QNX => Тема начата: Дмитрий от Июля 26, 2017, 02:33:19 pm



Название: Обработка события Ph_EV_KEY в AppBuilder
Отправлено: Дмитрий от Июля 26, 2017, 02:33:19 pm
Здравствуйте!
Занялся переносом кода с QNX4 на QNX6 и столкнулся со следующим эффектом:
При задании в свойствах окна обработки события RAW EVENT типа Ph_EV_KEY и назначения ей функции,
при опытном запуске выяснилось, что заданная функция KeyJAB.c вызывается 2 раза подряд при нажатии любой клавиши,
в связи с чем на экране в виджете PtLabel введенный с клавиатуры символ дублируется.
Никто не сталкивался с данной ситуацией?
P.S может это дребезг, но тогда странно что всегда 2 раза.
Кстати, окно вызывается поверх другого окна.
Спасибо!


Название: Re: Обработка события Ph_EV_KEY в AppBuilder
Отправлено: A_O от Июля 26, 2017, 03:58:37 pm
Функция вызывается при нажатии и при отпускании клавиши. Нужно проверять соответствующие флаги. Странно, что проблема возникла при портировании из qnx4 - там дело обстоит точно так же.


Название: Re: Обработка события Ph_EV_KEY в AppBuilder
Отправлено: Дмитрий от Июля 26, 2017, 06:44:02 pm
Спасибо!
Почему я сам не догадался, на внимательнее читать help)


Название: Re: Обработка события Ph_EV_KEY в AppBuilder
Отправлено: da-nie от Июля 26, 2017, 10:11:40 pm
Я делал так. (cKeyboard - абстрактная клавиатура).

Код:
#include "ckbrd.h"

extern CKeyboard cKeyboard;

int OnActivate_Raw(PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo )
{
 if (cbinfo->event->type==Ph_EV_KEY)
 {
  PhKeyEvent_t *kev=(PhKeyEvent_t *)PhGetData(cbinfo->event);
  long scan=kev->key_scan;
  if (kev->key_flags&Pk_KF_Scan_Valid)
  {
   if (kev->key_flags&Pk_KF_Key_Down) cKeyboard.SetKeyState(scan,true);
                                else  cKeyboard.SetKeyState(scan&0x7f,false);
  }
 }
 return(Pt_CONTINUE);
}