diff options
author | Bjørn Erik Nilsen <bjorn.nilsen@nokia.com> | 2011-09-19 15:03:53 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-09-19 16:37:51 +0200 |
commit | 9d7e365918abd57a6336e59a23f36805a0df560a (patch) | |
tree | 882eed6b394b2237ed9bdca30830219fc1a66aab /src/widgets/platforms/mac | |
parent | 003060e2928209b8028fa176b6c8b19777f1617b (diff) |
Mac: Move multitouch support from widgets to cocoa platform plugin.
Change-Id: I91994801aefa1257e7bda51b409290f70ab9128e
Reviewed-on: http://codereview.qt-project.org/5151
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@nokia.com>
Diffstat (limited to 'src/widgets/platforms/mac')
-rw-r--r-- | src/widgets/platforms/mac/qmultitouch_mac.mm | 218 | ||||
-rw-r--r-- | src/widgets/platforms/mac/qmultitouch_mac_p.h | 102 |
2 files changed, 0 insertions, 320 deletions
diff --git a/src/widgets/platforms/mac/qmultitouch_mac.mm b/src/widgets/platforms/mac/qmultitouch_mac.mm deleted file mode 100644 index 30b0acb388..0000000000 --- a/src/widgets/platforms/mac/qmultitouch_mac.mm +++ /dev/null @@ -1,218 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <private/qmultitouch_mac_p.h> -#include <qcursor.h> - -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 - -QT_BEGIN_NAMESPACE - -#ifdef QT_MAC_USE_COCOA - -QHash<qint64, QCocoaTouch*> QCocoaTouch::_currentTouches; -QPointF QCocoaTouch::_screenReferencePos; -QPointF QCocoaTouch::_trackpadReferencePos; -int QCocoaTouch::_idAssignmentCount = 0; -int QCocoaTouch::_touchCount = 0; -bool QCocoaTouch::_updateInternalStateOnly = true; - -QCocoaTouch::QCocoaTouch(NSTouch *nstouch) -{ - if (_currentTouches.size() == 0) - _idAssignmentCount = 0; - - _touchPoint.setId(_idAssignmentCount++); - _touchPoint.setPressure(1.0); - _identity = qint64([nstouch identity]); - _currentTouches.insert(_identity, this); - updateTouchData(nstouch, NSTouchPhaseBegan); -} - -QCocoaTouch::~QCocoaTouch() -{ - _currentTouches.remove(_identity); -} - -void QCocoaTouch::updateTouchData(NSTouch *nstouch, NSTouchPhase phase) -{ - if (_touchCount == 1) - _touchPoint.setState(toTouchPointState(phase) | Qt::TouchPointPrimary); - else - _touchPoint.setState(toTouchPointState(phase)); - - // From the normalized position on the trackpad, calculate - // where on screen the touchpoint should be according to the - // reference position: - NSPoint npos = [nstouch normalizedPosition]; - QPointF qnpos = QPointF(npos.x, 1 - npos.y); - _touchPoint.setNormalizedPos(qnpos); - - if (_touchPoint.id() == 0 && phase == NSTouchPhaseBegan) { - _trackpadReferencePos = qnpos; - _screenReferencePos = QCursor::pos(); - } - - NSSize dsize = [nstouch deviceSize]; - float ppiX = (qnpos.x() - _trackpadReferencePos.x()) * dsize.width; - float ppiY = (qnpos.y() - _trackpadReferencePos.y()) * dsize.height; - QPointF relativePos = _trackpadReferencePos - QPointF(ppiX, ppiY); - _touchPoint.setScreenPos(_screenReferencePos - relativePos); -} - -QCocoaTouch *QCocoaTouch::findQCocoaTouch(NSTouch *nstouch) -{ - qint64 identity = qint64([nstouch identity]); - if (_currentTouches.contains(identity)) - return _currentTouches.value(identity); - return 0; -} - -Qt::TouchPointState QCocoaTouch::toTouchPointState(NSTouchPhase nsState) -{ - Qt::TouchPointState qtState = Qt::TouchPointReleased; - switch (nsState) { - case NSTouchPhaseBegan: - qtState = Qt::TouchPointPressed; - break; - case NSTouchPhaseMoved: - qtState = Qt::TouchPointMoved; - break; - case NSTouchPhaseStationary: - qtState = Qt::TouchPointStationary; - break; - case NSTouchPhaseEnded: - case NSTouchPhaseCancelled: - qtState = Qt::TouchPointReleased; - break; - default: - break; - } - return qtState; -} - -QList<QTouchEvent::TouchPoint> -QCocoaTouch::getCurrentTouchPointList(NSEvent *event, bool acceptSingleTouch) -{ - QMap<int, QTouchEvent::TouchPoint> touchPoints; - NSSet *ended = [event touchesMatchingPhase:NSTouchPhaseEnded | NSTouchPhaseCancelled inView:nil]; - NSSet *active = [event - touchesMatchingPhase:NSTouchPhaseBegan | NSTouchPhaseMoved | NSTouchPhaseStationary - inView:nil]; - _touchCount = [active count]; - - // First: remove touches that were ended by the user. If we are - // currently not accepting single touches, a corresponding 'begin' - // has never been send to the app for these events. - // So should therefore not send the following removes either. - - for (int i=0; i<int([ended count]); ++i) { - NSTouch *touch = [[ended allObjects] objectAtIndex:i]; - QCocoaTouch *qcocoaTouch = findQCocoaTouch(touch); - if (qcocoaTouch) { - qcocoaTouch->updateTouchData(touch, [touch phase]); - if (!_updateInternalStateOnly) - touchPoints.insert(qcocoaTouch->_touchPoint.id(), qcocoaTouch->_touchPoint); - delete qcocoaTouch; - } - } - - bool wasUpdateInternalStateOnly = _updateInternalStateOnly; - _updateInternalStateOnly = !acceptSingleTouch && _touchCount < 2; - - // Next: update, or create, existing touches. - // We always keep track of all touch points, even - // when not accepting single touches. - - for (int i=0; i<int([active count]); ++i) { - NSTouch *touch = [[active allObjects] objectAtIndex:i]; - QCocoaTouch *qcocoaTouch = findQCocoaTouch(touch); - if (!qcocoaTouch) - qcocoaTouch = new QCocoaTouch(touch); - else - qcocoaTouch->updateTouchData(touch, wasUpdateInternalStateOnly ? NSTouchPhaseBegan : [touch phase]); - if (!_updateInternalStateOnly) - touchPoints.insert(qcocoaTouch->_touchPoint.id(), qcocoaTouch->_touchPoint); - } - - // Next: sadly, we need to check that our touch hash is in - // sync with cocoa. This is typically not the case after a system - // gesture happend (like a four-finger-swipe to show expose). - - if (_touchCount != _currentTouches.size()) { - // Remove all instances, and basically start from scratch: - touchPoints.clear(); - foreach (QCocoaTouch *qcocoaTouch, _currentTouches.values()) { - if (!_updateInternalStateOnly) { - qcocoaTouch->_touchPoint.setState(Qt::TouchPointReleased); - touchPoints.insert(qcocoaTouch->_touchPoint.id(), qcocoaTouch->_touchPoint); - } - delete qcocoaTouch; - } - _currentTouches.clear(); - _updateInternalStateOnly = !acceptSingleTouch; - return touchPoints.values(); - } - - // Finally: If this call _started_ to reject single - // touches, we need to fake a relase for the remaining - // touch now (and refake a begin for it later, if needed). - - if (_updateInternalStateOnly && !wasUpdateInternalStateOnly && !_currentTouches.isEmpty()) { - QCocoaTouch *qcocoaTouch = _currentTouches.values().first(); - qcocoaTouch->_touchPoint.setState(Qt::TouchPointReleased); - touchPoints.insert(qcocoaTouch->_touchPoint.id(), qcocoaTouch->_touchPoint); - // Since this last touch also will end up beeing the first - // touch (if the user adds a second finger without lifting - // the first), we promote it to be the primary touch: - qcocoaTouch->_touchPoint.setId(0); - _idAssignmentCount = 1; - } - - return touchPoints.values(); -} - -#endif - -QT_END_NAMESPACE - -#endif // MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 - diff --git a/src/widgets/platforms/mac/qmultitouch_mac_p.h b/src/widgets/platforms/mac/qmultitouch_mac_p.h deleted file mode 100644 index c69c49984a..0000000000 --- a/src/widgets/platforms/mac/qmultitouch_mac_p.h +++ /dev/null @@ -1,102 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists for the convenience -// of other Qt classes. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#ifndef QMULTITOUCH_MAC_P_H -#define QMULTITOUCH_MAC_P_H - -#ifdef QT_MAC_USE_COCOA -#import <Cocoa/Cocoa.h> -#endif - -#include <qevent.h> -#include <qhash.h> -#include <QtCore> - -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 - -QT_BEGIN_NAMESPACE - -#ifdef QT_MAC_USE_COCOA - -class QCocoaTouch -{ - public: - static QList<QTouchEvent::TouchPoint> getCurrentTouchPointList(NSEvent *event, bool acceptSingleTouch); - static void setMouseInDraggingState(bool inDraggingState); - - private: - static QHash<qint64, QCocoaTouch*> _currentTouches; - static QPointF _screenReferencePos; - static QPointF _trackpadReferencePos; - static int _idAssignmentCount; - static int _touchCount; - static bool _updateInternalStateOnly; - - QTouchEvent::TouchPoint _touchPoint; - qint64 _identity; - - QCocoaTouch(NSTouch *nstouch); - ~QCocoaTouch(); - - void updateTouchData(NSTouch *nstouch, NSTouchPhase phase); - static QCocoaTouch *findQCocoaTouch(NSTouch *nstouch); - static Qt::TouchPointState toTouchPointState(NSTouchPhase nsState); -}; - -#endif // QT_MAC_USE_COCOA - -QT_END_NAMESPACE - -#endif // MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 - -#endif // QMULTITOUCH_MAC_P_H - |