aboutsummaryrefslogtreecommitdiffstats
path: root/tests/manual/pointer/inputinspector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/manual/pointer/inputinspector.cpp')
-rw-r--r--tests/manual/pointer/inputinspector.cpp197
1 files changed, 197 insertions, 0 deletions
diff --git a/tests/manual/pointer/inputinspector.cpp b/tests/manual/pointer/inputinspector.cpp
new file mode 100644
index 0000000000..82d814b848
--- /dev/null
+++ b/tests/manual/pointer/inputinspector.cpp
@@ -0,0 +1,197 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the manual tests of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "inputinspector.h"
+#include <QtQuick/QQuickWindow>
+#include <QtQuick/QQuickItem>
+#include <QtQuick/private/qquickpointerhandler_p.h>
+#include <QtCore/QSet>
+
+static const int timerInterval = 100;
+
+InputInspector::InputInspector(QObject *parent) : QObject(parent)
+{
+}
+
+InputInspector::~InputInspector()
+{
+ m_window = nullptr;
+ killTimer(m_timerId);
+}
+
+QString InputInspector::mouseGrabber() const
+{
+ QString name;
+ if (m_window) {
+ if (QQuickItem *grabber = m_window->mouseGrabberItem()) {
+ name = objectIdentifier(grabber);
+ } else {
+ name = QLatin1String("no grabber");
+ }
+ } else {
+ name = "ERROR: need a source window";
+ }
+ return name;
+}
+
+QString InputInspector::passiveGrabbers() const
+{
+ return vectorStringJoin(passiveGrabbers_helper());
+}
+
+QString InputInspector::exclusiveGrabbers() const
+{
+ return vectorStringJoin(exclusiveGrabbers_helper());
+}
+
+QString InputInspector::vectorStringJoin(const QVector<QObject*> &arr) const
+{
+ QString res;
+ for (QObject* obj: arr) {
+ if (!res.isEmpty())
+ res += QLatin1String(" , ");
+ res += objectIdentifier(obj);
+ }
+ res.prepend(QLatin1String("["));
+ res += QLatin1String("]");
+ return res;
+}
+
+QQuickWindow *InputInspector::source() const
+{
+ return m_window;
+}
+
+void InputInspector::setSource(QQuickWindow *window)
+{
+ m_window = window;
+ if (m_window && !m_timerId)
+ m_timerId = startTimer(timerInterval);
+ emit sourceChanged();
+}
+
+void InputInspector::update()
+{
+ const QString mouseGrabberName = mouseGrabber();
+ if (lastState.mouseGrabber != mouseGrabberName) {
+ emit mouseGrabberChanged();
+ lastState.mouseGrabber = mouseGrabberName;
+ }
+
+ const QString tempPassiveGrabbers = passiveGrabbers();
+ if (lastState.passiveGrabbers != tempPassiveGrabbers) {
+ emit passiveGrabbersChanged();
+ lastState.passiveGrabbers = tempPassiveGrabbers;
+ }
+
+ const QString tempExclusiveGrabbers = exclusiveGrabbers();
+ if (lastState.exclusiveGrabbers != tempExclusiveGrabbers) {
+ emit exclusiveGrabbersChanged();
+ lastState.exclusiveGrabbers = tempExclusiveGrabbers;
+ }
+}
+
+void InputInspector::timerEvent(QTimerEvent *event)
+{
+ if (event->timerId() == m_timerId)
+ update();
+}
+
+QQuickPointerDevice *InputInspector::pointerDevice() const
+{
+ QQuickPointerDevice *device = QQuickPointerDevice::touchDevices().value(0);
+ if (!device)
+ device = QQuickPointerDevice::genericMouseDevice();
+ return device;
+}
+
+QVector<QObject*> InputInspector::passiveGrabbers_helper(int pointId /*= 0*/) const
+{
+ QVector<QObject*> result;
+ QSet<QObject*> visited;
+ QQuickPointerDevice *device = pointerDevice();
+ if (device && source()) {
+ QQuickWindowPrivate *winPriv = QQuickWindowPrivate::get(source());
+ QQuickPointerEvent *pointerEvent = winPriv->pointerEventInstance(device);
+ if (pointerEvent) {
+ for (int i = 0; i < pointerEvent->pointCount(); ++i) {
+ QQuickEventPoint *eventPoint = pointerEvent->point(i);
+ QVector<QPointer <QQuickPointerHandler> > passives = eventPoint->passiveGrabbers();
+ if (!pointId || eventPoint->pointId() == pointId) {
+ for (auto it = passives.constBegin(); it != passives.constEnd(); ++it) {
+ QObject *handler = it->data();
+ if (!visited.contains(handler)) {
+ result << it->data();
+ visited << handler;
+ }
+ }
+ }
+ }
+ }
+ }
+ return result;
+}
+
+QVector<QObject*> InputInspector::exclusiveGrabbers_helper(int pointId /*= 0*/) const
+{
+ QVector<QObject*> result;
+ QSet<QObject*> visited;
+ QQuickPointerDevice *device = pointerDevice();
+ if (device && source()) {
+ QQuickWindowPrivate *winPriv = QQuickWindowPrivate::get(source());
+ QQuickPointerEvent *pointerEvent = winPriv->pointerEventInstance(device);
+ if (pointerEvent) {
+ for (int i = 0; i < pointerEvent->pointCount(); ++i) {
+ QQuickEventPoint *eventPoint = pointerEvent->point(i);
+ if (!pointId || eventPoint->pointId() == pointId) {
+ if (QObject *exclusiveGrabber = eventPoint->exclusiveGrabber()) {
+ if (!visited.contains(exclusiveGrabber)) {
+ result << exclusiveGrabber;
+ visited << exclusiveGrabber;
+ }
+ }
+ }
+ }
+ }
+ }
+ return result;
+}
+
+QString InputInspector::objectIdentifier(QObject *o)
+{
+ QString name;
+ name = o->objectName();
+ if (name.isEmpty())
+ name = o->property("text").toString();
+ if (name.isEmpty())
+ name = o->metaObject()->className();
+ if (name.isEmpty())
+ name = QLatin1String("unknown");
+
+ return name;
+}