diff -r 6aeb7a756187 -r 3c88a81ff781 qstmgesturelib/qstmstatemachine.cpp --- a/qstmgesturelib/qstmstatemachine.cpp Thu Sep 23 15:32:11 2010 -0400 +++ b/qstmgesturelib/qstmstatemachine.cpp Fri Oct 15 17:30:59 2010 -0400 @@ -37,6 +37,11 @@ #include #endif +#if defined(Q_WS_WIN) +#include +#include +#endif + using namespace qstmUiEventEngine ; //int pointBufferTimerCB(TAny* prt); @@ -65,9 +70,12 @@ { m_WasMessageFiltered = false ; m_wseventmonitoringenabled = false ; // NB: enabled only if really used by application - m_loggingenabled = false ; + m_loggingenabled = true ; m_capacitiveup = false ; m_adjustYposition = false ; + m_dblClickEnabled = false; + m_currentNativeWin = NULL; + m_widget = 0; //m_pointBuffer = NULL; init(); } @@ -102,9 +110,9 @@ { m_impl[i] = new QStm_StateEngine(m_config, this, i) ; - m_holdTimer[i] = new QStm_CallbackTimer(this, &qstmUiEventEngine::QStm_StateMachine::handleholdTimer, 0, i, true); - m_touchTimer[i] = new QStm_CallbackTimer(this, &qstmUiEventEngine::QStm_StateMachine::handletouchTimer, 0, i, true); - m_suppressTimer[i] = new QStm_CallbackTimer(this, &qstmUiEventEngine::QStm_StateMachine::handlesuppressTimer, 0, i, true); + m_holdTimer[i] = new QStm_CallbackTimer(this, &qstmUiEventEngine::QStm_StateMachine::s_handleholdTimer, 0, i, true); + m_touchTimer[i] = new QStm_CallbackTimer(this, &qstmUiEventEngine::QStm_StateMachine::s_handletouchTimer, 0, i, true); + m_suppressTimer[i] = new QStm_CallbackTimer(this, &qstmUiEventEngine::QStm_StateMachine::s_handlesuppressTimer, 0, i, true); /* m_holdTimer[i] = new QStm_CallbackTimer(this, SLOT(handleholdTimer(int)), 0, i, true); m_touchTimer[i] = new QStm_CallbackTimer(this, SLOT(handletouchTimer(int)), 0, i, true); @@ -130,6 +138,10 @@ return m_WasMessageFiltered ; } +bool QStm_StateMachine::wasLastMessageFiltered() +{ + return m_WasMessageFiltered; +} bool QStm_StateMachine::wasLastMessageFiltered(int aPointerNumber) { @@ -305,11 +317,16 @@ break ; } case QStm_PlatformPointerEvent::EDrag: + case QStm_PlatformPointerEvent::EMove: { event.m_type = qstmUiEventEngine::EDrag ; break ; } } + // TODO handle these events too with some kind of dummy event (or there will be a crash if they happen) + // EButtonRepeat, + // ESwitchOn, + } @@ -367,7 +384,7 @@ { QStm_StateEngine* engine = m_impl[pointerNumber]; createTimerEvent(engine->initEvent(), qstmUiEventEngine::ETouchTimer) ; - engine->handleStateEvent() ; + m_WasMessageFiltered = engine->handleStateEvent() ; } void QStm_StateMachine::canceltouchTimer(int pointerNumber) @@ -391,9 +408,11 @@ bool isPointerEvent = false; #if defined(Q_WS_X11) QStm_PlatformPointerEvent platPointerEvent; + unsigned long eventTime = -1; switch (platEvent->type) { case ButtonPress: { + eventTime = platEvent->xbutton.time; switch (platEvent->xbutton.button) { case Button1: { @@ -410,12 +429,14 @@ platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton3Down; break; } + } isPointerEvent = true; break; } case ButtonRelease: { + eventTime = platEvent->xbutton.time; switch (platEvent->xbutton.button) { case Button1: { @@ -438,6 +459,7 @@ } case MotionNotify: { + eventTime = platEvent->xmotion.time; platPointerEvent.m_type = QStm_PlatformPointerEvent::EMove; isPointerEvent = true; break; @@ -448,13 +470,14 @@ QWidget* widget = QWidget::find((WId)platEvent->xany.window); platPointerEvent.m_target = widget; - int mds = platEvent->xbutton.time; + + int mds = eventTime; int msec = mds % 1000; int sec = (mds / 1000) % 60; int hr = mds / (1000 * 3600); int min = (mds % (1000 * 3600)) / 60000; - platPointerEvent.m_time = QTime(hr, min, sec, msec); + platPointerEvent.m_time = QTime::currentTime(); //QTime(hr, min, sec, msec); platPointerEvent.m_pointerNumber = 0; platPointerEvent.m_position = QPoint(platEvent->xbutton.x, platEvent->xbutton.y); @@ -465,6 +488,58 @@ return isPointerEvent; } +bool QStm_StateMachine::handleWinPlatformEvent(const void* platEvent) +{ + bool ret = false; +#ifdef Q_OS_WIN + struct tagMSG* msg = (struct tagMSG*)platEvent; + QStm_PlatformPointerEvent platPointerEvent; + + switch(msg->message) { + case WM_LBUTTONDOWN: + platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton1Down; + break; + case WM_MBUTTONDOWN: + platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton2Down; + break; + case WM_RBUTTONDOWN: + platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton3Down; + break; +// case WM_XBUTTONDOWN: +// break; + case WM_LBUTTONUP: + platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton1Up; + break; + case WM_MBUTTONUP: + platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton2Up; + break; + case WM_RBUTTONUP: + platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton3Up; + break; +// case WM_XBUTTONUP: +// break; + case WM_MOUSEMOVE: + platPointerEvent.m_type = QStm_PlatformPointerEvent::EMove; + break; + default: + return false; + } + + ret = true; + QWidget* widget = QWidget::find((WId)msg->hwnd); + + platPointerEvent.m_target = widget; + + platPointerEvent.m_time = QTime::currentTime(); //QTime(hr, min, sec, msec); + platPointerEvent.m_pointerNumber = 0; + platPointerEvent.m_position = QPoint(LOWORD(msg->lParam), HIWORD(msg->lParam)); + + handleStateEvent(platPointerEvent); +#endif // Q_OS_WIN + return ret; +} + + bool QStm_StateMachine::handleSymbianPlatformEvent(const QSymbianEvent* platEvent) { bool ret = false; @@ -477,9 +552,18 @@ QStm_PlatformPointerEvent platPointerEvent; if (wse->Type() == EEventPointer) { - QWidget* widget = QWidget::find(ctrl); - ret = (widget != NULL); - TPointerEvent* tpe = wse->Pointer(); + if (static_cast(m_currentNativeWin) != ctrl) { + m_currentNativeWin = ctrl; + m_widget = QWidget::find(ctrl); + } + ret = (m_widget != NULL); + TPointerEvent* tpe = wse->Pointer(); + if (m_dblClickEnabled && (tpe->iModifiers & EModifierDoubleClick)) { + // We enabled platform double click so just + // return without filtering. Obviously Double Tap won't be recognized. + return false; + } + // For Symbian it's one-to-one correspondence platPointerEvent.m_type = static_cast(tpe->iType); platPointerEvent.m_modifiers = tpe->iModifiers; @@ -492,7 +576,7 @@ platPointerEvent.m_pointerNumber = tadvp->PointerNumber() ; } #endif - platPointerEvent.m_target = widget; + platPointerEvent.m_target = m_widget; int h = wse->Time().DateTime().Hour(); int m = wse->Time().DateTime().Minute(); int s = wse->Time().DateTime().Second(); @@ -500,7 +584,7 @@ QTime time(h, m, s, ms); platPointerEvent.m_time = time; - handleStateEvent(platPointerEvent); + ret = handleStateEvent(platPointerEvent); } } #endif @@ -621,4 +705,8 @@ return KMaxNumberOfPointers ; } +void QStm_StateMachine::enableDblClick(bool enable) +{ + m_dblClickEnabled = enable ; +}