qstmgesturelib/qstmstatemachine.cpp
changeset 16 3c88a81ff781
parent 3 0954f5dd2cd0
equal deleted inserted replaced
14:6aeb7a756187 16:3c88a81ff781
    35 
    35 
    36 #if defined(Q_WS_X11)
    36 #if defined(Q_WS_X11)
    37 #include <X11/Xlib.h>
    37 #include <X11/Xlib.h>
    38 #endif
    38 #endif
    39 
    39 
       
    40 #if defined(Q_WS_WIN)
       
    41 #include <windows.h>
       
    42 #include <winuser.h>
       
    43 #endif
       
    44 
    40 using namespace qstmUiEventEngine ;
    45 using namespace qstmUiEventEngine ;
    41 
    46 
    42 //int pointBufferTimerCB(TAny* prt);
    47 //int pointBufferTimerCB(TAny* prt);
    43 
    48 
    44 extern const char* stateNames[8] ;
    49 extern const char* stateNames[8] ;
    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         */
   128     }
   136     }
   129     m_WasMessageFiltered = engine->handleStateEvent() ;
   137     m_WasMessageFiltered = engine->handleStateEvent() ;
   130     return m_WasMessageFiltered ;
   138     return m_WasMessageFiltered ;
   131 }
   139 }
   132 
   140 
       
   141 bool QStm_StateMachine::wasLastMessageFiltered()
       
   142 {
       
   143     return m_WasMessageFiltered;
       
   144 }
   133 
   145 
   134 bool QStm_StateMachine::wasLastMessageFiltered(int aPointerNumber)
   146 bool QStm_StateMachine::wasLastMessageFiltered(int aPointerNumber)
   135 {
   147 {
   136     return m_impl[aPointerNumber]->wasLastMessageFiltered() ;
   148     return m_impl[aPointerNumber]->wasLastMessageFiltered() ;
   137 }
   149 }
   303         }
   315         }
   304 
   316 
   305         break ;
   317         break ;
   306     }
   318     }
   307     case QStm_PlatformPointerEvent::EDrag:
   319     case QStm_PlatformPointerEvent::EDrag:
       
   320     case QStm_PlatformPointerEvent::EMove:
   308     {
   321     {
   309         event.m_type = qstmUiEventEngine::EDrag ;
   322         event.m_type = qstmUiEventEngine::EDrag ;
   310         break ;
   323         break ;
   311     }
   324     }
   312     }
   325     }
       
   326     // TODO handle these events too with some kind of dummy event (or there will be a crash if they happen)
       
   327     //          EButtonRepeat,
       
   328     //          ESwitchOn,
       
   329 
   313 }
   330 }
   314 
   331 
   315 
   332 
   316 void QStm_StateMachine::startholdTimer(int pointerNumber)
   333 void QStm_StateMachine::startholdTimer(int pointerNumber)
   317 {
   334 {
   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;
   408                 case Button3:
   427                 case Button3:
   409                 {
   428                 {
   410                     platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton3Down;
   429                     platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton3Down;
   411                     break;
   430                     break;
   412                 }
   431                 }
       
   432 
   413             }
   433             }
   414             isPointerEvent = true;
   434             isPointerEvent = true;
   415             break;
   435             break;
   416         }
   436         }
   417         case ButtonRelease:
   437         case ButtonRelease:
   418         {
   438         {
       
   439             eventTime = platEvent->xbutton.time;
   419             switch (platEvent->xbutton.button) {
   440             switch (platEvent->xbutton.button) {
   420                 case Button1:
   441                 case Button1:
   421                 {
   442                 {
   422                     platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton1Up;
   443                     platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton1Up;
   423                     break;
   444                     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 }
   619 int QStm_StateMachine::getNumberOfPointers()
   703 int QStm_StateMachine::getNumberOfPointers()
   620 {
   704 {
   621     return KMaxNumberOfPointers ;
   705     return KMaxNumberOfPointers ;
   622 }
   706 }
   623 
   707 
   624 
   708 void QStm_StateMachine::enableDblClick(bool enable)
       
   709 {
       
   710     m_dblClickEnabled = enable ;
       
   711 }
       
   712