63 |
68 |
64 QStm_StateMachine::QStm_StateMachine() |
69 QStm_StateMachine::QStm_StateMachine() |
65 { |
70 { |
66 m_WasMessageFiltered = false ; |
71 m_WasMessageFiltered = false ; |
67 m_wseventmonitoringenabled = false ; // NB: enabled only if really used by application |
72 m_wseventmonitoringenabled = false ; // NB: enabled only if really used by application |
68 m_loggingenabled = false ; |
73 m_loggingenabled = true ; |
69 m_capacitiveup = false ; |
74 m_capacitiveup = false ; |
70 m_adjustYposition = false ; |
75 m_adjustYposition = false ; |
|
76 m_dblClickEnabled = false; |
|
77 m_currentNativeWin = NULL; |
|
78 m_widget = 0; |
71 //m_pointBuffer = NULL; |
79 //m_pointBuffer = NULL; |
72 init(); |
80 init(); |
73 } |
81 } |
74 |
82 |
75 QStm_StateMachine::~QStm_StateMachine() |
83 QStm_StateMachine::~QStm_StateMachine() |
100 |
108 |
101 for (int i = 0; i < KMaxNumberOfPointers; i++) |
109 for (int i = 0; i < KMaxNumberOfPointers; i++) |
102 { |
110 { |
103 m_impl[i] = new QStm_StateEngine(m_config, this, i) ; |
111 m_impl[i] = new QStm_StateEngine(m_config, this, i) ; |
104 |
112 |
105 m_holdTimer[i] = new QStm_CallbackTimer(this, &qstmUiEventEngine::QStm_StateMachine::handleholdTimer, 0, i, true); |
113 m_holdTimer[i] = new QStm_CallbackTimer(this, &qstmUiEventEngine::QStm_StateMachine::s_handleholdTimer, 0, i, true); |
106 m_touchTimer[i] = new QStm_CallbackTimer(this, &qstmUiEventEngine::QStm_StateMachine::handletouchTimer, 0, i, true); |
114 m_touchTimer[i] = new QStm_CallbackTimer(this, &qstmUiEventEngine::QStm_StateMachine::s_handletouchTimer, 0, i, true); |
107 m_suppressTimer[i] = new QStm_CallbackTimer(this, &qstmUiEventEngine::QStm_StateMachine::handlesuppressTimer, 0, i, true); |
115 m_suppressTimer[i] = new QStm_CallbackTimer(this, &qstmUiEventEngine::QStm_StateMachine::s_handlesuppressTimer, 0, i, true); |
108 /* |
116 /* |
109 m_holdTimer[i] = new QStm_CallbackTimer(this, SLOT(handleholdTimer(int)), 0, i, true); |
117 m_holdTimer[i] = new QStm_CallbackTimer(this, SLOT(handleholdTimer(int)), 0, i, true); |
110 m_touchTimer[i] = new QStm_CallbackTimer(this, SLOT(handletouchTimer(int)), 0, i, true); |
118 m_touchTimer[i] = new QStm_CallbackTimer(this, SLOT(handletouchTimer(int)), 0, i, true); |
111 m_suppressTimer[i] = new QStm_CallbackTimer(this, SLOT(handlesuppressTimer(int)), 0, i, true); |
119 m_suppressTimer[i] = new QStm_CallbackTimer(this, SLOT(handlesuppressTimer(int)), 0, i, true); |
112 */ |
120 */ |
365 |
382 |
366 void QStm_StateMachine::handletouchTimer(int pointerNumber) |
383 void QStm_StateMachine::handletouchTimer(int pointerNumber) |
367 { |
384 { |
368 QStm_StateEngine* engine = m_impl[pointerNumber]; |
385 QStm_StateEngine* engine = m_impl[pointerNumber]; |
369 createTimerEvent(engine->initEvent(), qstmUiEventEngine::ETouchTimer) ; |
386 createTimerEvent(engine->initEvent(), qstmUiEventEngine::ETouchTimer) ; |
370 engine->handleStateEvent() ; |
387 m_WasMessageFiltered = engine->handleStateEvent() ; |
371 } |
388 } |
372 |
389 |
373 void QStm_StateMachine::canceltouchTimer(int pointerNumber) |
390 void QStm_StateMachine::canceltouchTimer(int pointerNumber) |
374 { |
391 { |
375 if (m_touchTimer[pointerNumber]->isActive()) |
392 if (m_touchTimer[pointerNumber]->isActive()) |
389 bool QStm_StateMachine::handleX11PlatformEvent(const XEvent* platEvent) |
406 bool QStm_StateMachine::handleX11PlatformEvent(const XEvent* platEvent) |
390 { |
407 { |
391 bool isPointerEvent = false; |
408 bool isPointerEvent = false; |
392 #if defined(Q_WS_X11) |
409 #if defined(Q_WS_X11) |
393 QStm_PlatformPointerEvent platPointerEvent; |
410 QStm_PlatformPointerEvent platPointerEvent; |
|
411 unsigned long eventTime = -1; |
394 switch (platEvent->type) { |
412 switch (platEvent->type) { |
395 case ButtonPress: |
413 case ButtonPress: |
396 { |
414 { |
|
415 eventTime = platEvent->xbutton.time; |
397 switch (platEvent->xbutton.button) { |
416 switch (platEvent->xbutton.button) { |
398 case Button1: |
417 case Button1: |
399 { |
418 { |
400 platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton1Down; |
419 platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton1Down; |
401 break; |
420 break; |
436 isPointerEvent = true; |
457 isPointerEvent = true; |
437 break; |
458 break; |
438 } |
459 } |
439 case MotionNotify: |
460 case MotionNotify: |
440 { |
461 { |
|
462 eventTime = platEvent->xmotion.time; |
441 platPointerEvent.m_type = QStm_PlatformPointerEvent::EMove; |
463 platPointerEvent.m_type = QStm_PlatformPointerEvent::EMove; |
442 isPointerEvent = true; |
464 isPointerEvent = true; |
443 break; |
465 break; |
444 } |
466 } |
445 } |
467 } |
446 |
468 |
447 if (isPointerEvent) { |
469 if (isPointerEvent) { |
448 QWidget* widget = QWidget::find((WId)platEvent->xany.window); |
470 QWidget* widget = QWidget::find((WId)platEvent->xany.window); |
449 |
471 |
450 platPointerEvent.m_target = widget; |
472 platPointerEvent.m_target = widget; |
451 int mds = platEvent->xbutton.time; |
473 |
|
474 int mds = eventTime; |
452 int msec = mds % 1000; |
475 int msec = mds % 1000; |
453 int sec = (mds / 1000) % 60; |
476 int sec = (mds / 1000) % 60; |
454 int hr = mds / (1000 * 3600); |
477 int hr = mds / (1000 * 3600); |
455 int min = (mds % (1000 * 3600)) / 60000; |
478 int min = (mds % (1000 * 3600)) / 60000; |
456 |
479 |
457 platPointerEvent.m_time = QTime(hr, min, sec, msec); |
480 platPointerEvent.m_time = QTime::currentTime(); //QTime(hr, min, sec, msec); |
458 platPointerEvent.m_pointerNumber = 0; |
481 platPointerEvent.m_pointerNumber = 0; |
459 platPointerEvent.m_position = QPoint(platEvent->xbutton.x, |
482 platPointerEvent.m_position = QPoint(platEvent->xbutton.x, |
460 platEvent->xbutton.y); |
483 platEvent->xbutton.y); |
461 |
484 |
462 handleStateEvent(platPointerEvent); |
485 handleStateEvent(platPointerEvent); |
463 } |
486 } |
464 #endif // Q_WS_X11 |
487 #endif // Q_WS_X11 |
465 return isPointerEvent; |
488 return isPointerEvent; |
466 } |
489 } |
|
490 |
|
491 bool QStm_StateMachine::handleWinPlatformEvent(const void* platEvent) |
|
492 { |
|
493 bool ret = false; |
|
494 #ifdef Q_OS_WIN |
|
495 struct tagMSG* msg = (struct tagMSG*)platEvent; |
|
496 QStm_PlatformPointerEvent platPointerEvent; |
|
497 |
|
498 switch(msg->message) { |
|
499 case WM_LBUTTONDOWN: |
|
500 platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton1Down; |
|
501 break; |
|
502 case WM_MBUTTONDOWN: |
|
503 platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton2Down; |
|
504 break; |
|
505 case WM_RBUTTONDOWN: |
|
506 platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton3Down; |
|
507 break; |
|
508 // case WM_XBUTTONDOWN: |
|
509 // break; |
|
510 case WM_LBUTTONUP: |
|
511 platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton1Up; |
|
512 break; |
|
513 case WM_MBUTTONUP: |
|
514 platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton2Up; |
|
515 break; |
|
516 case WM_RBUTTONUP: |
|
517 platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton3Up; |
|
518 break; |
|
519 // case WM_XBUTTONUP: |
|
520 // break; |
|
521 case WM_MOUSEMOVE: |
|
522 platPointerEvent.m_type = QStm_PlatformPointerEvent::EMove; |
|
523 break; |
|
524 default: |
|
525 return false; |
|
526 } |
|
527 |
|
528 ret = true; |
|
529 QWidget* widget = QWidget::find((WId)msg->hwnd); |
|
530 |
|
531 platPointerEvent.m_target = widget; |
|
532 |
|
533 platPointerEvent.m_time = QTime::currentTime(); //QTime(hr, min, sec, msec); |
|
534 platPointerEvent.m_pointerNumber = 0; |
|
535 platPointerEvent.m_position = QPoint(LOWORD(msg->lParam), HIWORD(msg->lParam)); |
|
536 |
|
537 handleStateEvent(platPointerEvent); |
|
538 #endif // Q_OS_WIN |
|
539 return ret; |
|
540 } |
|
541 |
467 |
542 |
468 bool QStm_StateMachine::handleSymbianPlatformEvent(const QSymbianEvent* platEvent) |
543 bool QStm_StateMachine::handleSymbianPlatformEvent(const QSymbianEvent* platEvent) |
469 { |
544 { |
470 bool ret = false; |
545 bool ret = false; |
471 #ifdef Q_OS_SYMBIAN |
546 #ifdef Q_OS_SYMBIAN |
475 CCoeControl* ctrl = REINTERPRET_CAST(CCoeControl*, wse->Handle()); |
550 CCoeControl* ctrl = REINTERPRET_CAST(CCoeControl*, wse->Handle()); |
476 |
551 |
477 QStm_PlatformPointerEvent platPointerEvent; |
552 QStm_PlatformPointerEvent platPointerEvent; |
478 |
553 |
479 if (wse->Type() == EEventPointer) { |
554 if (wse->Type() == EEventPointer) { |
480 QWidget* widget = QWidget::find(ctrl); |
555 if (static_cast<CCoeControl*>(m_currentNativeWin) != ctrl) { |
481 ret = (widget != NULL); |
556 m_currentNativeWin = ctrl; |
482 TPointerEvent* tpe = wse->Pointer(); |
557 m_widget = QWidget::find(ctrl); |
|
558 } |
|
559 ret = (m_widget != NULL); |
|
560 TPointerEvent* tpe = wse->Pointer(); |
|
561 if (m_dblClickEnabled && (tpe->iModifiers & EModifierDoubleClick)) { |
|
562 // We enabled platform double click so just |
|
563 // return without filtering. Obviously Double Tap won't be recognized. |
|
564 return false; |
|
565 } |
|
566 |
483 // For Symbian it's one-to-one correspondence |
567 // For Symbian it's one-to-one correspondence |
484 platPointerEvent.m_type = static_cast<QStm_PlatformPointerEvent::PEType>(tpe->iType); |
568 platPointerEvent.m_type = static_cast<QStm_PlatformPointerEvent::PEType>(tpe->iType); |
485 platPointerEvent.m_modifiers = tpe->iModifiers; |
569 platPointerEvent.m_modifiers = tpe->iModifiers; |
486 platPointerEvent.m_position = QPoint(tpe->iPosition.iX, tpe->iPosition.iY); |
570 platPointerEvent.m_position = QPoint(tpe->iPosition.iX, tpe->iPosition.iY); |
487 platPointerEvent.m_pointerNumber = 0; |
571 platPointerEvent.m_pointerNumber = 0; |
490 if (tpe->IsAdvancedPointerEvent()) { |
574 if (tpe->IsAdvancedPointerEvent()) { |
491 const TAdvancedPointerEvent* tadvp = tpe->AdvancedPointerEvent() ; |
575 const TAdvancedPointerEvent* tadvp = tpe->AdvancedPointerEvent() ; |
492 platPointerEvent.m_pointerNumber = tadvp->PointerNumber() ; |
576 platPointerEvent.m_pointerNumber = tadvp->PointerNumber() ; |
493 } |
577 } |
494 #endif |
578 #endif |
495 platPointerEvent.m_target = widget; |
579 platPointerEvent.m_target = m_widget; |
496 int h = wse->Time().DateTime().Hour(); |
580 int h = wse->Time().DateTime().Hour(); |
497 int m = wse->Time().DateTime().Minute(); |
581 int m = wse->Time().DateTime().Minute(); |
498 int s = wse->Time().DateTime().Second(); |
582 int s = wse->Time().DateTime().Second(); |
499 int ms = wse->Time().DateTime().MicroSecond() / 1000; |
583 int ms = wse->Time().DateTime().MicroSecond() / 1000; |
500 QTime time(h, m, s, ms); |
584 QTime time(h, m, s, ms); |
501 |
585 |
502 platPointerEvent.m_time = time; |
586 platPointerEvent.m_time = time; |
503 handleStateEvent(platPointerEvent); |
587 ret = handleStateEvent(platPointerEvent); |
504 } |
588 } |
505 } |
589 } |
506 #endif |
590 #endif |
507 return ret; |
591 return ret; |
508 } |
592 } |