From: GiWoong Kim Date: Fri, 5 Feb 2016 03:46:51 +0000 (+0900) Subject: display: protect the integrity of the input devices X-Git-Tag: Tizen_Studio_1.3_Release_p2.3.2~64 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=298c5962fed4fb2ecded6e008c882b15fcbeef73;p=sdk%2Femulator%2Fqemu.git display: protect the integrity of the input devices 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 --- diff --git a/tizen/src/ui/displaybase.cpp b/tizen/src/ui/displaybase.cpp index f74364bf3a..17069d07c9 100644 --- a/tizen/src/ui/displaybase.cpp +++ b/tizen/src/ui/displaybase.cpp @@ -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); diff --git a/tizen/src/ui/displaybase.h b/tizen/src/ui/displaybase.h index d41cb20f54..ab47c5aa4d 100644 --- a/tizen/src/ui/displaybase.h +++ b/tizen/src/ui/displaybase.h @@ -56,6 +56,7 @@ public: QPoint getGuestPos(QPoint hostPos); TouchScreenHelper *getTouchScreenHelper(); MouseHelper *getMouseHelper(); + void clearInput(); bool isOffGuideReady(); void showOffGuideImg(); diff --git a/tizen/src/ui/input/touchscreenhelper.cpp b/tizen/src/ui/input/touchscreenhelper.cpp index a0c56d7d94..4d197c5747 100644 --- a/tizen/src/ui/input/touchscreenhelper.cpp +++ b/tizen/src/ui/input/touchscreenhelper.cpp @@ -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() diff --git a/tizen/src/ui/input/touchscreenhelper.h b/tizen/src/ui/input/touchscreenhelper.h index 8b24342b3a..d8d11f722e 100644 --- a/tizen/src/ui/input/touchscreenhelper.h +++ b/tizen/src/ui/input/touchscreenhelper.h @@ -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