--- 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 <X11/Xlib.h>
#endif
+#if defined(Q_WS_WIN)
+#include <windows.h>
+#include <winuser.h>
+#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<CCoeControl*>(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<QStm_PlatformPointerEvent::PEType>(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 ;
+}