Страниц: [1]
  Печать  
Автор Тема: Почему проскакивает событие отпускания кнопки мыши?  (Прочитано 3085 раз)
Goofy
Full Member
***
Offline Offline

Сообщений: 122


Просмотр профиля
« : Июня 27, 2012, 02:22:12 pm »

Разрабатывается приложение, в котором двигаются векторные объекты по растру.

Левое нажатие мышью выбирает объект, движение с нажатой кнопкой двигает объект, опускание оставляет в покое - завершает команду.

Проблема в том, что после нажатия и начала перемещения от Photona проскакивают события отпускания клавиши, когда физически его не было. Причем повторяется это не только под VmWare, но и на ARM таргете.

Как это выглядит при докладах внутри
Код:
general_editor -> ProcessInput( x, y, b, bp, event_data -> click_count )
:


Left pressed
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Released
Left Released
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Moved
Left Released
Left Released


Первая пара Released как раз - "левая"

Код обработки событий по мыши:

Код:
int cursor_move_callback ( PtWidget_t *widget, void *data, PtCallbackInfo_t *info )
{

PhPointerEvent_t *event_data;
event_data =(PhPointerEvent_t *)PhGetData (info->event);

PhRect_t *r = PhGetRects ( info->event );

if ( ( r->ul.x > canvas_rect.lr.x ) || ( r->ul.y > canvas_rect.lr.y )
|| ( r->ul.x < canvas_rect.ul.x ) || ( r->ul.y < canvas_rect.ul.y ) )
return Pt_CONSUME;

int x=  r->ul.x - canvas_rect.ul.x;
int y=  r->ul.y - canvas_rect.ul.y;

ButtonPhase bp;
MButton b;

if ( info ->event->type & Ph_EV_BUT_PRESS ) {
bp = PRESSED;
} else if ( info ->event->type & Ph_EV_PTR_MOTION_BUTTON ) {
bp = HOLD;
} else if ( info ->event->type & Ph_EV_BUT_RELEASE ) {
bp = RELEASED;
}

if ( event_data -> buttons & Ph_BUTTON_SELECT ) {
b = LEFT;
} else if ( event_data -> buttons & Ph_BUTTON_ADJUST ) {
b = MIDDLE;
} else if ( event_data -> buttons & Ph_BUTTON_MENU ) {
b = RIGHT;
}

if ( general_editor -> ProcessInput( x, y, b, bp, event_data -> click_count ) )
PtDamageWidget ( ABW_MapWidget );


return Pt_PROCESS;
}

код привязки обработчика:

Код:
PtAddEventHandler( widget -> parent, Ph_EV_BUT_PRESS | Ph_EV_BUT_RELEASE | Ph_EV_PTR_MOTION_BUTTON, cursor_move_callback, NULL );

Вызов функции происходит в инициализации PtRaw, родитель - главное окно.

Есть ли варианты решения проблемы?
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #1 : Июня 27, 2012, 09:14:36 pm »


Выдержка из документации:

Pointer events

Most of the time, you can use a widget's callbacks to handle what the user does while pointing to it. If you're working with event handlers, you'll need to know what events Photon emits.
Pressing a button

When you press the pointer button, Photon emits a Ph_EV_BUT_PRESS event to the widget that currently has focus.
Releasing a button

When you release the button, Photon emits two Ph_EV_BUT_RELEASE events:

    One with subtype Ph_EV_RELEASE_REAL
    One with subtype Ph_EV_RELEASE_PHANTOM.

The real release hits whatever the mouse points to when you release the button. The phantom release always goes to the same region (and position) that received the press.

In other words, if your widget saw the press, it also sees the phantom release. And depending on where the mouse was pointing to, you may or may not get the real release. If your widget gets both the real and phantom releases, the real one always comes first.
Записан

Goofy
Full Member
***
Offline Offline

Сообщений: 122


Просмотр профиля
« Ответ #2 : Июня 29, 2012, 03:51:02 pm »

Спасибо за подсказку.

Отфильтровал событие по подтипу Ph_EV_RELEASE_REAL и проблема решилась.
Записан
Страниц: [1]
  Печать  
 
Перейти в: