From: GiWoong Kim Date: Thu, 30 Apr 2015 04:04:10 +0000 (+0900) Subject: touch: add different pattern of multi-touch processing X-Git-Tag: TizenStudio_2.0_p3.0~262 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7b1798b04ae1d11f17bb096554f5444b70bc3ab3;p=sdk%2Femulator%2Fqemu.git touch: add different pattern of multi-touch processing parallel and symmetrical moving mode Change-Id: I0d928641b6cb66984d3bc7795f71536f0570f203 Signed-off-by: GiWoong Kim --- diff --git a/tizen/src/ui/displaybase.cpp b/tizen/src/ui/displaybase.cpp index 54fbec7..e0185ce 100644 --- a/tizen/src/ui/displaybase.cpp +++ b/tizen/src/ui/displaybase.cpp @@ -42,7 +42,7 @@ DisplayBase::DisplayBase(QRect rect, int angle, qreal scaleFactor, this->rotateAngle = angle; this->scaleFactor = scaleFactor; this->isDragging = false; - this->tsHelper = new TouchScreenHelper(); + this->tsHelper = new TouchScreenHelper(this); updateGeometry(); } diff --git a/tizen/src/ui/displaybase.h b/tizen/src/ui/displaybase.h index 495a44d..dfb815a 100644 --- a/tizen/src/ui/displaybase.h +++ b/tizen/src/ui/displaybase.h @@ -61,13 +61,13 @@ protected: void handleMouseRelease(QMouseEvent *event); void handleMouseMove(QMouseEvent *event); -private: - QWidget *widget; QRect rect; int rotateAngle; qreal scaleFactor; - bool isDragging; + +private: + QWidget *widget; TouchScreenHelper *tsHelper; }; diff --git a/tizen/src/ui/input/multitouchtracker.cpp b/tizen/src/ui/input/multitouchtracker.cpp index 1663fe5..099325b 100644 --- a/tizen/src/ui/input/multitouchtracker.cpp +++ b/tizen/src/ui/input/multitouchtracker.cpp @@ -31,6 +31,7 @@ #include #include "multitouchtracker.h" +#include "displaybase.h" extern "C" { void virtio_touchscreen_event(int x, int y, int z, int buttons_state); @@ -71,8 +72,10 @@ void TouchPoint::updatePos(QPoint hostPos, QPoint guestPos) this->guestPos = guestPos; } -MultiTouchTracker::MultiTouchTracker(int maxTouchPoint) +MultiTouchTracker::MultiTouchTracker( + TouchScreenHelper* parent, int maxTouchPoint) { + this->parent = parent; this->maxTouchPoint = maxTouchPoint; this->pointRadius = 16; // TODO: this->grabTouchPoint = NULL; @@ -188,13 +191,135 @@ void MultiTouchTracker::touchProcessingSepa(QPoint hostPos, QPoint guestPos) /* parallel moving mode */ void MultiTouchTracker::touchProcessingPara(QPoint hostPos, QPoint guestPos) { - //TODO: + TouchPoint *point = NULL; + const int touchCnt = touchPointList.count(); + + if (grabTouchPoint != NULL) { + const int hostPosDiffX = hostPos.x() - grabTouchPoint->getHostPos().x(); + const int hostPosDiffY = hostPos.y() - grabTouchPoint->getHostPos().y(); + + /* bounds checking */ + // TODO: + + /* move whole touch points */ + for (int i = 0; i < touchPointList.count(); i++) { + point = touchPointList.at(i); + if (point != NULL) { + QPoint hostMovedPos( + point->getHostPos().x() + hostPosDiffX, + point->getHostPos().y() + hostPosDiffY); + QPoint guestMovedPos = + ((DisplayBase *)parent->getParent())->getGuestPos(hostMovedPos); + point->updatePos(hostMovedPos, guestMovedPos); + + virtio_touchscreen_event( + point->getGuestPos().x(), point->getGuestPos().y(), + point->getID() - 1, 1); + } + } + + return; + } + + if (touchCnt == 0) { /* first touch input */ + qDebug("mt para mode processing"); + + if (addTouchPoint(hostPos, guestPos) == -1) { + return; + } + + virtio_touchscreen_event(guestPos.x(), guestPos.y(), 0, 1); + } else if ((point = searchTouchPoint(hostPos)) != NULL) { /* grab a touch */ + qDebug() << "ID" << point->getID() << "point is taken"; + grabTouchPoint = point; + } else if (touchCnt == getMaxTouchPoint()) { /* last touch */ + /* do nothing */ + return; + } else { /* additional touch */ + if (addTouchPoint(hostPos, guestPos) == -1) { + return; + } + + point = touchPointList.last(); + virtio_touchscreen_event(guestPos.x(), guestPos.y(), + point->getID() - 1, 1); + } } /* symmetrical moving mode */ void MultiTouchTracker::touchProcessingSymm(QPoint hostPos, QPoint guestPos) { - //TODO: + TouchPoint *point = NULL; + const int touchCnt = touchPointList.count(); + + if (grabTouchPoint != NULL) { + const int hostPosDiffX = hostPos.x() - grabTouchPoint->getHostPos().x(); + const int hostPosDiffY = hostPos.y() - grabTouchPoint->getHostPos().y(); + + /* move selected point */ + grabTouchPoint->updatePos(hostPos, guestPos); + virtio_touchscreen_event(guestPos.x(), guestPos.y(), + grabTouchPoint->getID() - 1, 1); + + /* bounds checking */ + // TODO: + + /* move other points */ + for (int i = 0; i < touchPointList.count(); i++) { + point = touchPointList.at(i); + if (point != NULL && point != grabTouchPoint) { + QPoint hostMovedPos( + point->getHostPos().x() - hostPosDiffX, + point->getHostPos().y() - hostPosDiffY); + QPoint guestMovedPos = + ((DisplayBase *)parent->getParent())->getGuestPos(hostMovedPos); + point->updatePos(hostMovedPos, guestMovedPos); + + virtio_touchscreen_event( + point->getGuestPos().x(), point->getGuestPos().y(), + point->getID() - 1, 1); + } + } + + return; + } + + if (touchCnt == 0) { /* first touch input */ + qDebug("mt symm mode processing"); + + if (addTouchPoint(hostPos, guestPos) == -1) { + return; + } + + virtio_touchscreen_event(guestPos.x(), guestPos.y(), 0, 1); + } else if ((point = searchTouchPoint(hostPos)) != NULL) { /* grab a touch */ + qDebug() << "ID" << point->getID() << "point is taken"; + grabTouchPoint = point; + } else if (touchCnt >= 2) { /* last touch */ + /* supports up to 2 touch points */ + point = touchPointList.last(); + if (point != NULL) { + /* re-input */ + qDebug() << "ID" << point->getID() << "point re-touching"; + + virtio_touchscreen_event( + point->getGuestPos().x(), point->getGuestPos().y(), + point->getID() - 1, 0); + + point->updatePos(hostPos, guestPos); + virtio_touchscreen_event( + point->getGuestPos().x(), point->getGuestPos().y(), + point->getID() - 1, 1); + } + } else { /* additional touch */ + if (addTouchPoint(hostPos, guestPos) == -1) { + return; + } + + point = touchPointList.last(); + virtio_touchscreen_event(guestPos.x(), guestPos.y(), + point->getID() - 1, 1); + } } void MultiTouchTracker::touchReleasing() diff --git a/tizen/src/ui/input/multitouchtracker.h b/tizen/src/ui/input/multitouchtracker.h index 1032dac..2707cfd 100644 --- a/tizen/src/ui/input/multitouchtracker.h +++ b/tizen/src/ui/input/multitouchtracker.h @@ -30,6 +30,8 @@ #ifndef MULTITOUCHTRACKER_H #define MULTITOUCHTRACKER_H +class TouchScreenHelper; + class TouchPoint { public: @@ -50,7 +52,7 @@ private: class MultiTouchTracker { public: - MultiTouchTracker(int maxTouchPoint); + MultiTouchTracker(TouchScreenHelper* parent, int maxTouchPoint); ~MultiTouchTracker(); int getMaxTouchPoint(); @@ -64,6 +66,7 @@ public: void finishTracking(); private: + TouchScreenHelper *parent; int maxTouchPoint; int pointRadius; TouchPoint *grabTouchPoint; diff --git a/tizen/src/ui/input/touchscreenhelper.cpp b/tizen/src/ui/input/touchscreenhelper.cpp index 3649eaf..9350459 100644 --- a/tizen/src/ui/input/touchscreenhelper.cpp +++ b/tizen/src/ui/input/touchscreenhelper.cpp @@ -38,9 +38,16 @@ extern "C" { void virtio_touchscreen_event(int x, int y, int z, int buttons_state); } -TouchScreenHelper::TouchScreenHelper() +TouchScreenHelper::TouchScreenHelper(void *parent) { - this->mtTracker = new MultiTouchTracker(get_emul_max_touch_point()); + this->parent = parent; + this->mtTracker = + new MultiTouchTracker(this, get_emul_max_touch_point()); +} + +void *TouchScreenHelper::getParent() +{ + return parent; } void TouchScreenHelper::mousePressed(QMouseEvent *event, QPoint guestPos) diff --git a/tizen/src/ui/input/touchscreenhelper.h b/tizen/src/ui/input/touchscreenhelper.h index ff62907..286dfd7 100644 --- a/tizen/src/ui/input/touchscreenhelper.h +++ b/tizen/src/ui/input/touchscreenhelper.h @@ -35,9 +35,10 @@ class TouchScreenHelper { public: - TouchScreenHelper(); + TouchScreenHelper(void *parent); ~TouchScreenHelper(); + void *getParent(); void mousePressed(QMouseEvent *event, QPoint guestPos); void mouseReleased(QMouseEvent *event, QPoint guestPos); void mouseMoved(QMouseEvent *event, QPoint guestPos); @@ -45,6 +46,7 @@ public: void finishMtTracking(); private: + void *parent; MultiTouchTracker *mtTracker; };