qstmgesturelib/qstmstatemachine.cpp
changeset 0 1450b09d0cfd
child 3 0954f5dd2cd0
equal deleted inserted replaced
-1:000000000000 0:1450b09d0cfd
       
     1 /*
       
     2 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: 
       
    15 *
       
    16 */
       
    17 
       
    18 #include "qstmstatemachine.h"
       
    19 #include "qstmstateengine.h"
       
    20 #include "qstmuievent_if.h"
       
    21 #include "qstmcallbacktimer.h"
       
    22 #include "qstmstateengineconfig.h"
       
    23 
       
    24 #include "qstmfilelogger.h"
       
    25 #include "qstmutils.h"
       
    26 #include <QtGui>
       
    27 
       
    28 #ifdef Q_OS_SYMBIAN
       
    29 #include <w32std.h>
       
    30 #include <coecntrl.h>
       
    31 #endif
       
    32 
       
    33 #if defined(Q_WS_X11)
       
    34 #include <X11/Xlib.h>
       
    35 #endif
       
    36 
       
    37 using namespace qstmUiEventEngine ;
       
    38 
       
    39 //int pointBufferTimerCB(TAny* prt);
       
    40 
       
    41 extern const char* stateNames[8] ;
       
    42 
       
    43 const char* const ttypeNames[] = {  // for debugging purposes define the names of the pointer events
       
    44             "EButton1Down         ",
       
    45             "EButton1Up           ",
       
    46             "EButton2Down         ",
       
    47             "EButton2Up           ",
       
    48             "EButton3Down         ",
       
    49             "EButton3Up           ",
       
    50             "EDrag                ",
       
    51             "EMove                ",
       
    52             "EButtonRepeat        ",
       
    53             "ESwitchOn            ",
       
    54             "EOutOfRange          ",
       
    55             "EEnterCloseProximity ",
       
    56             "EExitCloseProximity  ",
       
    57             "EEnterHighPressure   ",
       
    58             "EExitHighPressure    "
       
    59             };
       
    60 
       
    61 QStm_StateMachine::QStm_StateMachine()
       
    62 {
       
    63     m_WasMessageFiltered = false ;
       
    64     m_wseventmonitoringenabled = false ; // NB: enabled only if really used by application
       
    65     m_loggingenabled = false ;
       
    66     m_capacitiveup = false ;
       
    67     m_adjustYposition = false ;
       
    68     //m_pointBuffer = NULL;
       
    69     init();
       
    70 }
       
    71 
       
    72 QStm_StateMachine::~QStm_StateMachine()
       
    73 {
       
    74     for (int i = 0; i < KMaxNumberOfPointers; i++)
       
    75     {
       
    76         delete m_holdTimer[i] ;
       
    77         delete m_touchTimer[i] ;
       
    78         delete m_suppressTimer[i] ;
       
    79         delete m_impl[i] ;
       
    80     }
       
    81     delete m_config ;
       
    82 /*    
       
    83     if (m_pointBufferTimer && m_pointBufferTimer->IsActive())
       
    84     {
       
    85         m_pointBufferTimer->Cancel();
       
    86     }
       
    87     delete m_pointBufferTimer;
       
    88     m_pointBufferTimer = NULL;
       
    89 */    
       
    90 }
       
    91 
       
    92 
       
    93 
       
    94 void QStm_StateMachine::init()
       
    95 {
       
    96     m_config = new QStm_StateEngineConfiguration() ;
       
    97 
       
    98     for (int i = 0; i < KMaxNumberOfPointers; i++)
       
    99     {
       
   100         m_impl[i] = new QStm_StateEngine(m_config, this, i) ;
       
   101         
       
   102         m_holdTimer[i] = new QStm_CallbackTimer(this, &qstmUiEventEngine::QStm_StateMachine::handleholdTimer, 0, i, true);
       
   103         m_touchTimer[i] = new QStm_CallbackTimer(this, &qstmUiEventEngine::QStm_StateMachine::handletouchTimer, 0, i, true);
       
   104         m_suppressTimer[i] = new QStm_CallbackTimer(this, &qstmUiEventEngine::QStm_StateMachine::handlesuppressTimer, 0, i, true);
       
   105         /*
       
   106         m_holdTimer[i] = new QStm_CallbackTimer(this, SLOT(handleholdTimer(int)), 0, i, true);
       
   107         m_touchTimer[i] = new QStm_CallbackTimer(this, SLOT(handletouchTimer(int)), 0, i, true);
       
   108         m_suppressTimer[i] = new QStm_CallbackTimer(this, SLOT(handlesuppressTimer(int)), 0, i, true);
       
   109         */
       
   110     }
       
   111 //    m_coeEnv = CCoeEnv::Static();
       
   112 
       
   113     m_3mminpixels = QStm_Utils::mm2Pixels(3) ;
       
   114 }
       
   115 
       
   116 
       
   117 bool QStm_StateMachine::handleStateEvent(const QStm_PlatformPointerEvent& platPointerEvent)
       
   118 {
       
   119     int index = pointerIndex(platPointerEvent);
       
   120     QStm_StateEngine* engine = m_impl[index];
       
   121     createHwEvent(engine->initEvent(), platPointerEvent, platPointerEvent.m_target, platPointerEvent.m_time) ;
       
   122     if (m_loggingenabled)
       
   123     {
       
   124         LOGARG("handleStateEvent: ptr %d", index) ;
       
   125     }
       
   126     m_WasMessageFiltered = engine->handleStateEvent() ;
       
   127     return m_WasMessageFiltered ;
       
   128 }
       
   129 
       
   130 
       
   131 bool QStm_StateMachine::wasLastMessageFiltered(int aPointerNumber)
       
   132 {
       
   133     return m_impl[aPointerNumber]->wasLastMessageFiltered() ;
       
   134 }
       
   135 
       
   136 
       
   137 QRect QStm_StateMachine::getTouchArea(int pointerNumber)
       
   138 {
       
   139     return m_impl[pointerNumber]->getTouchArea() ;
       
   140 }
       
   141 
       
   142 void QStm_StateMachine::setTouchTimeArea(long fingersize_mm)
       
   143 {
       
   144     m_config->setTouchTimeArea(fingersize_mm) ;
       
   145 }
       
   146 
       
   147 void QStm_StateMachine::setTouchArea(long fingersize_mm)
       
   148 {
       
   149     m_config->setTouchArea(fingersize_mm) ;
       
   150 }
       
   151 
       
   152 void QStm_StateMachine::setMoveTolerance(long fingersize_mm)
       
   153 {
       
   154     m_config->setMoveTolerance(fingersize_mm);    
       
   155 }
       
   156 
       
   157 QPoint QStm_StateMachine::getMoveTolerance()
       
   158 { 
       
   159     return m_config->getMoveTolerance(); 
       
   160 }
       
   161 
       
   162 
       
   163 QStm_AreaShape QStm_StateMachine::getTouchAreaShape()
       
   164 {
       
   165     return m_config->getTouchAreaShape() ;
       
   166 }
       
   167 
       
   168 
       
   169 void QStm_StateMachine::setTouchAreaShape(const QStm_AreaShape aShape)
       
   170 {
       
   171     m_config->setTouchAreaShape(aShape) ;
       
   172 }
       
   173 
       
   174 
       
   175 unsigned int QStm_StateMachine::getTouchTimeout()
       
   176 {
       
   177     return m_config->getTouchTimeout() ;
       
   178 }
       
   179 
       
   180 
       
   181 void QStm_StateMachine::setTouchTimeout(unsigned int aDelay)
       
   182 {
       
   183     m_config->setTouchTimeout(aDelay) ;
       
   184 }
       
   185 
       
   186 
       
   187 QRect QStm_StateMachine::getHoldArea(int pointerNumber)
       
   188 {
       
   189     return m_impl[pointerNumber]->getHoldArea() ;
       
   190 }
       
   191 
       
   192 
       
   193 void QStm_StateMachine::setHoldArea(long fingersize_mm)
       
   194 {
       
   195     m_config->setHoldArea(fingersize_mm) ;
       
   196 }
       
   197 
       
   198 QStm_AreaShape QStm_StateMachine::getHoldAreaShape()
       
   199 {
       
   200     return m_config->getHoldAreaShape() ;
       
   201 }
       
   202 
       
   203 void QStm_StateMachine::setHoldAreaShape(const QStm_AreaShape aShape)
       
   204 {
       
   205     m_config->setHoldAreaShape(aShape) ;
       
   206 }
       
   207 
       
   208 unsigned int QStm_StateMachine::getHoldTimeout()
       
   209 {
       
   210     return m_config->getHoldTimeout() ;
       
   211 }
       
   212 
       
   213 void QStm_StateMachine::setHoldTimeout(unsigned int a)
       
   214 {
       
   215     m_config->setHoldTimeout(a) ;
       
   216 }
       
   217 
       
   218 unsigned int QStm_StateMachine::getTouchSuppressTimeout()
       
   219 {
       
   220     return m_config->getTouchSuppressTimeout() ;
       
   221 }
       
   222 
       
   223 void QStm_StateMachine::setTouchSuppressTimeout(unsigned int a)
       
   224 {
       
   225     m_config->setTouchSuppressTimeout(a) ;
       
   226 }
       
   227 
       
   228 unsigned int QStm_StateMachine::getMoveSuppressTimeout()
       
   229 {
       
   230     return m_config->getMoveSuppressTimeout() ;
       
   231 }
       
   232 
       
   233 void QStm_StateMachine::setMoveSuppressTimeout(unsigned int a)
       
   234 {
       
   235     m_config->setMoveSuppressTimeout(a) ;
       
   236 }
       
   237 
       
   238 bool QStm_StateMachine::addUiEventObserver(QStm_UiEventObserverIf* observer)
       
   239 {
       
   240     return m_config->addUiEventObserver(observer) ;
       
   241 }
       
   242 
       
   243 
       
   244 bool QStm_StateMachine::removeUiEventObserver(QStm_UiEventObserverIf* observer)
       
   245 {
       
   246     return m_config->removeUiEventObserver(observer) ;
       
   247 }
       
   248 
       
   249 void QStm_StateMachine::enableLogging(bool aEnable)
       
   250 {
       
   251     m_loggingenabled = aEnable ;
       
   252     m_config->enableLogging(aEnable) ;
       
   253 }
       
   254 
       
   255 int QStm_StateMachine::pointerIndex(const QStm_PlatformPointerEvent& platPointerEvent)
       
   256 {
       
   257     int index = 0;
       
   258 /*    
       
   259 #if defined(ADVANCED_POINTER_EVENTS)
       
   260     if (aPointerEvent.IsAdvancedPointerEvent())
       
   261     {
       
   262         const TAdvancedPointerEvent* tadvp = aPointerEvent.AdvancedPointerEvent() ;
       
   263         index = tadvp->PointerNumber() ;
       
   264     }
       
   265 #endif
       
   266 */
       
   267     index = platPointerEvent.m_pointerNumber;
       
   268     return index;
       
   269 }
       
   270 
       
   271 void QStm_StateMachine::createHwEvent(QStm_HwEvent& event, const QStm_PlatformPointerEvent& platPointerEvent, void* target, const QTime& time)
       
   272 {
       
   273 /*  should be set by this moment by CStateEngine with that index in CStateEngine::initEvent()
       
   274     aEvent.iPointerNumber = PointerIndex(aPointerEvent);
       
   275 */
       
   276     event.m_target = target ;
       
   277     event.m_time = time;
       
   278     // Change to screen coordinates here while the window is still existing....
       
   279     event.m_position = screenCoordinates(platPointerEvent.m_position, target) ;
       
   280     switch (platPointerEvent.m_type)
       
   281     {
       
   282     case QStm_PlatformPointerEvent::EButton1Down:
       
   283     case QStm_PlatformPointerEvent::EButton2Down:
       
   284     case QStm_PlatformPointerEvent::EButton3Down:
       
   285     {
       
   286         event.m_type = qstmUiEventEngine::EDown ;
       
   287         break ;
       
   288     }
       
   289     case QStm_PlatformPointerEvent::EButton1Up:
       
   290     case QStm_PlatformPointerEvent::EButton2Up:
       
   291     case QStm_PlatformPointerEvent::EButton3Up:
       
   292     {
       
   293         if (m_capacitiveup)
       
   294         {
       
   295             event.m_type = qstmUiEventEngine::ECapacitiveUP ;   // How could this be checked automatically?
       
   296         }
       
   297         else
       
   298         {
       
   299             event.m_type = qstmUiEventEngine::EResistiveUP ;    // How could this be checked automatically?
       
   300         }
       
   301 
       
   302         break ;
       
   303     }
       
   304     case QStm_PlatformPointerEvent::EDrag:
       
   305     {
       
   306         event.m_type = qstmUiEventEngine::EDrag ;
       
   307         break ;
       
   308     }
       
   309     }
       
   310 }
       
   311 
       
   312 
       
   313 void QStm_StateMachine::startholdTimer(int pointerNumber)
       
   314 {
       
   315     if (!m_holdTimer[pointerNumber]->isActive())
       
   316     {
       
   317         m_holdTimer[pointerNumber]->start();
       
   318     }
       
   319 }
       
   320 
       
   321 
       
   322 void QStm_StateMachine::handleholdTimer(int pointerNumber)
       
   323 {
       
   324     QStm_StateEngine* engine = m_impl[pointerNumber];
       
   325     createTimerEvent(engine->initEvent(), qstmUiEventEngine::EHoldTimer) ;
       
   326     engine->handleStateEvent() ;
       
   327 }
       
   328 
       
   329 
       
   330 void QStm_StateMachine::cancelholdTimer(int pointerNumber)
       
   331 {
       
   332     m_holdTimer[pointerNumber]->stop();
       
   333 }
       
   334 
       
   335 
       
   336 void QStm_StateMachine::startsuppressTimer(int pointerNumber)
       
   337 {
       
   338     m_suppressTimer[pointerNumber]->start();
       
   339 }
       
   340 
       
   341 void QStm_StateMachine::handlesuppressTimer(int pointerNumber)
       
   342 {
       
   343     QStm_StateEngine* engine = m_impl[pointerNumber];
       
   344     createTimerEvent(engine->initEvent(), qstmUiEventEngine::ESuppressTimer) ;
       
   345     engine->handleStateEvent() ;
       
   346 }
       
   347 
       
   348 
       
   349 void QStm_StateMachine::cancelsuppressTimer(int pointerNumber)
       
   350 {
       
   351     m_suppressTimer[pointerNumber]->stop();
       
   352 }
       
   353 
       
   354 
       
   355 void QStm_StateMachine::starttouchTimer(int pointerNumber)
       
   356 {
       
   357     if (!m_touchTimer[pointerNumber]->isActive())
       
   358     {
       
   359         m_touchTimer[pointerNumber]->start();
       
   360     }
       
   361 }
       
   362 
       
   363 void QStm_StateMachine::handletouchTimer(int pointerNumber)
       
   364 {
       
   365     QStm_StateEngine* engine = m_impl[pointerNumber];
       
   366     createTimerEvent(engine->initEvent(), qstmUiEventEngine::ETouchTimer) ;
       
   367     engine->handleStateEvent() ;
       
   368 }
       
   369 
       
   370 void QStm_StateMachine::canceltouchTimer(int pointerNumber)
       
   371 {
       
   372     if (m_touchTimer[pointerNumber]->isActive())
       
   373     {
       
   374         m_touchTimer[pointerNumber]->stop();
       
   375     }
       
   376 }
       
   377 
       
   378 void QStm_StateMachine::createTimerEvent(QStm_HwEvent& event, QStm_StateMachineEvent eventCode)
       
   379 {
       
   380     event.m_type = eventCode ;
       
   381     // m_hwe.iPosition = TPos(0, 0) ;       // should we just leave the previous pos
       
   382     event.m_time = QTime::currentTime() ;
       
   383 }
       
   384 
       
   385 
       
   386 bool QStm_StateMachine::handleX11PlatformEvent(const XEvent* platEvent)
       
   387 {
       
   388     bool isPointerEvent = false;
       
   389 #if defined(Q_WS_X11)
       
   390     QStm_PlatformPointerEvent platPointerEvent;
       
   391     switch (platEvent->type) {
       
   392         case ButtonPress:
       
   393         {
       
   394             switch (platEvent->xbutton.button) {
       
   395                 case Button1:
       
   396                 {
       
   397                     platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton1Down;
       
   398                     break;
       
   399                 }
       
   400                 case Button2:
       
   401                 {
       
   402                     platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton2Down;
       
   403                     break;
       
   404                 }
       
   405                 case Button3:
       
   406                 {
       
   407                     platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton3Down;
       
   408                     break;
       
   409                 }
       
   410             }
       
   411             isPointerEvent = true;
       
   412             break;
       
   413         }
       
   414         case ButtonRelease:
       
   415         {
       
   416             switch (platEvent->xbutton.button) {
       
   417                 case Button1:
       
   418                 {
       
   419                     platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton1Up;
       
   420                     break;
       
   421                 }
       
   422                 case Button2:
       
   423                 {
       
   424                     platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton2Up;
       
   425                     break;
       
   426                 }
       
   427                 case Button3:
       
   428                 {
       
   429                     platPointerEvent.m_type = QStm_PlatformPointerEvent::EButton3Up;
       
   430                     break;
       
   431                 }
       
   432             }
       
   433             isPointerEvent = true;
       
   434             break;
       
   435         }
       
   436         case MotionNotify:
       
   437         {
       
   438             platPointerEvent.m_type = QStm_PlatformPointerEvent::EMove;
       
   439             isPointerEvent = true;
       
   440             break;
       
   441         }
       
   442     }
       
   443 
       
   444     if (isPointerEvent) {
       
   445         QWidget* widget = QWidget::find((WId)platEvent->xany.window);
       
   446 
       
   447         platPointerEvent.m_target = widget;
       
   448         int mds = platEvent->xbutton.time;
       
   449         int msec = mds % 1000;
       
   450         int sec =  (mds / 1000) % 60;
       
   451         int hr = mds / (1000 * 3600);
       
   452         int min = (mds % (1000 * 3600)) / 60000;
       
   453 
       
   454         platPointerEvent.m_time = QTime(hr, min, sec, msec);
       
   455         platPointerEvent.m_pointerNumber = 0;
       
   456         platPointerEvent.m_position = QPoint(platEvent->xbutton.x,
       
   457                                              platEvent->xbutton.y);
       
   458 
       
   459         handleStateEvent(platPointerEvent);
       
   460     }
       
   461 #endif // Q_WS_X11
       
   462     return isPointerEvent;
       
   463 }
       
   464 
       
   465 bool QStm_StateMachine::handleSymbianPlatformEvent(const QSymbianEvent* platEvent)
       
   466 {
       
   467     bool ret = false;
       
   468 #ifdef Q_OS_SYMBIAN
       
   469 	const TWsEvent* wse = platEvent->windowServerEvent();
       
   470 
       
   471 	if (wse) {
       
   472 		CCoeControl* ctrl = REINTERPRET_CAST(CCoeControl*, wse->Handle());
       
   473 		
       
   474 		QStm_PlatformPointerEvent platPointerEvent;
       
   475 		
       
   476 		if (wse->Type() == EEventPointer) {
       
   477 		    QWidget* widget = QWidget::find(ctrl);
       
   478 		    ret = (widget != NULL);
       
   479 			TPointerEvent* tpe = wse->Pointer(); 
       
   480 			 // For Symbian it's one-to-one correspondence
       
   481 			platPointerEvent.m_type = static_cast<QStm_PlatformPointerEvent::PEType>(tpe->iType); 
       
   482 			platPointerEvent.m_modifiers = tpe->iModifiers;
       
   483 			platPointerEvent.m_position = QPoint(tpe->iPosition.iX, tpe->iPosition.iY); 
       
   484 			platPointerEvent.m_pointerNumber = 0;
       
   485 			
       
   486 #if defined(ADVANCED_POINTER_EVENTS)
       
   487 		    if (tpe->IsAdvancedPointerEvent()) {
       
   488 		        const TAdvancedPointerEvent* tadvp = tpe->AdvancedPointerEvent() ;
       
   489 		        platPointerEvent.m_pointerNumber = tadvp->PointerNumber() ;
       
   490 		    }
       
   491 #endif
       
   492 		    platPointerEvent.m_target = widget;
       
   493 		    int h = wse->Time().DateTime().Hour();
       
   494 		    int m = wse->Time().DateTime().Minute();
       
   495 		    int s = wse->Time().DateTime().Second();
       
   496 		    int ms = wse->Time().DateTime().MicroSecond() / 1000;
       
   497 		    QTime time(h, m, s, ms);
       
   498 		    
       
   499 		    platPointerEvent.m_time = time;
       
   500 		    handleStateEvent(platPointerEvent);
       
   501 		}
       
   502 	}
       
   503 #endif
       
   504 	return ret;
       
   505 }
       
   506 
       
   507 
       
   508 
       
   509 
       
   510 void QStm_StateMachine::startTouchTimer(int delay, int pointerNumber)
       
   511 {
       
   512     m_touchTimer[pointerNumber]->setDelay(delay) ;
       
   513     starttouchTimer(pointerNumber) ;
       
   514 }
       
   515 
       
   516 void QStm_StateMachine::cancelTouchTimer(int pointerNumber)
       
   517 {
       
   518     canceltouchTimer(pointerNumber) ;
       
   519 }
       
   520 
       
   521 void QStm_StateMachine::startHoldTimer(int delay, int pointerNumber)
       
   522 {
       
   523     m_holdTimer[pointerNumber]->setDelay(delay) ;
       
   524     startholdTimer(pointerNumber) ;
       
   525 }
       
   526 
       
   527 void QStm_StateMachine::cancelHoldTimer(int pointerNumber)
       
   528 {
       
   529     cancelholdTimer(pointerNumber) ;
       
   530 }
       
   531 
       
   532 void QStm_StateMachine::startSuppressTimer(int delay, int pointerNumber)
       
   533 {
       
   534     m_suppressTimer[pointerNumber]->setDelay(delay) ;
       
   535     startsuppressTimer(pointerNumber) ;
       
   536 }
       
   537 
       
   538 void QStm_StateMachine::cancelSuppressTimer(int pointerNumber)
       
   539 {
       
   540     cancelsuppressTimer(pointerNumber) ;
       
   541 }
       
   542 
       
   543 
       
   544 QPoint QStm_StateMachine::screenCoordinates(const QPoint& pos, void* gestureTarget)
       
   545 {
       
   546     QPoint newPos = pos ;
       
   547     QWidget* widget = static_cast<QWidget*>(gestureTarget);
       
   548     
       
   549     if (!widget) {
       
   550         widget = QApplication::activeModalWidget();
       
   551     }
       
   552     
       
   553     if (!widget) {
       
   554         widget = QApplication::activePopupWidget();
       
   555     }
       
   556     
       
   557     if (widget) {    
       
   558         if (widget->isWindow()) {
       
   559             QPoint tp = widget->mapToGlobal(QPoint(0, 0)) ;
       
   560         	newPos += tp ;
       
   561             if (m_adjustYposition) {
       
   562                 QSize sz = widget->size() ;
       
   563 
       
   564                 // If we are running in capacitive touch device,
       
   565                 // adjust the point up about 3 mm unless we are
       
   566                 // near top or bottom of the window
       
   567 
       
   568                 // Y position in the window
       
   569                 int wY = newPos.y() - tp.y();
       
   570                 int edge = 2*m_3mminpixels;
       
   571 
       
   572                 if (wY >= 0 && wY <= (edge - 1)) {
       
   573                     // close to the top we adjust suitably so that immediately at the top adjust is 0
       
   574                     int adjust = wY / 2 ;
       
   575                     newPos.setY(newPos.y() - adjust) ;
       
   576                     if (m_loggingenabled) {
       
   577                         LOGARG("adjustment: nY %d tY %d [3mm: %d  adj: %d]", newPos.y(), tp.y(), m_3mminpixels, adjust) ;
       
   578                     }
       
   579                 }
       
   580                 else if (wY >= edge && wY <= (sz.height() - edge)) {
       
   581                     int from = newPos.y() ;
       
   582                     newPos.setY(newPos.y() - m_3mminpixels) ;
       
   583                     if (m_loggingenabled) {
       
   584                         LOGARG("adjustment: %d to %d [3mm: %d  middle]", from, newPos.y(), m_3mminpixels) ;
       
   585                     }
       
   586                 }
       
   587                 else {
       
   588                     // similarly at the bottom we adjust less the closer we get to the edge
       
   589                     int adjust = (sz.height() - wY) / 2 ;
       
   590                     newPos.setY(newPos.y() - adjust) ;
       
   591                     if (m_loggingenabled) {
       
   592                         LOGARG("adjustment: nY %d tY %d  sH %d [3mm: %d  adj: %d]",
       
   593                                 newPos.y(), tp.y(), sz.height(), m_3mminpixels, adjust) ;
       
   594                     }
       
   595 
       
   596                 }
       
   597             }
       
   598         }
       
   599         else  {
       
   600             // if the target does not own a window how can we adjust to the screen?
       
   601         }
       
   602     }
       
   603     return newPos ;
       
   604 }
       
   605 
       
   606 void QStm_StateMachine::enableCapacitiveUp(bool enable)
       
   607 {
       
   608     m_capacitiveup = enable ;
       
   609 }
       
   610 
       
   611 void QStm_StateMachine::enableYadjustment(bool enable)
       
   612 {
       
   613     m_adjustYposition = enable ;
       
   614 }
       
   615 
       
   616 int QStm_StateMachine::getNumberOfPointers()
       
   617 {
       
   618     return KMaxNumberOfPointers ;
       
   619 }
       
   620 
       
   621