diff options
Diffstat (limited to 'tests/auto/other/qfocusevent/tst_qfocusevent.cpp')
-rw-r--r-- | tests/auto/other/qfocusevent/tst_qfocusevent.cpp | 97 |
1 files changed, 55 insertions, 42 deletions
diff --git a/tests/auto/other/qfocusevent/tst_qfocusevent.cpp b/tests/auto/other/qfocusevent/tst_qfocusevent.cpp index 0242f8a36e..8297b53ea1 100644 --- a/tests/auto/other/qfocusevent/tst_qfocusevent.cpp +++ b/tests/auto/other/qfocusevent/tst_qfocusevent.cpp @@ -1,33 +1,8 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite 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 <QtTest/QtTest> +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + + +#include <QTest> #include <qapplication.h> #include <qlineedit.h> #include <qmenu.h> @@ -41,12 +16,14 @@ #include <qpa/qplatformintegration.h> #include <private/qguiapplication_p.h> +#include <QtWidgets/private/qapplication_p.h> + QT_FORWARD_DECLARE_CLASS(QWidget) class FocusLineEdit : public QLineEdit { public: - FocusLineEdit( QWidget* parent = 0, const char* name = 0 ) : QLineEdit(name, parent) {} + FocusLineEdit(QWidget *parent = nullptr, const char *name = nullptr ) : QLineEdit(name, parent) {} int focusInEventReason; int focusOutEventReason; bool focusInEventRecieved; @@ -54,19 +31,19 @@ public: bool focusOutEventRecieved; bool focusOutEventLostFocus; protected: - virtual void keyPressEvent( QKeyEvent *e ) + virtual void keyPressEvent( QKeyEvent *e ) override { // qDebug( QString("keyPressEvent: %1").arg(e->key()) ); QLineEdit::keyPressEvent( e ); } - void focusInEvent( QFocusEvent* e ) + void focusInEvent( QFocusEvent* e ) override { QLineEdit::focusInEvent( e ); focusInEventReason = e->reason(); focusInEventGotFocus = e->gotFocus(); focusInEventRecieved = true; } - void focusOutEvent( QFocusEvent* e ) + void focusOutEvent( QFocusEvent* e ) override { QLineEdit::focusOutEvent( e ); focusOutEventReason = e->reason(); @@ -107,7 +84,7 @@ void tst_QFocusEvent::initTestCase() if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation)) QSKIP("QWindow::requestActivate() is not supported on this platform."); - testFocusWidget = new QWidget( 0 ); + testFocusWidget = new QWidget( nullptr ); childFocusWidgetOne = new FocusLineEdit( testFocusWidget ); childFocusWidgetOne->setGeometry( 10, 10, 180, 20 ); childFocusWidgetTwo = new FocusLineEdit( testFocusWidget ); @@ -137,7 +114,7 @@ void tst_QFocusEvent::initWidget() { // On X11 we have to ensure the event was processed before doing any checking, on Windows // this is processed straight away. - QApplication::setActiveWindow(testFocusWidget); + QApplicationPrivate::setActiveWindow(testFocusWidget); childFocusWidgetOne->setFocus(); // The first lineedit should have focus QVERIFY(QTest::qWaitForWindowActive(testFocusWidget)); QTRY_VERIFY(childFocusWidgetOne->hasFocus()); @@ -322,8 +299,8 @@ void tst_QFocusEvent::checkReason_focusWidget() QTRY_VERIFY(edit1.hasFocus()); edit2.setFocus(); - QVERIFY(frame1.focusWidget() != 0); - QVERIFY(frame2.focusWidget() != 0); + QVERIFY(frame1.focusWidget() != nullptr); + QVERIFY(frame2.focusWidget() != nullptr); } void tst_QFocusEvent::checkReason_ActiveWindow() @@ -335,7 +312,6 @@ void tst_QFocusEvent::checkReason_ActiveWindow() QVERIFY(QTest::qWaitForWindowExposed(d)); d->activateWindow(); // ### CDE - QApplication::setActiveWindow(d); QVERIFY(QTest::qWaitForWindowActive(d)); QTRY_VERIFY(childFocusWidgetOne->focusOutEventRecieved); @@ -344,7 +320,7 @@ void tst_QFocusEvent::checkReason_ActiveWindow() #if defined(Q_OS_WIN) if (QSysInfo::kernelVersion() == "10.0.15063") { // Activate window of testFocusWidget, focus in that window goes to childFocusWidgetOne - QWARN("Windows 10 Creators Update (10.0.15063) requires explicit activateWindow()"); + qWarning("Windows 10 Creators Update (10.0.15063) requires explicit activateWindow()"); testFocusWidget->activateWindow(); } #endif @@ -357,9 +333,10 @@ void tst_QFocusEvent::checkReason_ActiveWindow() d->hide(); if (!QGuiApplication::platformName().compare(QLatin1String("offscreen"), Qt::CaseInsensitive) - || !QGuiApplication::platformName().compare(QLatin1String("minimal"), Qt::CaseInsensitive)) { + || !QGuiApplication::platformName().compare(QLatin1String("minimal"), Qt::CaseInsensitive) + || !QGuiApplication::platformName().compare(QLatin1String("cocoa"), Qt::CaseInsensitive)) { // Activate window of testFocusWidget, focus in that window goes to childFocusWidgetOne - QWARN("Platforms offscreen and minimal require explicit activateWindow()"); + qWarning("Platforms offscreen, minimal and macOS require explicit activateWindow()"); testFocusWidget->activateWindow(); } @@ -369,6 +346,42 @@ void tst_QFocusEvent::checkReason_ActiveWindow() QVERIFY( childFocusWidgetOne->hasFocus() ); QVERIFY( childFocusWidgetOne->focusInEventRecieved ); QCOMPARE( childFocusWidgetOne->focusInEventReason, (int)Qt::ActiveWindowFocusReason); + + const bool windowActivationReasonFail = + QGuiApplication::platformName().toLower() == "minimal"; + + struct Window : public QWindow + { + Qt::FocusReason lastReason = Qt::NoFocusReason; + protected: + void focusInEvent(QFocusEvent *event) override + { + lastReason = event->reason(); + } + void focusOutEvent(QFocusEvent *event) override + { + lastReason = event->reason(); + } + }; + + Window window; + window.show(); + window.requestActivate(); + QVERIFY(QTest::qWaitForWindowActive(&window)); + + if (windowActivationReasonFail) + QEXPECT_FAIL("", "Platform doesn't set window activation reason for QWindow", Continue); + QCOMPARE(window.lastReason, Qt::ActiveWindowFocusReason); + window.lastReason = Qt::NoFocusReason; + + Window window2; + window2.show(); + window2.requestActivate(); + QVERIFY(QTest::qWaitForWindowActive(&window2)); + + if (windowActivationReasonFail) + QEXPECT_FAIL("", "Platform doesn't set window activation reason for QWindow", Continue); + QCOMPARE(window.lastReason, Qt::ActiveWindowFocusReason); } |