diff options
Diffstat (limited to 'src/testlib/qtestmouse.h')
-rw-r--r-- | src/testlib/qtestmouse.h | 87 |
1 files changed, 32 insertions, 55 deletions
diff --git a/src/testlib/qtestmouse.h b/src/testlib/qtestmouse.h index fe89f371ca..567d80c521 100644 --- a/src/testlib/qtestmouse.h +++ b/src/testlib/qtestmouse.h @@ -1,41 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtTest 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) 2021 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 #ifndef QTESTMOUSE_H #define QTESTMOUSE_H @@ -93,6 +57,12 @@ namespace QTest event. We expect all event-handling code to rely on the event timestamps, not the system clock; therefore tests can be run faster than real-time. + + If \a delay is not given, a default minimum mouse delay is used, and + unintended double-click events are prevented by incrementing the + timestamp by 500ms after each mouse release. Therefore, to test + double-clicks, it's necessary to give a realistic \a delay value (for + example, 10ms). */ static void mouseEvent(MouseAction action, QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey, QPoint pos, int delay=-1) @@ -107,16 +77,15 @@ namespace QTest pos.x(), pos.y(), windowSize.width(), windowSize.height()); } - if (delay == -1 || delay < defaultMouseDelay()) - delay = defaultMouseDelay(); - lastMouseTimestamp += qMax(1, delay); + int actualDelay = (delay == -1 || delay < defaultMouseDelay()) ? defaultMouseDelay() : delay; + lastMouseTimestamp += qMax(1, actualDelay); if (pos.isNull()) pos = QPoint(window->width() / 2, window->height() / 2); - QTEST_ASSERT(uint(stateKey) == 0 || stateKey & Qt::KeyboardModifierMask); + QTEST_ASSERT(!stateKey || stateKey & Qt::KeyboardModifierMask); - stateKey &= static_cast<unsigned int>(Qt::KeyboardModifierMask); + stateKey &= Qt::KeyboardModifierMask; QPointF global = window->mapToGlobal(pos); QPointer<QWindow> w(window); @@ -144,7 +113,8 @@ namespace QTest qtestMouseButtons.setFlag(button, false); qt_handleMouseEvent(w, pos, global, qtestMouseButtons, button, QEvent::MouseButtonRelease, stateKey, lastMouseTimestamp); - lastMouseTimestamp += mouseDoubleClickInterval; // avoid double clicks being generated + if (delay == -1) + lastMouseTimestamp += mouseDoubleClickInterval; // avoid double clicks being generated break; case MouseMove: qt_handleMouseEvent(w, pos, global, qtestMouseButtons, Qt::NoButton, QEvent::MouseMove, @@ -201,34 +171,41 @@ namespace QTest return; } - QTEST_ASSERT(stateKey == 0 || stateKey & Qt::KeyboardModifierMask); + QTEST_ASSERT(!stateKey || stateKey & Qt::KeyboardModifierMask); - stateKey &= static_cast<unsigned int>(Qt::KeyboardModifierMask); + stateKey &= Qt::KeyboardModifierMask; - QEvent::Type meType; - Qt::MouseButton meButton; + QEvent::Type meType = QEvent::None; + using namespace QTestPrivate; switch (action) { case MousePress: + qtestMouseButtons.setFlag(button, true); meType = QEvent::MouseButtonPress; - meButton = button; break; case MouseRelease: + qtestMouseButtons.setFlag(button, false); meType = QEvent::MouseButtonRelease; - meButton = Qt::MouseButton(); break; case MouseDClick: + qtestMouseButtons.setFlag(button, true); meType = QEvent::MouseButtonDblClick; - meButton = button; break; case MouseMove: - QCursor::setPos(widget->mapToGlobal(pos)); - qApp->processEvents(); - return; + // ### Qt 7: compatibility with < Qt 6.3, we should not rely on QCursor::setPos + // for generating mouse move events, and code that depends on QCursor::pos should + // be tested using QCursor::setPos explicitly. + if (qtestMouseButtons == Qt::NoButton) { + QCursor::setPos(widget->mapToGlobal(pos)); + qApp->processEvents(); + return; + } + meType = QEvent::MouseMove; + break; default: QTEST_ASSERT(false); } - QMouseEvent me(meType, pos, widget->mapToGlobal(pos), button, meButton, stateKey, QPointingDevice::primaryPointingDevice()); + QMouseEvent me(meType, pos, widget->mapToGlobal(pos), button, qtestMouseButtons, stateKey, QPointingDevice::primaryPointingDevice()); me.setTimestamp(lastMouseTimestamp); if (action == MouseRelease) // avoid double clicks being generated lastMouseTimestamp += mouseDoubleClickInterval; |