display: protect the integrity of the input devices
authorGiWoong Kim <giwoong.kim@samsung.com>
Fri, 5 Feb 2016 03:46:51 +0000 (12:46 +0900)
committerSeokYeon Hwang <syeon.hwang@samsung.com>
Fri, 19 Feb 2016 07:00:45 +0000 (16:00 +0900)
When user changes widget focus while mouse dragging, it causes a mismatch
problem between press event and release event.
To protect the integrity of the input devices, press event of mouse
or touch screen device should be canceled(by auto-generated release event)
if user opens context popup menu or enable the moving mode.

Change-Id: Id0817d1ee826b5576fdfe058ce98e964d3d2ae72
Signed-off-by: GiWoong Kim <giwoong.kim@samsung.com>
tizen/src/ui/displaybase.cpp
tizen/src/ui/displaybase.h
tizen/src/ui/input/touchscreenhelper.cpp
tizen/src/ui/input/touchscreenhelper.h

index f74364bf3ac8f50fd308fc30d2b7e69355983d9b..17069d07c9d2514814c2c26491d5bd13fabfb22a 100644 (file)
@@ -262,6 +262,20 @@ MouseHelper *DisplayBase::getMouseHelper()
     return mouseHelper;
 }
 
+void DisplayBase::clearInput()
+{
+    qDebug("clear input");
+
+    if (tsHelper != NULL) {
+        tsHelper->touchReleased();
+    }
+    if (mouseHelper != NULL) {
+        mouseHelper->mouseReleased();
+    }
+
+    isDragging = false;
+}
+
 /* called by overriding function */
 void DisplayBase::handleMousePress(QMouseEvent *event)
 {
@@ -285,6 +299,10 @@ void DisplayBase::handleMousePress(QMouseEvent *event)
         if (mouseHelper != NULL) {
             mouseHelper->mousePressed();
         }
+    } else {
+        if (isDragging == true) {
+            clearInput();
+        }
     }
 }
 
@@ -400,6 +418,10 @@ void DisplayBase::handleMouseLeave(QEvent *event)
 
 void DisplayBase::turnOnMovingMode()
 {
+    if (isDragging == true) {
+        clearInput();
+    }
+
     movingMode = true;
 
     widget->setCursor(Qt::SizeAllCursor);
index d41cb20f5468b443b336ecfe94a0e96c8e2c3b28..ab47c5aa4d623a02551e143e8dd16eb37a35fdf4 100644 (file)
@@ -56,6 +56,7 @@ public:
     QPoint getGuestPos(QPoint hostPos);
     TouchScreenHelper *getTouchScreenHelper();
     MouseHelper *getMouseHelper();
+    void clearInput();
 
     bool isOffGuideReady();
     void showOffGuideImg();
index a0c56d7d943ee00e2695f5f23f8c0ad6b8e3a7c2..4d197c57477646843dc783332e0473b0c5731d68 100644 (file)
@@ -44,6 +44,7 @@ TouchScreenHelper::TouchScreenHelper(void *parent)
     this->parent = parent;
     this->mtTracker =
         new MultiTouchTracker(this, get_max_touch_point());
+    this->lastPressedPos = QPoint(0, 0);
 }
 
 void *TouchScreenHelper::getParent()
@@ -66,11 +67,12 @@ void TouchScreenHelper::touchPressed(QPoint hostPos, QPoint guestPos)
 
     /* single-touch processing */
     virtio_touchscreen_event(guestPos.x(), guestPos.y(), 0, 1);
+    lastPressedPos = guestPos;
 }
 
 void TouchScreenHelper::touchReleased(QPoint hostPos, QPoint guestPos)
 {
-       /* multi-touch processing */
+    /* multi-touch processing */
     if (mtTracker->getMtMode() != MultiTouchTracker::MT_OFF) {
         mtTracker->releaseSelectedTouchPoint();
         return;
@@ -78,6 +80,21 @@ void TouchScreenHelper::touchReleased(QPoint hostPos, QPoint guestPos)
 
     /* single-touch processing */
     virtio_touchscreen_event(guestPos.x(), guestPos.y(), 0, 0);
+    lastPressedPos = QPoint(0, 0);
+}
+
+void TouchScreenHelper::touchReleased()
+{
+    /* single-touch processing */
+    if (lastPressedPos != QPoint(0, 0)) {
+        virtio_touchscreen_event(lastPressedPos.x(), lastPressedPos.y(), 0, 0);
+        lastPressedPos = QPoint(0, 0);
+    }
+
+    /* multi-touch processing */
+    if (mtTracker->getMtMode() != MultiTouchTracker::MT_OFF) {
+        mtTracker->finishTracking();
+    }
 }
 
 void TouchScreenHelper::touchMoved(QPoint hostPos, QPoint guestPos)
@@ -90,6 +107,7 @@ void TouchScreenHelper::touchMoved(QPoint hostPos, QPoint guestPos)
 
     /* single-touch processing */
     virtio_touchscreen_event(guestPos.x(), guestPos.y(), 0, 1);
+    lastPressedPos = guestPos;
 }
 
 TouchScreenHelper::~TouchScreenHelper()
index 8b24342b3afbf568cbb843e9d2afbb438bc618c3..d8d11f722ef7bc5bbffa6d7e892626ecc95ae215 100644 (file)
@@ -43,11 +43,13 @@ public:
 
     void touchPressed(QPoint hostPos, QPoint guestPos);
     void touchReleased(QPoint hostPos, QPoint guestPos);
+    void touchReleased();
     void touchMoved(QPoint hostPos, QPoint guestPos);
 
 private:
     void *parent;
     MultiTouchTracker *mtTracker;
+    QPoint lastPressedPos;
 };
 
 #endif // TOUCHSCREENHELPER_H