summaryrefslogtreecommitdiffstats
path: root/src/gui/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/kernel')
-rw-r--r--src/gui/kernel/qevent.cpp88
-rw-r--r--src/gui/kernel/qevent.h31
-rw-r--r--src/gui/kernel/qevent_p.h2
-rw-r--r--src/gui/kernel/qwindowsysteminterface.h2
4 files changed, 101 insertions, 22 deletions
diff --git a/src/gui/kernel/qevent.cpp b/src/gui/kernel/qevent.cpp
index 254b8926c8..219f782737 100644
--- a/src/gui/kernel/qevent.cpp
+++ b/src/gui/kernel/qevent.cpp
@@ -44,6 +44,7 @@
#include "qpa/qplatformdrag.h"
#include "private/qevent_p.h"
#include "qfile.h"
+#include "qhashfunctions.h"
#include "qmetaobject.h"
#include "qmimedata.h"
#include "private/qdnd_p.h"
@@ -4474,14 +4475,14 @@ int QTouchEvent::TouchPoint::id() const
\since 5.8
Returns the unique ID of this touch point or token, if any.
- It is normally invalid (with a \l {QPointerUniqueId::numeric()} {numeric()} value of -1),
+ It is normally invalid (see \l {QPointingDeviceUniqueId::isValid()} {isValid()}),
because touchscreens cannot uniquely identify fingers. But when the
\l {TouchPoint::InfoFlag} {Token} flag is set, it is expected to uniquely
identify a specific token (fiducial object).
\sa flags
*/
-QPointerUniqueId QTouchEvent::TouchPoint::uniqueId() const
+QPointingDeviceUniqueId QTouchEvent::TouchPoint::uniqueId() const
{
return d->uniqueId;
}
@@ -4757,7 +4758,7 @@ void QTouchEvent::TouchPoint::setUniqueId(qint64 uid)
{
if (d->ref.load() != 1)
d = d->detach();
- d->uniqueId = QPointerUniqueId(uid);
+ d->uniqueId = QPointingDeviceUniqueId::fromNumericId(uid);
}
/*! \internal */
@@ -5176,36 +5177,99 @@ Qt::ApplicationState QApplicationStateChangeEvent::applicationState() const
}
/*!
- \class QPointerUniqueId
+ \class QPointingDeviceUniqueId
\since 5.8
\ingroup events
\inmodule QtGui
- \brief QPointerUniqueId identifies a unique object, such as a tagged token
+ \brief QPointingDeviceUniqueId identifies a unique object, such as a tagged token
or stylus, which is used with a pointing device.
+ QPointingDeviceUniqueIds can be compared for equality, and can be used as keys in a QHash.
+ You get access to the numerical ID via numericId(), if the device supports such IDs.
+ For future extensions, though, you should not use that function, but compare objects
+ of this type using the equality operator.
+
+ This class is a thin wrapper around an integer ID. You pass it into and out of
+ functions by value.
+
+ This type actively prevents you from holding it in a QList, because doing so would
+ be very inefficient. Use a QVector instead, which has the same API as QList, but more
+ efficient storage.
+
\sa QTouchEvent::TouchPoint
*/
/*!
- Constructs a unique pointer ID with a numeric \a id provided by the hardware.
- The default is -1, which means an invalid pointer ID.
+ \fn QPointingDeviceUniqueId::QPointingDeviceUniqueId()
+ Constructs an invalid unique pointer ID.
+*/
+
+/*!
+ Constructs a unique pointer ID from numeric ID \a id.
*/
-QPointerUniqueId::QPointerUniqueId(qint64 id)
- : m_numericId(id)
+QPointingDeviceUniqueId QPointingDeviceUniqueId::fromNumericId(qint64 id)
{
+ QPointingDeviceUniqueId result;
+ result.m_numericId = id;
+ return result;
}
/*!
- \property QPointerUniqueId::numeric
+ \fn bool QPointingDeviceUniqueId::isValid() const
+
+ Returns whether this unique pointer ID is valid, that is, it represents an actual
+ pointer.
+*/
+
+/*!
+ \property QPointingDeviceUniqueId::numericId
\brief the numeric unique ID of the token represented by a touchpoint
- This is the numeric unique ID if the device provides that type of ID;
+ If the device provides a numeric ID, isValid() returns true, and this
+ property provides the numeric ID;
otherwise it is -1.
+
+ You should not use the value of this property in portable code, but
+ instead rely on equality to identify pointers.
+
+ \sa isValid()
*/
-qint64 QPointerUniqueId::numeric() const
+qint64 QPointingDeviceUniqueId::numericId() const Q_DECL_NOTHROW
{
return m_numericId;
}
+/*!
+ \relates QPointingDeviceUniqueId
+ \since 5.8
+
+ Returns whether the two unique pointer IDs \a lhs and \a rhs identify the same pointer
+ (\c true) or not (\c false).
+*/
+bool operator==(QPointingDeviceUniqueId lhs, QPointingDeviceUniqueId rhs) Q_DECL_NOTHROW
+{
+ return lhs.numericId() == rhs.numericId();
+}
+
+/*!
+ \fn bool operator!=(QPointingDeviceUniqueId lhs, QPointingDeviceUniqueId rhs)
+ \relates QPointingDeviceUniqueId
+ \since 5.8
+
+ Returns whether the two unique pointer IDs \a lhs and \a rhs identify different pointers
+ (\c true) or not (\c false).
+*/
+
+/*!
+ \relates QPointingDeviceUniqueId
+ \since 5.8
+
+ Returns the hash value for \a key, using \a seed to seed the calculation.
+*/
+uint qHash(QPointingDeviceUniqueId key, uint seed) Q_DECL_NOTHROW
+{
+ return qHash(key.numericId(), seed);
+}
+
QT_END_NAMESPACE
diff --git a/src/gui/kernel/qevent.h b/src/gui/kernel/qevent.h
index a062331bd8..7881df205a 100644
--- a/src/gui/kernel/qevent.h
+++ b/src/gui/kernel/qevent.h
@@ -793,21 +793,36 @@ inline bool operator==(QKeyEvent *e, QKeySequence::StandardKey key){return (e ?
inline bool operator==(QKeySequence::StandardKey key, QKeyEvent *e){return (e ? e->matches(key) : false);}
#endif // QT_NO_SHORTCUT
-class QPointerUniqueIdPrivate;
-class Q_GUI_EXPORT QPointerUniqueId
+class Q_GUI_EXPORT QPointingDeviceUniqueId
{
Q_GADGET
- Q_PROPERTY(qint64 numeric READ numeric CONSTANT)
+ Q_PROPERTY(qint64 numericId READ numericId CONSTANT)
public:
- explicit QPointerUniqueId(qint64 id = -1);
+ Q_ALWAYS_INLINE
+ Q_DECL_CONSTEXPR QPointingDeviceUniqueId() Q_DECL_NOTHROW : m_numericId(-1) {}
+ // compiler-generated copy/move ctor/assignment operators are ok!
+ // compiler-generated dtor is ok!
- qint64 numeric() const;
+ static QPointingDeviceUniqueId fromNumericId(qint64 id);
+
+ Q_ALWAYS_INLINE Q_DECL_CONSTEXPR bool isValid() const Q_DECL_NOTHROW { return m_numericId != -1; }
+ qint64 numericId() const Q_DECL_NOTHROW;
private:
- // TODO for TUIO 2, or any other type of complex token ID, a d-pointer can replace
- // m_numericId without changing the size of this class.
+ // TODO: for TUIO 2, or any other type of complex token ID, an internal
+ // array (or hash) can be added to hold additional properties.
+ // In this case, m_numericId will then turn into an index into that array (or hash).
qint64 m_numericId;
};
+Q_DECLARE_TYPEINFO(QPointingDeviceUniqueId, Q_MOVABLE_TYPE);
+template <> class QList<QPointingDeviceUniqueId> {}; // to prevent instantiation: use QVector instead
+
+Q_GUI_EXPORT bool operator==(QPointingDeviceUniqueId lhs, QPointingDeviceUniqueId rhs) Q_DECL_NOTHROW;
+inline bool operator!=(QPointingDeviceUniqueId lhs, QPointingDeviceUniqueId rhs) Q_DECL_NOTHROW
+{ return !operator==(lhs, rhs); }
+Q_GUI_EXPORT uint qHash(QPointingDeviceUniqueId key, uint seed = 0) Q_DECL_NOTHROW;
+
+
class QTouchEventTouchPointPrivate;
class Q_GUI_EXPORT QTouchEvent : public QInputEvent
@@ -844,7 +859,7 @@ public:
{ qSwap(d, other.d); }
int id() const;
- QPointerUniqueId uniqueId() const;
+ QPointingDeviceUniqueId uniqueId() const;
Qt::TouchPointState state() const;
diff --git a/src/gui/kernel/qevent_p.h b/src/gui/kernel/qevent_p.h
index 7e82b9c654..898ad16cf6 100644
--- a/src/gui/kernel/qevent_p.h
+++ b/src/gui/kernel/qevent_p.h
@@ -80,7 +80,7 @@ public:
QAtomicInt ref;
int id;
- QPointerUniqueId uniqueId;
+ QPointingDeviceUniqueId uniqueId;
Qt::TouchPointStates state;
QRectF rect, sceneRect, screenRect;
QPointF normalizedPos,
diff --git a/src/gui/kernel/qwindowsysteminterface.h b/src/gui/kernel/qwindowsysteminterface.h
index 3be3c3188c..a28d1c93df 100644
--- a/src/gui/kernel/qwindowsysteminterface.h
+++ b/src/gui/kernel/qwindowsysteminterface.h
@@ -129,7 +129,7 @@ public:
TouchPoint() : id(0), uniqueId(-1), pressure(0), rotation(0), state(Qt::TouchPointStationary) { }
int id; // for application use
qint64 uniqueId; // for TUIO: object/token ID; otherwise empty
- // TODO for TUIO 2.0: add registerPointerUniqueID(QPointerUniqueId)
+ // TODO for TUIO 2.0: add registerPointerUniqueID(QPointingDeviceUniqueId)
QPointF normalPosition; // touch device coordinates, (0 to 1, 0 to 1)
QRectF area; // the touched area, centered at position in screen coordinates
qreal pressure; // 0 to 1