diff options
Diffstat (limited to 'src/gui/kernel/qtestsupport_gui.cpp')
-rw-r--r-- | src/gui/kernel/qtestsupport_gui.cpp | 171 |
1 files changed, 123 insertions, 48 deletions
diff --git a/src/gui/kernel/qtestsupport_gui.cpp b/src/gui/kernel/qtestsupport_gui.cpp index 79da26f2ca..869eddce49 100644 --- a/src/gui/kernel/qtestsupport_gui.cpp +++ b/src/gui/kernel/qtestsupport_gui.cpp @@ -1,43 +1,8 @@ -/**************************************************************************** -** -** Copyright (C) 2018 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** 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 Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** 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-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2018 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include <private/qguiapplication_p.h> +#include <private/qeventpoint_p.h> #include <qpa/qplatformintegration.h> @@ -45,6 +10,7 @@ #include "qwindow.h" #include <QtCore/qtestsupport_core.h> +#include <QtCore/qthread.h> #include <QtCore/QDebug> QT_BEGIN_NAMESPACE @@ -52,11 +18,18 @@ QT_BEGIN_NAMESPACE /*! \since 5.0 - Waits for \a timeout milliseconds or until the \a window is active. + Returns \c true, if \a window is active within \a timeout milliseconds. Otherwise returns \c false. - Returns \c true if \c window is active within \a timeout milliseconds, otherwise returns \c false. + The method is useful in tests that call QWindow::show() and rely on the window actually being + active (i.e. being visible and having focus) before proceeding. - \sa qWaitForWindowExposed(), QWindow::isActive() + \note The method will time out and return \c false if another window prevents \a window from + becoming active. + + \note Since focus is an exclusive property, \a window may loose its focus to another window at + any time - even after the method has returned \c true. + + \sa qWaitForWindowExposed(), qWaitForWindowFocused(), QWindow::isActive() */ Q_GUI_EXPORT bool QTest::qWaitForWindowActive(QWindow *window, int timeout) { @@ -72,17 +45,37 @@ Q_GUI_EXPORT bool QTest::qWaitForWindowActive(QWindow *window, int timeout) } /*! + \since 6.7 + + Returns \c true, if \a window is the focus window within \a timeout. Otherwise returns \c false. + + The method is useful in tests that call QWindow::show() and rely on the window + having focus (for receiving keyboard events e.g.) before proceeding. + + \note The method will time out and return \c false if another window prevents \a window from + becoming focused. + + \note Since focus is an exclusive property, \a window may loose its focus to another window at + any time - even after the method has returned \c true. + + \sa qWaitForWindowExposed(), qWaitForWindowActive(), QGuiApplication::focusWindow() +*/ +Q_GUI_EXPORT bool QTest::qWaitForWindowFocused(QWindow *window, QDeadlineTimer timeout) +{ + return QTest::qWaitFor([&]() { return qGuiApp->focusWindow() == window; }, timeout); +} + +/*! \since 5.0 - Waits for \a timeout milliseconds or until the \a window is exposed. - Returns \c true if \c window is exposed within \a timeout milliseconds, otherwise returns \c false. + Returns \c true, if \a window is exposed within \a timeout milliseconds. Otherwise returns \c false. - This is mainly useful for asynchronous systems like X11, where a window will be mapped to screen some - time after being asked to show itself on the screen. + The method is useful in tests that call QWindow::show() and rely on the window actually being + being visible before proceeding. - Note that a window that is mapped to screen may still not be considered exposed if the window client - area is completely covered by other windows, or if the window is otherwise not visible. This function - will then time out when waiting for such a window. + \note A window mapped to screen may still not be considered exposed, if the window client area is + not visible, e.g. because it is completely covered by other windows. + In such cases, the method will time out and return \c false. \sa qWaitForWindowActive(), QWindow::isExposed() */ @@ -91,4 +84,86 @@ Q_GUI_EXPORT bool QTest::qWaitForWindowExposed(QWindow *window, int timeout) return QTest::qWaitFor([&]() { return window->isExposed(); }, timeout); } +namespace QTest { + +QTouchEventSequence::~QTouchEventSequence() +{ + if (commitWhenDestroyed) + QTouchEventSequence::commit(); +} +QTouchEventSequence& QTouchEventSequence::press(int touchId, const QPoint &pt, QWindow *window) +{ + auto &p = point(touchId); + QMutableEventPoint::setGlobalPosition(p, mapToScreen(window, pt)); + QMutableEventPoint::setState(p, QEventPoint::State::Pressed); + return *this; +} +QTouchEventSequence& QTouchEventSequence::move(int touchId, const QPoint &pt, QWindow *window) +{ + auto &p = point(touchId); + QMutableEventPoint::setGlobalPosition(p, mapToScreen(window, pt)); + QMutableEventPoint::setState(p, QEventPoint::State::Updated); + return *this; +} +QTouchEventSequence& QTouchEventSequence::release(int touchId, const QPoint &pt, QWindow *window) +{ + auto &p = point(touchId); + QMutableEventPoint::setGlobalPosition(p, mapToScreen(window, pt)); + QMutableEventPoint::setState(p, QEventPoint::State::Released); + return *this; +} +QTouchEventSequence& QTouchEventSequence::stationary(int touchId) +{ + auto &p = pointOrPreviousPoint(touchId); + QMutableEventPoint::setState(p, QEventPoint::State::Stationary); + return *this; +} + +bool QTouchEventSequence::commit(bool processEvents) +{ + if (points.isEmpty()) + return false; + QThread::sleep(std::chrono::milliseconds{1}); + bool ret = false; + if (targetWindow) + ret = qt_handleTouchEventv2(targetWindow, device, points.values()); + if (processEvents) + QCoreApplication::processEvents(); + previousPoints = points; + points.clear(); + return ret; +} + +QTouchEventSequence::QTouchEventSequence(QWindow *window, QPointingDevice *aDevice, bool autoCommit) + : targetWindow(window), device(aDevice), commitWhenDestroyed(autoCommit) +{ +} + +QPoint QTouchEventSequence::mapToScreen(QWindow *window, const QPoint &pt) +{ + if (window) + return window->mapToGlobal(pt); + return targetWindow ? targetWindow->mapToGlobal(pt) : pt; +} + +QEventPoint &QTouchEventSequence::point(int touchId) +{ + if (!points.contains(touchId)) + points[touchId] = QEventPoint(touchId); + return points[touchId]; +} + +QEventPoint &QTouchEventSequence::pointOrPreviousPoint(int touchId) +{ + if (!points.contains(touchId)) { + if (previousPoints.contains(touchId)) + points[touchId] = previousPoints.value(touchId); + else + points[touchId] = QEventPoint(touchId); + } + return points[touchId]; +} + +} // namespace QTest + QT_END_NAMESPACE |