2011-08-29 06:26:37 +00:00
|
|
|
/****************************************************************************
|
|
|
|
**
|
2013-01-02 11:13:29 +00:00
|
|
|
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
|
2012-09-19 12:28:29 +00:00
|
|
|
** Contact: http://www.qt-project.org/legal
|
2011-08-29 06:26:37 +00:00
|
|
|
**
|
|
|
|
** This file is part of the test suite of the Qt Toolkit.
|
|
|
|
**
|
|
|
|
** $QT_BEGIN_LICENSE:LGPL$
|
2012-09-19 12:28:29 +00:00
|
|
|
** 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 Digia. For licensing terms and
|
|
|
|
** conditions see http://qt.digia.com/licensing. For further information
|
|
|
|
** use the contact form at http://qt.digia.com/contact-us.
|
|
|
|
**
|
2011-08-29 06:26:37 +00:00
|
|
|
** GNU Lesser General Public License Usage
|
2012-09-19 12:28:29 +00:00
|
|
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
|
|
** General Public License version 2.1 as published by the Free Software
|
|
|
|
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
|
|
** packaging of this file. Please review the following information to
|
|
|
|
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
|
|
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
2011-08-29 06:26:37 +00:00
|
|
|
**
|
2012-09-19 12:28:29 +00:00
|
|
|
** In addition, as a special exception, Digia gives you certain additional
|
|
|
|
** rights. These rights are described in the Digia Qt LGPL Exception
|
2011-08-29 06:26:37 +00:00
|
|
|
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
|
|
**
|
|
|
|
** GNU General Public License Usage
|
2012-09-19 12:28:29 +00:00
|
|
|
** Alternatively, this file may be used under the terms of the GNU
|
|
|
|
** General Public License version 3.0 as published by the Free Software
|
|
|
|
** Foundation and appearing in the file LICENSE.GPL included in the
|
|
|
|
** packaging of this file. Please review the following information to
|
|
|
|
** ensure the GNU General Public License version 3.0 requirements will be
|
|
|
|
** met: http://www.gnu.org/copyleft/gpl.html.
|
2011-08-29 06:26:37 +00:00
|
|
|
**
|
2012-01-24 06:17:24 +00:00
|
|
|
**
|
2011-08-29 06:26:37 +00:00
|
|
|
** $QT_END_LICENSE$
|
|
|
|
**
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#include <qwindow.h>
|
2012-07-26 11:23:28 +00:00
|
|
|
#include <qpa/qwindowsysteminterface.h>
|
2013-03-11 13:41:52 +00:00
|
|
|
#include <qpa/qplatformintegration.h>
|
|
|
|
#include <private/qguiapplication_p.h>
|
2011-09-22 12:37:58 +00:00
|
|
|
|
|
|
|
#include <QtTest/QtTest>
|
|
|
|
|
2011-12-12 15:24:33 +00:00
|
|
|
#include <QEvent>
|
2012-03-24 08:48:12 +00:00
|
|
|
#include <QStyleHints>
|
2011-12-12 15:24:33 +00:00
|
|
|
|
2012-02-16 11:50:22 +00:00
|
|
|
// For QSignalSpy slot connections.
|
|
|
|
Q_DECLARE_METATYPE(Qt::ScreenOrientation)
|
2013-02-08 09:49:52 +00:00
|
|
|
Q_DECLARE_METATYPE(QWindow::Visibility)
|
2012-02-16 11:50:22 +00:00
|
|
|
|
2011-08-29 06:26:37 +00:00
|
|
|
class tst_QWindow: public QObject
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
private slots:
|
2012-03-14 16:55:43 +00:00
|
|
|
void eventOrderOnShow();
|
2011-08-29 06:26:37 +00:00
|
|
|
void mapGlobal();
|
2011-09-22 12:37:58 +00:00
|
|
|
void positioning();
|
2012-03-14 16:55:43 +00:00
|
|
|
void isExposed();
|
2011-09-29 16:02:54 +00:00
|
|
|
void isActive();
|
2011-12-12 15:24:33 +00:00
|
|
|
void testInputEvents();
|
2012-01-12 07:53:13 +00:00
|
|
|
void touchToMouseTranslation();
|
|
|
|
void mouseToTouchTranslation();
|
|
|
|
void mouseToTouchLoop();
|
2012-02-09 12:39:40 +00:00
|
|
|
void touchCancel();
|
|
|
|
void touchCancelWithTouchToMouse();
|
2012-01-13 09:31:11 +00:00
|
|
|
void orientation();
|
2012-11-01 16:03:45 +00:00
|
|
|
void sizes();
|
2012-01-20 12:08:42 +00:00
|
|
|
void close();
|
2012-02-24 17:05:06 +00:00
|
|
|
void activateAndClose();
|
2012-03-24 08:48:12 +00:00
|
|
|
void mouseEventSequence();
|
2012-04-04 10:11:40 +00:00
|
|
|
void windowModality();
|
2012-04-23 13:18:01 +00:00
|
|
|
void inputReentrancy();
|
2012-05-23 12:07:39 +00:00
|
|
|
void tabletEvents();
|
2012-09-21 10:12:01 +00:00
|
|
|
void windowModality_QTBUG27039();
|
2013-02-08 09:49:52 +00:00
|
|
|
void visibility();
|
2013-02-25 07:54:30 +00:00
|
|
|
void mask();
|
2012-02-24 17:05:06 +00:00
|
|
|
|
2012-01-12 07:53:13 +00:00
|
|
|
void initTestCase()
|
|
|
|
{
|
|
|
|
touchDevice = new QTouchDevice;
|
|
|
|
touchDevice->setType(QTouchDevice::TouchScreen);
|
|
|
|
QWindowSystemInterface::registerTouchDevice(touchDevice);
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
QTouchDevice *touchDevice;
|
2011-08-29 06:26:37 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
void tst_QWindow::mapGlobal()
|
|
|
|
{
|
|
|
|
QWindow a;
|
|
|
|
QWindow b(&a);
|
|
|
|
QWindow c(&b);
|
|
|
|
|
|
|
|
a.setGeometry(10, 10, 300, 300);
|
|
|
|
b.setGeometry(20, 20, 200, 200);
|
|
|
|
c.setGeometry(40, 40, 100, 100);
|
|
|
|
|
|
|
|
QCOMPARE(a.mapToGlobal(QPoint(100, 100)), QPoint(110, 110));
|
|
|
|
QCOMPARE(b.mapToGlobal(QPoint(100, 100)), QPoint(130, 130));
|
|
|
|
QCOMPARE(c.mapToGlobal(QPoint(100, 100)), QPoint(170, 170));
|
|
|
|
|
|
|
|
QCOMPARE(a.mapFromGlobal(QPoint(100, 100)), QPoint(90, 90));
|
|
|
|
QCOMPARE(b.mapFromGlobal(QPoint(100, 100)), QPoint(70, 70));
|
|
|
|
QCOMPARE(c.mapFromGlobal(QPoint(100, 100)), QPoint(30, 30));
|
|
|
|
}
|
|
|
|
|
2011-09-22 12:37:58 +00:00
|
|
|
class Window : public QWindow
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Window()
|
|
|
|
{
|
2011-09-29 16:02:54 +00:00
|
|
|
reset();
|
Rename all QWindow properties that have "window" in them
windowTitle, windowModality, windowIcon and so on are named that way
to be similar to the ones in QWidget. However QQuickWindow inherits
all of the declared properties, and we would like to have shorter
property names in QML. If you are working with a Window then it's
obvious the title property is the window title. Unfortunately,
there must be patches in many other modules which depend on this one.
In order to avoid the need to merge them all at the same time,
there is also patch https://codereview.qt-project.org/#change,39001
which temporarily adds backwards-compatible accessors, which can be
removed after the other modules are able to build without them.
We should not rename windowState to state, because in QML, state
usually drives the state machine for animation transitions etc.
(although QWindow is not an Item, a user might get confused about it).
Related patches are
https://codereview.qt-project.org/#change,39001
https://codereview.qt-project.org/#change,37764
https://codereview.qt-project.org/#change,37765
https://codereview.qt-project.org/#change,37766
https://codereview.qt-project.org/#change,37762
Change-Id: Ie4424ec15fbdef6b29b137f90a2ae33f173edd21
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
2012-10-22 10:47:34 +00:00
|
|
|
setFlags(Qt::Window | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);
|
2011-09-22 12:37:58 +00:00
|
|
|
}
|
|
|
|
|
2011-09-29 16:02:54 +00:00
|
|
|
void reset()
|
|
|
|
{
|
|
|
|
m_received.clear();
|
|
|
|
}
|
|
|
|
|
2011-09-22 12:37:58 +00:00
|
|
|
bool event(QEvent *event)
|
|
|
|
{
|
2011-09-29 16:02:54 +00:00
|
|
|
m_received[event->type()]++;
|
2012-03-14 16:55:43 +00:00
|
|
|
m_order << event->type();
|
2011-09-22 12:37:58 +00:00
|
|
|
|
|
|
|
return QWindow::event(event);
|
|
|
|
}
|
|
|
|
|
2011-09-29 16:02:54 +00:00
|
|
|
int received(QEvent::Type type)
|
|
|
|
{
|
|
|
|
return m_received.value(type, 0);
|
|
|
|
}
|
|
|
|
|
2012-03-14 16:55:43 +00:00
|
|
|
int eventIndex(QEvent::Type type)
|
|
|
|
{
|
|
|
|
return m_order.indexOf(type);
|
|
|
|
}
|
|
|
|
|
2011-09-29 16:02:54 +00:00
|
|
|
private:
|
|
|
|
QHash<QEvent::Type, int> m_received;
|
2012-03-14 16:55:43 +00:00
|
|
|
QVector<QEvent::Type> m_order;
|
2011-09-22 12:37:58 +00:00
|
|
|
};
|
|
|
|
|
2012-03-14 16:55:43 +00:00
|
|
|
void tst_QWindow::eventOrderOnShow()
|
|
|
|
{
|
2012-04-27 13:45:24 +00:00
|
|
|
// Some platforms enforce minimum widths for windows, which can cause extra resize
|
|
|
|
// events, so set the width to suitably large value to avoid those.
|
|
|
|
QRect geometry(80, 80, 300, 40);
|
2012-03-14 16:55:43 +00:00
|
|
|
|
|
|
|
Window window;
|
|
|
|
window.setGeometry(geometry);
|
|
|
|
window.show();
|
2012-04-27 13:45:24 +00:00
|
|
|
QCoreApplication::processEvents();
|
2012-03-14 16:55:43 +00:00
|
|
|
|
|
|
|
QTRY_COMPARE(window.received(QEvent::Show), 1);
|
|
|
|
QTRY_COMPARE(window.received(QEvent::Resize), 1);
|
|
|
|
QTRY_VERIFY(window.isExposed());
|
|
|
|
|
|
|
|
QVERIFY(window.eventIndex(QEvent::Show) < window.eventIndex(QEvent::Resize));
|
|
|
|
QVERIFY(window.eventIndex(QEvent::Resize) < window.eventIndex(QEvent::Expose));
|
|
|
|
}
|
|
|
|
|
2011-09-22 12:37:58 +00:00
|
|
|
void tst_QWindow::positioning()
|
|
|
|
{
|
2012-06-06 09:31:41 +00:00
|
|
|
#ifdef Q_OS_MAC
|
|
|
|
// the fullscreen animation delay on OS X Lion also causes failures in
|
|
|
|
// the isActive() test below, so it's best to just skip it for now
|
|
|
|
QSKIP("Multiple failures in this test on Mac OS X, see QTBUG-23059");
|
|
|
|
#endif
|
|
|
|
|
2013-05-31 18:27:50 +00:00
|
|
|
|
|
|
|
if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(
|
|
|
|
QPlatformIntegration::NonFullScreenWindows)) {
|
|
|
|
QSKIP("This platform does not support non-fullscreen windows");
|
|
|
|
}
|
|
|
|
|
2012-04-27 13:45:24 +00:00
|
|
|
// Some platforms enforce minimum widths for windows, which can cause extra resize
|
|
|
|
// events, so set the width to suitably large value to avoid those.
|
2013-02-08 16:26:47 +00:00
|
|
|
const QSize size = QSize(300, 40);
|
|
|
|
const QRect geometry(QPoint(80, 80), size);
|
2011-09-22 12:37:58 +00:00
|
|
|
|
|
|
|
Window window;
|
2013-02-08 16:26:47 +00:00
|
|
|
window.setGeometry(QRect(QPoint(20, 20), size));
|
|
|
|
window.setFramePosition(QPoint(40, 40)); // Move window around before show, size must not change.
|
|
|
|
QCOMPARE(window.geometry().size(), size);
|
2011-09-22 12:37:58 +00:00
|
|
|
window.setGeometry(geometry);
|
|
|
|
QCOMPARE(window.geometry(), geometry);
|
2013-05-31 18:27:50 +00:00
|
|
|
// explicitly use non-fullscreen show. show() can be fullscreen on some platforms
|
|
|
|
window.showNormal();
|
2012-04-27 13:45:24 +00:00
|
|
|
QCoreApplication::processEvents();
|
2011-09-22 12:37:58 +00:00
|
|
|
|
2011-09-29 16:02:54 +00:00
|
|
|
QTRY_COMPARE(window.received(QEvent::Resize), 1);
|
2012-03-14 16:55:43 +00:00
|
|
|
QTRY_VERIFY(window.received(QEvent::Expose) > 0);
|
2011-09-22 12:37:58 +00:00
|
|
|
|
|
|
|
QMargins originalMargins = window.frameMargins();
|
|
|
|
|
2012-11-27 13:57:19 +00:00
|
|
|
QCOMPARE(window.position(), window.framePosition() + QPoint(originalMargins.left(), originalMargins.top()));
|
2011-09-22 12:37:58 +00:00
|
|
|
QVERIFY(window.frameGeometry().contains(window.geometry()));
|
|
|
|
|
2012-10-22 15:06:23 +00:00
|
|
|
QPoint originalPos = window.position();
|
2012-11-27 13:57:19 +00:00
|
|
|
QPoint originalFramePos = window.framePosition();
|
2011-09-22 12:37:58 +00:00
|
|
|
|
|
|
|
window.setWindowState(Qt::WindowFullScreen);
|
2012-04-27 13:45:24 +00:00
|
|
|
QCoreApplication::processEvents();
|
2011-09-29 16:02:54 +00:00
|
|
|
QTRY_COMPARE(window.received(QEvent::Resize), 2);
|
2011-09-22 12:37:58 +00:00
|
|
|
|
|
|
|
window.setWindowState(Qt::WindowNoState);
|
2012-04-27 13:45:24 +00:00
|
|
|
QCoreApplication::processEvents();
|
2011-09-29 16:02:54 +00:00
|
|
|
QTRY_COMPARE(window.received(QEvent::Resize), 3);
|
2011-09-22 12:37:58 +00:00
|
|
|
|
2012-10-22 15:06:23 +00:00
|
|
|
QTRY_COMPARE(originalPos, window.position());
|
2012-11-27 13:57:19 +00:00
|
|
|
QTRY_COMPARE(originalFramePos, window.framePosition());
|
2011-09-22 12:37:58 +00:00
|
|
|
QTRY_COMPARE(originalMargins, window.frameMargins());
|
|
|
|
|
|
|
|
// if our positioning is actually fully respected by the window manager
|
|
|
|
// test whether it correctly handles frame positioning as well
|
|
|
|
if (originalPos == geometry.topLeft() && (originalMargins.top() != 0 || originalMargins.left() != 0)) {
|
|
|
|
QPoint framePos(40, 40);
|
|
|
|
|
2011-09-29 16:02:54 +00:00
|
|
|
window.reset();
|
2012-11-27 13:57:19 +00:00
|
|
|
window.setFramePosition(framePos);
|
2011-09-22 12:37:58 +00:00
|
|
|
|
2011-09-29 16:02:54 +00:00
|
|
|
QTRY_VERIFY(window.received(QEvent::Move));
|
2012-11-27 13:57:19 +00:00
|
|
|
QTRY_COMPARE(framePos, window.framePosition());
|
2011-09-22 12:37:58 +00:00
|
|
|
QTRY_COMPARE(originalMargins, window.frameMargins());
|
2012-11-27 13:57:19 +00:00
|
|
|
QCOMPARE(window.position(), window.framePosition() + QPoint(originalMargins.left(), originalMargins.top()));
|
2011-09-22 12:37:58 +00:00
|
|
|
|
|
|
|
// and back to regular positioning
|
|
|
|
|
2011-09-29 16:02:54 +00:00
|
|
|
window.reset();
|
2012-10-22 15:06:23 +00:00
|
|
|
window.setPosition(originalPos);
|
2011-09-29 16:02:54 +00:00
|
|
|
QTRY_VERIFY(window.received(QEvent::Move));
|
2012-10-22 15:06:23 +00:00
|
|
|
QTRY_COMPARE(originalPos, window.position());
|
2011-09-22 12:37:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-03-14 16:55:43 +00:00
|
|
|
void tst_QWindow::isExposed()
|
|
|
|
{
|
|
|
|
QRect geometry(80, 80, 40, 40);
|
|
|
|
|
|
|
|
Window window;
|
|
|
|
window.setGeometry(geometry);
|
|
|
|
QCOMPARE(window.geometry(), geometry);
|
|
|
|
window.show();
|
2012-04-27 13:45:24 +00:00
|
|
|
QCoreApplication::processEvents();
|
2012-03-14 16:55:43 +00:00
|
|
|
|
|
|
|
QTRY_VERIFY(window.received(QEvent::Expose) > 0);
|
|
|
|
QTRY_VERIFY(window.isExposed());
|
|
|
|
|
|
|
|
window.hide();
|
|
|
|
|
2012-04-27 13:45:24 +00:00
|
|
|
QCoreApplication::processEvents();
|
2012-03-14 16:55:43 +00:00
|
|
|
QTRY_VERIFY(window.received(QEvent::Expose) > 1);
|
|
|
|
QTRY_VERIFY(!window.isExposed());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-09-29 16:02:54 +00:00
|
|
|
void tst_QWindow::isActive()
|
|
|
|
{
|
|
|
|
Window window;
|
2012-04-27 13:45:24 +00:00
|
|
|
// Some platforms enforce minimum widths for windows, which can cause extra resize
|
|
|
|
// events, so set the width to suitably large value to avoid those.
|
|
|
|
window.setGeometry(80, 80, 300, 40);
|
2011-09-29 16:02:54 +00:00
|
|
|
window.show();
|
2012-04-27 13:45:24 +00:00
|
|
|
QCoreApplication::processEvents();
|
2011-09-29 16:02:54 +00:00
|
|
|
|
2012-03-14 16:55:43 +00:00
|
|
|
QTRY_VERIFY(window.isExposed());
|
2011-09-29 16:02:54 +00:00
|
|
|
QTRY_COMPARE(window.received(QEvent::Resize), 1);
|
|
|
|
QTRY_VERIFY(QGuiApplication::focusWindow() == &window);
|
|
|
|
QVERIFY(window.isActive());
|
|
|
|
|
|
|
|
Window child;
|
|
|
|
child.setParent(&window);
|
|
|
|
child.setGeometry(10, 10, 20, 20);
|
|
|
|
child.show();
|
|
|
|
|
2012-03-14 16:55:43 +00:00
|
|
|
QTRY_VERIFY(child.isExposed());
|
2011-09-29 16:02:54 +00:00
|
|
|
|
Rename all QWindow properties that have "window" in them
windowTitle, windowModality, windowIcon and so on are named that way
to be similar to the ones in QWidget. However QQuickWindow inherits
all of the declared properties, and we would like to have shorter
property names in QML. If you are working with a Window then it's
obvious the title property is the window title. Unfortunately,
there must be patches in many other modules which depend on this one.
In order to avoid the need to merge them all at the same time,
there is also patch https://codereview.qt-project.org/#change,39001
which temporarily adds backwards-compatible accessors, which can be
removed after the other modules are able to build without them.
We should not rename windowState to state, because in QML, state
usually drives the state machine for animation transitions etc.
(although QWindow is not an Item, a user might get confused about it).
Related patches are
https://codereview.qt-project.org/#change,39001
https://codereview.qt-project.org/#change,37764
https://codereview.qt-project.org/#change,37765
https://codereview.qt-project.org/#change,37766
https://codereview.qt-project.org/#change,37762
Change-Id: Ie4424ec15fbdef6b29b137f90a2ae33f173edd21
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
2012-10-22 10:47:34 +00:00
|
|
|
child.requestActivate();
|
2011-09-29 16:02:54 +00:00
|
|
|
|
|
|
|
QTRY_VERIFY(QGuiApplication::focusWindow() == &child);
|
|
|
|
QVERIFY(child.isActive());
|
|
|
|
|
2012-03-14 16:55:43 +00:00
|
|
|
// parent shouldn't receive new resize events from child being shown
|
2012-04-27 13:45:24 +00:00
|
|
|
QCoreApplication::processEvents();
|
2011-09-29 16:02:54 +00:00
|
|
|
QTRY_COMPARE(window.received(QEvent::Resize), 1);
|
|
|
|
QTRY_COMPARE(window.received(QEvent::FocusIn), 1);
|
|
|
|
QTRY_COMPARE(window.received(QEvent::FocusOut), 1);
|
|
|
|
QTRY_COMPARE(child.received(QEvent::FocusIn), 1);
|
|
|
|
|
|
|
|
// child has focus
|
|
|
|
QVERIFY(window.isActive());
|
|
|
|
|
|
|
|
Window dialog;
|
|
|
|
dialog.setTransientParent(&window);
|
2012-04-27 13:45:24 +00:00
|
|
|
dialog.setGeometry(110, 110, 300, 30);
|
2011-09-29 16:02:54 +00:00
|
|
|
dialog.show();
|
|
|
|
|
Rename all QWindow properties that have "window" in them
windowTitle, windowModality, windowIcon and so on are named that way
to be similar to the ones in QWidget. However QQuickWindow inherits
all of the declared properties, and we would like to have shorter
property names in QML. If you are working with a Window then it's
obvious the title property is the window title. Unfortunately,
there must be patches in many other modules which depend on this one.
In order to avoid the need to merge them all at the same time,
there is also patch https://codereview.qt-project.org/#change,39001
which temporarily adds backwards-compatible accessors, which can be
removed after the other modules are able to build without them.
We should not rename windowState to state, because in QML, state
usually drives the state machine for animation transitions etc.
(although QWindow is not an Item, a user might get confused about it).
Related patches are
https://codereview.qt-project.org/#change,39001
https://codereview.qt-project.org/#change,37764
https://codereview.qt-project.org/#change,37765
https://codereview.qt-project.org/#change,37766
https://codereview.qt-project.org/#change,37762
Change-Id: Ie4424ec15fbdef6b29b137f90a2ae33f173edd21
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
2012-10-22 10:47:34 +00:00
|
|
|
dialog.requestActivate();
|
2011-09-29 16:02:54 +00:00
|
|
|
|
2012-03-14 16:55:43 +00:00
|
|
|
QTRY_VERIFY(dialog.isExposed());
|
2012-04-27 13:45:24 +00:00
|
|
|
QCoreApplication::processEvents();
|
2011-09-29 16:02:54 +00:00
|
|
|
QTRY_COMPARE(dialog.received(QEvent::Resize), 1);
|
|
|
|
QTRY_VERIFY(QGuiApplication::focusWindow() == &dialog);
|
|
|
|
QVERIFY(dialog.isActive());
|
|
|
|
|
|
|
|
// transient child has focus
|
|
|
|
QVERIFY(window.isActive());
|
|
|
|
|
|
|
|
// parent is active
|
|
|
|
QVERIFY(child.isActive());
|
|
|
|
|
Rename all QWindow properties that have "window" in them
windowTitle, windowModality, windowIcon and so on are named that way
to be similar to the ones in QWidget. However QQuickWindow inherits
all of the declared properties, and we would like to have shorter
property names in QML. If you are working with a Window then it's
obvious the title property is the window title. Unfortunately,
there must be patches in many other modules which depend on this one.
In order to avoid the need to merge them all at the same time,
there is also patch https://codereview.qt-project.org/#change,39001
which temporarily adds backwards-compatible accessors, which can be
removed after the other modules are able to build without them.
We should not rename windowState to state, because in QML, state
usually drives the state machine for animation transitions etc.
(although QWindow is not an Item, a user might get confused about it).
Related patches are
https://codereview.qt-project.org/#change,39001
https://codereview.qt-project.org/#change,37764
https://codereview.qt-project.org/#change,37765
https://codereview.qt-project.org/#change,37766
https://codereview.qt-project.org/#change,37762
Change-Id: Ie4424ec15fbdef6b29b137f90a2ae33f173edd21
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
2012-10-22 10:47:34 +00:00
|
|
|
window.requestActivate();
|
2011-09-29 16:02:54 +00:00
|
|
|
|
|
|
|
QTRY_VERIFY(QGuiApplication::focusWindow() == &window);
|
2012-04-27 13:45:24 +00:00
|
|
|
QCoreApplication::processEvents();
|
2011-09-29 16:02:54 +00:00
|
|
|
QTRY_COMPARE(dialog.received(QEvent::FocusOut), 1);
|
|
|
|
QTRY_COMPARE(window.received(QEvent::FocusIn), 2);
|
|
|
|
|
|
|
|
QVERIFY(window.isActive());
|
|
|
|
|
|
|
|
// transient parent has focus
|
|
|
|
QVERIFY(dialog.isActive());
|
|
|
|
|
|
|
|
// parent has focus
|
|
|
|
QVERIFY(child.isActive());
|
|
|
|
}
|
|
|
|
|
2011-12-12 15:24:33 +00:00
|
|
|
class InputTestWindow : public QWindow
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
void keyPressEvent(QKeyEvent *event) {
|
|
|
|
keyPressCode = event->key();
|
|
|
|
}
|
|
|
|
void keyReleaseEvent(QKeyEvent *event) {
|
|
|
|
keyReleaseCode = event->key();
|
|
|
|
}
|
|
|
|
void mousePressEvent(QMouseEvent *event) {
|
2012-01-23 08:28:58 +00:00
|
|
|
if (ignoreMouse) {
|
2012-01-12 07:53:13 +00:00
|
|
|
event->ignore();
|
2012-01-23 08:28:58 +00:00
|
|
|
} else {
|
2012-03-24 08:48:12 +00:00
|
|
|
++mousePressedCount;
|
|
|
|
mouseSequenceSignature += 'p';
|
2012-01-12 07:53:13 +00:00
|
|
|
mousePressButton = event->button();
|
2012-01-23 08:28:58 +00:00
|
|
|
mousePressScreenPos = event->screenPos();
|
2012-05-23 12:38:22 +00:00
|
|
|
mousePressLocalPos = event->localPos();
|
2012-04-23 13:18:01 +00:00
|
|
|
if (spinLoopWhenPressed)
|
|
|
|
QCoreApplication::processEvents();
|
2012-01-23 08:28:58 +00:00
|
|
|
}
|
2011-12-12 15:24:33 +00:00
|
|
|
}
|
|
|
|
void mouseReleaseEvent(QMouseEvent *event) {
|
2012-03-24 08:48:12 +00:00
|
|
|
if (ignoreMouse) {
|
2012-01-12 07:53:13 +00:00
|
|
|
event->ignore();
|
2012-03-24 08:48:12 +00:00
|
|
|
} else {
|
|
|
|
++mouseReleasedCount;
|
|
|
|
mouseSequenceSignature += 'r';
|
2012-01-12 07:53:13 +00:00
|
|
|
mouseReleaseButton = event->button();
|
2012-03-24 08:48:12 +00:00
|
|
|
}
|
2011-12-12 15:24:33 +00:00
|
|
|
}
|
2012-01-23 08:28:58 +00:00
|
|
|
void mouseMoveEvent(QMouseEvent *event) {
|
|
|
|
if (ignoreMouse) {
|
|
|
|
event->ignore();
|
|
|
|
} else {
|
2012-04-23 13:18:01 +00:00
|
|
|
++mouseMovedCount;
|
2012-01-23 08:28:58 +00:00
|
|
|
mouseMoveButton = event->button();
|
|
|
|
mouseMoveScreenPos = event->screenPos();
|
|
|
|
}
|
|
|
|
}
|
2012-03-24 08:48:12 +00:00
|
|
|
void mouseDoubleClickEvent(QMouseEvent *event) {
|
|
|
|
if (ignoreMouse) {
|
|
|
|
event->ignore();
|
|
|
|
} else {
|
|
|
|
++mouseDoubleClickedCount;
|
|
|
|
mouseSequenceSignature += 'd';
|
|
|
|
}
|
|
|
|
}
|
2011-12-12 15:24:33 +00:00
|
|
|
void touchEvent(QTouchEvent *event) {
|
2012-01-12 07:53:13 +00:00
|
|
|
if (ignoreTouch) {
|
|
|
|
event->ignore();
|
|
|
|
return;
|
|
|
|
}
|
2012-02-09 12:39:40 +00:00
|
|
|
touchEventType = event->type();
|
2011-12-12 15:24:33 +00:00
|
|
|
QList<QTouchEvent::TouchPoint> points = event->touchPoints();
|
|
|
|
for (int i = 0; i < points.count(); ++i) {
|
|
|
|
switch (points.at(i).state()) {
|
|
|
|
case Qt::TouchPointPressed:
|
|
|
|
++touchPressedCount;
|
2012-04-23 13:18:01 +00:00
|
|
|
if (spinLoopWhenPressed)
|
|
|
|
QCoreApplication::processEvents();
|
2011-12-12 15:24:33 +00:00
|
|
|
break;
|
|
|
|
case Qt::TouchPointReleased:
|
|
|
|
++touchReleasedCount;
|
|
|
|
break;
|
2012-02-09 12:39:40 +00:00
|
|
|
case Qt::TouchPointMoved:
|
|
|
|
++touchMovedCount;
|
|
|
|
break;
|
2012-01-12 07:53:13 +00:00
|
|
|
default:
|
|
|
|
break;
|
2011-12-12 15:24:33 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2012-03-24 08:48:12 +00:00
|
|
|
void resetCounters() {
|
2012-04-23 13:18:01 +00:00
|
|
|
mousePressedCount = mouseReleasedCount = mouseMovedCount = mouseDoubleClickedCount = 0;
|
2012-03-24 08:48:12 +00:00
|
|
|
mouseSequenceSignature = QString();
|
|
|
|
touchPressedCount = touchReleasedCount = touchMovedCount = 0;
|
|
|
|
}
|
2011-12-12 15:24:33 +00:00
|
|
|
|
|
|
|
InputTestWindow() {
|
|
|
|
keyPressCode = keyReleaseCode = 0;
|
2012-03-24 08:48:12 +00:00
|
|
|
mousePressButton = mouseReleaseButton = mouseMoveButton = 0;
|
2012-02-09 12:39:40 +00:00
|
|
|
ignoreMouse = ignoreTouch = false;
|
2012-04-23 13:18:01 +00:00
|
|
|
spinLoopWhenPressed = false;
|
2012-03-24 08:48:12 +00:00
|
|
|
resetCounters();
|
2011-12-12 15:24:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int keyPressCode, keyReleaseCode;
|
2012-01-23 08:28:58 +00:00
|
|
|
int mousePressButton, mouseReleaseButton, mouseMoveButton;
|
2012-04-23 13:18:01 +00:00
|
|
|
int mousePressedCount, mouseReleasedCount, mouseMovedCount, mouseDoubleClickedCount;
|
2012-03-24 08:48:12 +00:00
|
|
|
QString mouseSequenceSignature;
|
2012-05-23 12:38:22 +00:00
|
|
|
QPointF mousePressScreenPos, mouseMoveScreenPos, mousePressLocalPos;
|
2012-02-09 12:39:40 +00:00
|
|
|
int touchPressedCount, touchReleasedCount, touchMovedCount;
|
|
|
|
QEvent::Type touchEventType;
|
2012-01-12 07:53:13 +00:00
|
|
|
|
|
|
|
bool ignoreMouse, ignoreTouch;
|
2012-04-23 13:18:01 +00:00
|
|
|
|
|
|
|
bool spinLoopWhenPressed;
|
2011-12-12 15:24:33 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
void tst_QWindow::testInputEvents()
|
|
|
|
{
|
|
|
|
InputTestWindow window;
|
|
|
|
window.setGeometry(80, 80, 40, 40);
|
2013-05-31 18:27:50 +00:00
|
|
|
window.showNormal();
|
2012-07-20 10:49:12 +00:00
|
|
|
QVERIFY(QTest::qWaitForWindowExposed(&window));
|
2011-12-12 15:24:33 +00:00
|
|
|
|
|
|
|
QWindowSystemInterface::handleKeyEvent(&window, QEvent::KeyPress, Qt::Key_A, Qt::NoModifier);
|
|
|
|
QWindowSystemInterface::handleKeyEvent(&window, QEvent::KeyRelease, Qt::Key_A, Qt::NoModifier);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QCOMPARE(window.keyPressCode, int(Qt::Key_A));
|
|
|
|
QCOMPARE(window.keyReleaseCode, int(Qt::Key_A));
|
|
|
|
|
|
|
|
QPointF local(12, 34);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, local, local, Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, local, local, Qt::NoButton);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QCOMPARE(window.mousePressButton, int(Qt::LeftButton));
|
|
|
|
QCOMPARE(window.mouseReleaseButton, int(Qt::LeftButton));
|
2012-05-23 12:38:22 +00:00
|
|
|
QCOMPARE(window.mousePressLocalPos, local);
|
2011-12-12 15:24:33 +00:00
|
|
|
|
2012-01-12 07:53:13 +00:00
|
|
|
QList<QWindowSystemInterface::TouchPoint> points;
|
|
|
|
QWindowSystemInterface::TouchPoint tp1, tp2;
|
|
|
|
tp1.id = 1;
|
|
|
|
tp1.state = Qt::TouchPointPressed;
|
|
|
|
tp1.area = QRect(10, 10, 4, 4);
|
|
|
|
tp2.id = 2;
|
|
|
|
tp2.state = Qt::TouchPointPressed;
|
|
|
|
tp2.area = QRect(20, 20, 4, 4);
|
|
|
|
points << tp1 << tp2;
|
|
|
|
QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
|
|
|
|
points[0].state = Qt::TouchPointReleased;
|
|
|
|
points[1].state = Qt::TouchPointReleased;
|
|
|
|
QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QTRY_COMPARE(window.touchPressedCount, 2);
|
|
|
|
QTRY_COMPARE(window.touchReleasedCount, 2);
|
2012-05-23 12:38:22 +00:00
|
|
|
|
|
|
|
// Now with null pointer as window. local param should not be utilized:
|
|
|
|
// handleMouseEvent() with tlw == 0 means the event is in global coords only.
|
|
|
|
window.mousePressButton = window.mouseReleaseButton = 0;
|
|
|
|
QPointF nonWindowGlobal(500, 500); // not inside the window
|
|
|
|
QWindowSystemInterface::handleMouseEvent(0, nonWindowGlobal, nonWindowGlobal, Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(0, nonWindowGlobal, nonWindowGlobal, Qt::NoButton);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QCOMPARE(window.mousePressButton, 0);
|
|
|
|
QCOMPARE(window.mouseReleaseButton, 0);
|
|
|
|
QPointF windowGlobal = window.mapToGlobal(local.toPoint());
|
|
|
|
QWindowSystemInterface::handleMouseEvent(0, windowGlobal, windowGlobal, Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(0, windowGlobal, windowGlobal, Qt::NoButton);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QCOMPARE(window.mousePressButton, int(Qt::LeftButton));
|
|
|
|
QCOMPARE(window.mouseReleaseButton, int(Qt::LeftButton));
|
|
|
|
QCOMPARE(window.mousePressScreenPos, windowGlobal);
|
|
|
|
QCOMPARE(window.mousePressLocalPos, local); // the local we passed was bogus, verify that qGuiApp calculated the proper one
|
2012-01-12 07:53:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void tst_QWindow::touchToMouseTranslation()
|
|
|
|
{
|
2013-03-11 13:41:52 +00:00
|
|
|
if (!QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::SynthesizeMouseFromTouchEvents).toBool())
|
|
|
|
QSKIP("Mouse events are synthesized by the system on this platform.");
|
2012-01-12 07:53:13 +00:00
|
|
|
InputTestWindow window;
|
|
|
|
window.ignoreTouch = true;
|
|
|
|
window.setGeometry(80, 80, 40, 40);
|
|
|
|
window.show();
|
2012-07-20 10:49:12 +00:00
|
|
|
QVERIFY(QTest::qWaitForWindowExposed(&window));
|
2012-01-12 07:53:13 +00:00
|
|
|
|
2011-12-12 15:24:33 +00:00
|
|
|
QList<QWindowSystemInterface::TouchPoint> points;
|
|
|
|
QWindowSystemInterface::TouchPoint tp1, tp2;
|
2012-01-23 08:28:58 +00:00
|
|
|
const QRectF pressArea(101, 102, 4, 4);
|
|
|
|
const QRectF moveArea(105, 108, 4, 4);
|
2011-12-12 15:24:33 +00:00
|
|
|
tp1.id = 1;
|
|
|
|
tp1.state = Qt::TouchPointPressed;
|
2012-01-23 08:28:58 +00:00
|
|
|
tp1.area = pressArea;
|
2011-12-12 15:24:33 +00:00
|
|
|
tp2.id = 2;
|
|
|
|
tp2.state = Qt::TouchPointPressed;
|
|
|
|
points << tp1 << tp2;
|
2012-01-12 07:53:13 +00:00
|
|
|
QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
|
2012-01-23 08:28:58 +00:00
|
|
|
// Now an update but with changed list order. The mouse event should still
|
|
|
|
// be generated from the point with id 1.
|
|
|
|
tp1.id = 2;
|
|
|
|
tp1.state = Qt::TouchPointStationary;
|
|
|
|
tp2.id = 1;
|
|
|
|
tp2.state = Qt::TouchPointMoved;
|
|
|
|
tp2.area = moveArea;
|
|
|
|
points.clear();
|
|
|
|
points << tp1 << tp2;
|
|
|
|
QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
|
2012-01-12 07:53:13 +00:00
|
|
|
points[0].state = Qt::TouchPointReleased;
|
|
|
|
points[1].state = Qt::TouchPointReleased;
|
|
|
|
QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
|
|
|
|
QTRY_COMPARE(window.mousePressButton, int(Qt::LeftButton));
|
|
|
|
QTRY_COMPARE(window.mouseReleaseButton, int(Qt::LeftButton));
|
2012-01-23 08:28:58 +00:00
|
|
|
QTRY_COMPARE(window.mousePressScreenPos, pressArea.center());
|
|
|
|
QTRY_COMPARE(window.mouseMoveScreenPos, moveArea.center());
|
2012-01-12 07:53:13 +00:00
|
|
|
|
|
|
|
window.mousePressButton = 0;
|
|
|
|
window.mouseReleaseButton = 0;
|
|
|
|
|
|
|
|
window.ignoreTouch = false;
|
|
|
|
|
|
|
|
points[0].state = Qt::TouchPointPressed;
|
|
|
|
points[1].state = Qt::TouchPointPressed;
|
|
|
|
QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
|
|
|
|
points[0].state = Qt::TouchPointReleased;
|
|
|
|
points[1].state = Qt::TouchPointReleased;
|
|
|
|
QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
|
|
|
|
// no new mouse events should be generated since the input window handles the touch events
|
|
|
|
QTRY_COMPARE(window.mousePressButton, 0);
|
|
|
|
QTRY_COMPARE(window.mouseReleaseButton, 0);
|
|
|
|
|
|
|
|
qApp->setAttribute(Qt::AA_SynthesizeMouseForUnhandledTouchEvents, false);
|
|
|
|
|
|
|
|
window.ignoreTouch = true;
|
|
|
|
points[0].state = Qt::TouchPointPressed;
|
|
|
|
points[1].state = Qt::TouchPointPressed;
|
|
|
|
QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
|
2011-12-12 15:24:33 +00:00
|
|
|
points[0].state = Qt::TouchPointReleased;
|
|
|
|
points[1].state = Qt::TouchPointReleased;
|
2012-01-12 07:53:13 +00:00
|
|
|
QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
|
2011-12-12 15:24:33 +00:00
|
|
|
QCoreApplication::processEvents();
|
2012-01-12 07:53:13 +00:00
|
|
|
|
|
|
|
qApp->setAttribute(Qt::AA_SynthesizeMouseForUnhandledTouchEvents, true);
|
|
|
|
|
|
|
|
// mouse event synthesizing disabled
|
|
|
|
QTRY_COMPARE(window.mousePressButton, 0);
|
|
|
|
QTRY_COMPARE(window.mouseReleaseButton, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void tst_QWindow::mouseToTouchTranslation()
|
|
|
|
{
|
|
|
|
qApp->setAttribute(Qt::AA_SynthesizeTouchForUnhandledMouseEvents, true);
|
|
|
|
|
|
|
|
InputTestWindow window;
|
|
|
|
window.ignoreMouse = true;
|
|
|
|
window.setGeometry(80, 80, 40, 40);
|
|
|
|
window.show();
|
2012-07-20 10:49:12 +00:00
|
|
|
QVERIFY(QTest::qWaitForWindowExposed(&window));
|
2012-01-12 07:53:13 +00:00
|
|
|
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, QPoint(10, 10), window.mapToGlobal(QPoint(10, 10)), Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, QPoint(10, 10), window.mapToGlobal(QPoint(10, 10)), Qt::NoButton);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
|
|
|
|
qApp->setAttribute(Qt::AA_SynthesizeTouchForUnhandledMouseEvents, false);
|
|
|
|
|
|
|
|
QTRY_COMPARE(window.touchPressedCount, 1);
|
|
|
|
QTRY_COMPARE(window.touchReleasedCount, 1);
|
|
|
|
|
|
|
|
qApp->setAttribute(Qt::AA_SynthesizeTouchForUnhandledMouseEvents, true);
|
|
|
|
|
|
|
|
window.ignoreMouse = false;
|
|
|
|
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, QPoint(10, 10), window.mapToGlobal(QPoint(10, 10)), Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, QPoint(10, 10), window.mapToGlobal(QPoint(10, 10)), Qt::NoButton);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
|
|
|
|
qApp->setAttribute(Qt::AA_SynthesizeTouchForUnhandledMouseEvents, false);
|
|
|
|
|
|
|
|
// no new touch events should be generated since the input window handles the mouse events
|
|
|
|
QTRY_COMPARE(window.touchPressedCount, 1);
|
|
|
|
QTRY_COMPARE(window.touchReleasedCount, 1);
|
|
|
|
|
|
|
|
window.ignoreMouse = true;
|
|
|
|
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, QPoint(10, 10), window.mapToGlobal(QPoint(10, 10)), Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, QPoint(10, 10), window.mapToGlobal(QPoint(10, 10)), Qt::NoButton);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
|
|
|
|
// touch event synthesis disabled
|
|
|
|
QTRY_COMPARE(window.touchPressedCount, 1);
|
|
|
|
QTRY_COMPARE(window.touchReleasedCount, 1);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void tst_QWindow::mouseToTouchLoop()
|
|
|
|
{
|
|
|
|
// make sure there's no infinite loop when synthesizing both ways
|
|
|
|
qApp->setAttribute(Qt::AA_SynthesizeTouchForUnhandledMouseEvents, true);
|
|
|
|
qApp->setAttribute(Qt::AA_SynthesizeMouseForUnhandledTouchEvents, true);
|
|
|
|
|
|
|
|
InputTestWindow window;
|
|
|
|
window.ignoreMouse = true;
|
|
|
|
window.ignoreTouch = true;
|
|
|
|
window.setGeometry(80, 80, 40, 40);
|
|
|
|
window.show();
|
2012-07-20 10:49:12 +00:00
|
|
|
QVERIFY(QTest::qWaitForWindowExposed(&window));
|
2012-01-12 07:53:13 +00:00
|
|
|
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, QPoint(10, 10), window.mapToGlobal(QPoint(10, 10)), Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, QPoint(10, 10), window.mapToGlobal(QPoint(10, 10)), Qt::NoButton);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
|
|
|
|
qApp->setAttribute(Qt::AA_SynthesizeTouchForUnhandledMouseEvents, false);
|
2012-02-09 12:39:40 +00:00
|
|
|
qApp->setAttribute(Qt::AA_SynthesizeMouseForUnhandledTouchEvents, true);
|
|
|
|
}
|
|
|
|
|
|
|
|
void tst_QWindow::touchCancel()
|
|
|
|
{
|
|
|
|
InputTestWindow window;
|
|
|
|
window.setGeometry(80, 80, 40, 40);
|
|
|
|
window.show();
|
2012-07-20 10:49:12 +00:00
|
|
|
QVERIFY(QTest::qWaitForWindowExposed(&window));
|
2012-02-09 12:39:40 +00:00
|
|
|
|
|
|
|
QList<QWindowSystemInterface::TouchPoint> points;
|
|
|
|
QWindowSystemInterface::TouchPoint tp1;
|
|
|
|
tp1.id = 1;
|
|
|
|
|
|
|
|
// Start a touch.
|
|
|
|
tp1.state = Qt::TouchPointPressed;
|
|
|
|
tp1.area = QRect(10, 10, 4, 4);
|
|
|
|
points << tp1;
|
|
|
|
QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QTRY_COMPARE(window.touchEventType, QEvent::TouchBegin);
|
|
|
|
QTRY_COMPARE(window.touchPressedCount, 1);
|
|
|
|
|
|
|
|
// Cancel the active touch sequence.
|
|
|
|
QWindowSystemInterface::handleTouchCancelEvent(&window, touchDevice);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QTRY_COMPARE(window.touchEventType, QEvent::TouchCancel);
|
|
|
|
|
|
|
|
// Send a move -> will not be delivered due to the cancellation.
|
|
|
|
QTRY_COMPARE(window.touchMovedCount, 0);
|
|
|
|
points[0].state = Qt::TouchPointMoved;
|
|
|
|
tp1.area.adjust(2, 2, 2, 2);
|
|
|
|
QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QTRY_COMPARE(window.touchMovedCount, 0);
|
|
|
|
|
|
|
|
// Likewise. The only allowed transition is TouchCancel -> TouchBegin.
|
|
|
|
QTRY_COMPARE(window.touchReleasedCount, 0);
|
|
|
|
points[0].state = Qt::TouchPointReleased;
|
|
|
|
QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QTRY_COMPARE(window.touchReleasedCount, 0);
|
|
|
|
|
|
|
|
// Start a new sequence -> from this point on everything should go through normally.
|
|
|
|
points[0].state = Qt::TouchPointPressed;
|
|
|
|
QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QTRY_COMPARE(window.touchEventType, QEvent::TouchBegin);
|
|
|
|
QTRY_COMPARE(window.touchPressedCount, 2);
|
|
|
|
|
|
|
|
points[0].state = Qt::TouchPointMoved;
|
|
|
|
tp1.area.adjust(2, 2, 2, 2);
|
|
|
|
QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QTRY_COMPARE(window.touchMovedCount, 1);
|
|
|
|
|
|
|
|
points[0].state = Qt::TouchPointReleased;
|
|
|
|
QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QTRY_COMPARE(window.touchReleasedCount, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
void tst_QWindow::touchCancelWithTouchToMouse()
|
|
|
|
{
|
2013-03-11 13:41:52 +00:00
|
|
|
if (!QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::SynthesizeMouseFromTouchEvents).toBool())
|
|
|
|
QSKIP("Mouse events are synthesized by the system on this platform.");
|
2012-02-09 12:39:40 +00:00
|
|
|
InputTestWindow window;
|
|
|
|
window.ignoreTouch = true;
|
|
|
|
window.setGeometry(80, 80, 40, 40);
|
|
|
|
window.show();
|
2012-07-20 10:49:12 +00:00
|
|
|
QVERIFY(QTest::qWaitForWindowExposed(&window));
|
2012-02-09 12:39:40 +00:00
|
|
|
|
|
|
|
QList<QWindowSystemInterface::TouchPoint> points;
|
|
|
|
QWindowSystemInterface::TouchPoint tp1;
|
|
|
|
tp1.id = 1;
|
|
|
|
|
|
|
|
tp1.state = Qt::TouchPointPressed;
|
|
|
|
tp1.area = QRect(100, 100, 4, 4);
|
|
|
|
points << tp1;
|
|
|
|
QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QTRY_COMPARE(window.mousePressButton, int(Qt::LeftButton));
|
|
|
|
QTRY_COMPARE(window.mousePressScreenPos, points[0].area.center());
|
|
|
|
|
|
|
|
// Cancel the touch. Should result in a mouse release for windows that have
|
|
|
|
// have an active touch-to-mouse sequence.
|
|
|
|
QWindowSystemInterface::handleTouchCancelEvent(0, touchDevice);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
|
|
|
|
QTRY_COMPARE(window.mouseReleaseButton, int(Qt::LeftButton));
|
|
|
|
|
|
|
|
// Now change the window to accept touches.
|
|
|
|
window.mousePressButton = window.mouseReleaseButton = 0;
|
|
|
|
window.ignoreTouch = false;
|
|
|
|
|
|
|
|
// Send a touch, there will be no mouse event generated.
|
|
|
|
QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QTRY_COMPARE(window.mousePressButton, 0);
|
|
|
|
|
|
|
|
// Cancel the touch. It should not result in a mouse release with this window.
|
|
|
|
QWindowSystemInterface::handleTouchCancelEvent(0, touchDevice);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QTRY_COMPARE(window.mouseReleaseButton, 0);
|
2011-12-12 15:24:33 +00:00
|
|
|
}
|
|
|
|
|
2012-01-13 09:31:11 +00:00
|
|
|
void tst_QWindow::orientation()
|
|
|
|
{
|
2012-02-21 02:00:14 +00:00
|
|
|
qRegisterMetaType<Qt::ScreenOrientation>("Qt::ScreenOrientation");
|
|
|
|
|
2012-01-13 09:31:11 +00:00
|
|
|
QWindow window;
|
|
|
|
window.setGeometry(80, 80, 40, 40);
|
|
|
|
window.create();
|
|
|
|
|
|
|
|
window.reportContentOrientationChange(Qt::PortraitOrientation);
|
|
|
|
QCOMPARE(window.contentOrientation(), Qt::PortraitOrientation);
|
|
|
|
|
|
|
|
window.reportContentOrientationChange(Qt::PrimaryOrientation);
|
2012-01-25 12:41:43 +00:00
|
|
|
QCOMPARE(window.contentOrientation(), Qt::PrimaryOrientation);
|
2012-01-13 09:31:11 +00:00
|
|
|
|
2012-01-25 12:41:43 +00:00
|
|
|
QSignalSpy spy(&window, SIGNAL(contentOrientationChanged(Qt::ScreenOrientation)));
|
|
|
|
window.reportContentOrientationChange(Qt::LandscapeOrientation);
|
|
|
|
QCOMPARE(spy.count(), 1);
|
2012-01-13 09:31:11 +00:00
|
|
|
}
|
|
|
|
|
2012-11-01 16:03:45 +00:00
|
|
|
void tst_QWindow::sizes()
|
|
|
|
{
|
|
|
|
QWindow window;
|
|
|
|
|
|
|
|
QSignalSpy minimumWidthSpy(&window, SIGNAL(minimumWidthChanged(int)));
|
|
|
|
QSignalSpy minimumHeightSpy(&window, SIGNAL(minimumHeightChanged(int)));
|
|
|
|
QSignalSpy maximumWidthSpy(&window, SIGNAL(maximumWidthChanged(int)));
|
|
|
|
QSignalSpy maximumHeightSpy(&window, SIGNAL(maximumHeightChanged(int)));
|
|
|
|
|
|
|
|
QSize oldMaximum = window.maximumSize();
|
|
|
|
|
|
|
|
window.setMinimumWidth(10);
|
|
|
|
QCOMPARE(window.minimumWidth(), 10);
|
|
|
|
QCOMPARE(window.minimumHeight(), 0);
|
|
|
|
QCOMPARE(window.minimumSize(), QSize(10, 0));
|
|
|
|
QCOMPARE(window.maximumSize(), oldMaximum);
|
|
|
|
QCOMPARE(minimumWidthSpy.count(), 1);
|
|
|
|
QCOMPARE(minimumHeightSpy.count(), 0);
|
|
|
|
QCOMPARE(maximumWidthSpy.count(), 0);
|
|
|
|
QCOMPARE(maximumHeightSpy.count(), 0);
|
|
|
|
|
|
|
|
window.setMinimumHeight(10);
|
|
|
|
QCOMPARE(window.minimumWidth(), 10);
|
|
|
|
QCOMPARE(window.minimumHeight(), 10);
|
|
|
|
QCOMPARE(window.minimumSize(), QSize(10, 10));
|
|
|
|
QCOMPARE(window.maximumSize(), oldMaximum);
|
|
|
|
QCOMPARE(minimumWidthSpy.count(), 1);
|
|
|
|
QCOMPARE(minimumHeightSpy.count(), 1);
|
|
|
|
QCOMPARE(maximumWidthSpy.count(), 0);
|
|
|
|
QCOMPARE(maximumHeightSpy.count(), 0);
|
|
|
|
|
|
|
|
window.setMaximumWidth(100);
|
|
|
|
QCOMPARE(window.maximumWidth(), 100);
|
|
|
|
QCOMPARE(window.maximumHeight(), oldMaximum.height());
|
|
|
|
QCOMPARE(window.minimumSize(), QSize(10, 10));
|
|
|
|
QCOMPARE(window.maximumSize(), QSize(100, oldMaximum.height()));
|
|
|
|
QCOMPARE(minimumWidthSpy.count(), 1);
|
|
|
|
QCOMPARE(minimumHeightSpy.count(), 1);
|
|
|
|
QCOMPARE(maximumWidthSpy.count(), 1);
|
|
|
|
QCOMPARE(maximumHeightSpy.count(), 0);
|
|
|
|
|
|
|
|
window.setMaximumHeight(100);
|
|
|
|
QCOMPARE(window.maximumWidth(), 100);
|
|
|
|
QCOMPARE(window.maximumHeight(), 100);
|
|
|
|
QCOMPARE(window.minimumSize(), QSize(10, 10));
|
|
|
|
QCOMPARE(window.maximumSize(), QSize(100, 100));
|
|
|
|
QCOMPARE(minimumWidthSpy.count(), 1);
|
|
|
|
QCOMPARE(minimumHeightSpy.count(), 1);
|
|
|
|
QCOMPARE(maximumWidthSpy.count(), 1);
|
|
|
|
QCOMPARE(maximumHeightSpy.count(), 1);
|
|
|
|
}
|
|
|
|
|
2012-01-20 12:08:42 +00:00
|
|
|
void tst_QWindow::close()
|
|
|
|
{
|
|
|
|
QWindow a;
|
|
|
|
QWindow b;
|
|
|
|
QWindow c(&a);
|
|
|
|
|
|
|
|
a.show();
|
|
|
|
b.show();
|
|
|
|
|
|
|
|
// we can not close a non top level window
|
|
|
|
QVERIFY(!c.close());
|
|
|
|
QVERIFY(a.close());
|
|
|
|
QVERIFY(b.close());
|
|
|
|
}
|
|
|
|
|
2012-02-24 17:05:06 +00:00
|
|
|
void tst_QWindow::activateAndClose()
|
|
|
|
{
|
|
|
|
for (int i = 0; i < 10; ++i) {
|
|
|
|
QWindow window;
|
|
|
|
window.show();
|
Rename all QWindow properties that have "window" in them
windowTitle, windowModality, windowIcon and so on are named that way
to be similar to the ones in QWidget. However QQuickWindow inherits
all of the declared properties, and we would like to have shorter
property names in QML. If you are working with a Window then it's
obvious the title property is the window title. Unfortunately,
there must be patches in many other modules which depend on this one.
In order to avoid the need to merge them all at the same time,
there is also patch https://codereview.qt-project.org/#change,39001
which temporarily adds backwards-compatible accessors, which can be
removed after the other modules are able to build without them.
We should not rename windowState to state, because in QML, state
usually drives the state machine for animation transitions etc.
(although QWindow is not an Item, a user might get confused about it).
Related patches are
https://codereview.qt-project.org/#change,39001
https://codereview.qt-project.org/#change,37764
https://codereview.qt-project.org/#change,37765
https://codereview.qt-project.org/#change,37766
https://codereview.qt-project.org/#change,37762
Change-Id: Ie4424ec15fbdef6b29b137f90a2ae33f173edd21
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
2012-10-22 10:47:34 +00:00
|
|
|
window.requestActivate();
|
2012-07-20 10:49:12 +00:00
|
|
|
QVERIFY(QTest::qWaitForWindowActive(&window));
|
|
|
|
QCOMPARE(qGuiApp->focusWindow(), &window);
|
2012-02-24 17:05:06 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-03-24 08:48:12 +00:00
|
|
|
void tst_QWindow::mouseEventSequence()
|
|
|
|
{
|
|
|
|
int doubleClickInterval = qGuiApp->styleHints()->mouseDoubleClickInterval();
|
|
|
|
|
|
|
|
InputTestWindow window;
|
|
|
|
window.setGeometry(80, 80, 40, 40);
|
|
|
|
window.show();
|
2012-07-20 10:49:12 +00:00
|
|
|
QVERIFY(QTest::qWaitForWindowExposed(&window));
|
2012-03-24 08:48:12 +00:00
|
|
|
|
|
|
|
ulong timestamp = 0;
|
|
|
|
QPointF local(12, 34);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QCOMPARE(window.mousePressedCount, 1);
|
|
|
|
QCOMPARE(window.mouseReleasedCount, 1);
|
|
|
|
QCOMPARE(window.mouseDoubleClickedCount, 0);
|
|
|
|
QCOMPARE(window.mouseSequenceSignature, QLatin1String("pr"));
|
|
|
|
|
|
|
|
window.resetCounters();
|
|
|
|
timestamp += doubleClickInterval;
|
|
|
|
|
|
|
|
// A double click must result in press, release, press, doubleclick, release.
|
|
|
|
// Check that no unexpected event suppression occurs and that the order is correct.
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QCOMPARE(window.mousePressedCount, 2);
|
|
|
|
QCOMPARE(window.mouseReleasedCount, 2);
|
|
|
|
QCOMPARE(window.mouseDoubleClickedCount, 1);
|
|
|
|
QCOMPARE(window.mouseSequenceSignature, QLatin1String("prpdr"));
|
|
|
|
|
|
|
|
timestamp += doubleClickInterval;
|
|
|
|
window.resetCounters();
|
|
|
|
|
|
|
|
// Triple click = double + single click
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QCOMPARE(window.mousePressedCount, 3);
|
|
|
|
QCOMPARE(window.mouseReleasedCount, 3);
|
|
|
|
QCOMPARE(window.mouseDoubleClickedCount, 1);
|
|
|
|
QCOMPARE(window.mouseSequenceSignature, QLatin1String("prpdrpr"));
|
|
|
|
|
|
|
|
timestamp += doubleClickInterval;
|
|
|
|
window.resetCounters();
|
|
|
|
|
|
|
|
// Two double clicks.
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QCOMPARE(window.mousePressedCount, 4);
|
|
|
|
QCOMPARE(window.mouseReleasedCount, 4);
|
|
|
|
QCOMPARE(window.mouseDoubleClickedCount, 2);
|
|
|
|
QCOMPARE(window.mouseSequenceSignature, QLatin1String("prpdrprpdr"));
|
|
|
|
|
|
|
|
timestamp += doubleClickInterval;
|
|
|
|
window.resetCounters();
|
|
|
|
|
|
|
|
// Four clicks, none of which qualifies as a double click.
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
|
|
|
|
timestamp += doubleClickInterval;
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
|
|
|
|
timestamp += doubleClickInterval;
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
|
|
|
|
timestamp += doubleClickInterval;
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
|
|
|
|
timestamp += doubleClickInterval;
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QCOMPARE(window.mousePressedCount, 4);
|
|
|
|
QCOMPARE(window.mouseReleasedCount, 4);
|
|
|
|
QCOMPARE(window.mouseDoubleClickedCount, 0);
|
|
|
|
QCOMPARE(window.mouseSequenceSignature, QLatin1String("prprprpr"));
|
|
|
|
}
|
|
|
|
|
2012-04-04 10:11:40 +00:00
|
|
|
void tst_QWindow::windowModality()
|
|
|
|
{
|
|
|
|
qRegisterMetaType<Qt::WindowModality>("Qt::WindowModality");
|
|
|
|
|
|
|
|
QWindow window;
|
Rename all QWindow properties that have "window" in them
windowTitle, windowModality, windowIcon and so on are named that way
to be similar to the ones in QWidget. However QQuickWindow inherits
all of the declared properties, and we would like to have shorter
property names in QML. If you are working with a Window then it's
obvious the title property is the window title. Unfortunately,
there must be patches in many other modules which depend on this one.
In order to avoid the need to merge them all at the same time,
there is also patch https://codereview.qt-project.org/#change,39001
which temporarily adds backwards-compatible accessors, which can be
removed after the other modules are able to build without them.
We should not rename windowState to state, because in QML, state
usually drives the state machine for animation transitions etc.
(although QWindow is not an Item, a user might get confused about it).
Related patches are
https://codereview.qt-project.org/#change,39001
https://codereview.qt-project.org/#change,37764
https://codereview.qt-project.org/#change,37765
https://codereview.qt-project.org/#change,37766
https://codereview.qt-project.org/#change,37762
Change-Id: Ie4424ec15fbdef6b29b137f90a2ae33f173edd21
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
2012-10-22 10:47:34 +00:00
|
|
|
QSignalSpy spy(&window, SIGNAL(modalityChanged(Qt::WindowModality)));
|
2012-04-04 10:11:40 +00:00
|
|
|
|
Rename all QWindow properties that have "window" in them
windowTitle, windowModality, windowIcon and so on are named that way
to be similar to the ones in QWidget. However QQuickWindow inherits
all of the declared properties, and we would like to have shorter
property names in QML. If you are working with a Window then it's
obvious the title property is the window title. Unfortunately,
there must be patches in many other modules which depend on this one.
In order to avoid the need to merge them all at the same time,
there is also patch https://codereview.qt-project.org/#change,39001
which temporarily adds backwards-compatible accessors, which can be
removed after the other modules are able to build without them.
We should not rename windowState to state, because in QML, state
usually drives the state machine for animation transitions etc.
(although QWindow is not an Item, a user might get confused about it).
Related patches are
https://codereview.qt-project.org/#change,39001
https://codereview.qt-project.org/#change,37764
https://codereview.qt-project.org/#change,37765
https://codereview.qt-project.org/#change,37766
https://codereview.qt-project.org/#change,37762
Change-Id: Ie4424ec15fbdef6b29b137f90a2ae33f173edd21
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
2012-10-22 10:47:34 +00:00
|
|
|
QCOMPARE(window.modality(), Qt::NonModal);
|
|
|
|
window.setModality(Qt::NonModal);
|
|
|
|
QCOMPARE(window.modality(), Qt::NonModal);
|
2012-04-04 10:11:40 +00:00
|
|
|
QCOMPARE(spy.count(), 0);
|
|
|
|
|
Rename all QWindow properties that have "window" in them
windowTitle, windowModality, windowIcon and so on are named that way
to be similar to the ones in QWidget. However QQuickWindow inherits
all of the declared properties, and we would like to have shorter
property names in QML. If you are working with a Window then it's
obvious the title property is the window title. Unfortunately,
there must be patches in many other modules which depend on this one.
In order to avoid the need to merge them all at the same time,
there is also patch https://codereview.qt-project.org/#change,39001
which temporarily adds backwards-compatible accessors, which can be
removed after the other modules are able to build without them.
We should not rename windowState to state, because in QML, state
usually drives the state machine for animation transitions etc.
(although QWindow is not an Item, a user might get confused about it).
Related patches are
https://codereview.qt-project.org/#change,39001
https://codereview.qt-project.org/#change,37764
https://codereview.qt-project.org/#change,37765
https://codereview.qt-project.org/#change,37766
https://codereview.qt-project.org/#change,37762
Change-Id: Ie4424ec15fbdef6b29b137f90a2ae33f173edd21
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
2012-10-22 10:47:34 +00:00
|
|
|
window.setModality(Qt::WindowModal);
|
|
|
|
QCOMPARE(window.modality(), Qt::WindowModal);
|
2012-04-04 10:11:40 +00:00
|
|
|
QCOMPARE(spy.count(), 1);
|
Rename all QWindow properties that have "window" in them
windowTitle, windowModality, windowIcon and so on are named that way
to be similar to the ones in QWidget. However QQuickWindow inherits
all of the declared properties, and we would like to have shorter
property names in QML. If you are working with a Window then it's
obvious the title property is the window title. Unfortunately,
there must be patches in many other modules which depend on this one.
In order to avoid the need to merge them all at the same time,
there is also patch https://codereview.qt-project.org/#change,39001
which temporarily adds backwards-compatible accessors, which can be
removed after the other modules are able to build without them.
We should not rename windowState to state, because in QML, state
usually drives the state machine for animation transitions etc.
(although QWindow is not an Item, a user might get confused about it).
Related patches are
https://codereview.qt-project.org/#change,39001
https://codereview.qt-project.org/#change,37764
https://codereview.qt-project.org/#change,37765
https://codereview.qt-project.org/#change,37766
https://codereview.qt-project.org/#change,37762
Change-Id: Ie4424ec15fbdef6b29b137f90a2ae33f173edd21
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
2012-10-22 10:47:34 +00:00
|
|
|
window.setModality(Qt::WindowModal);
|
|
|
|
QCOMPARE(window.modality(), Qt::WindowModal);
|
2012-04-04 10:11:40 +00:00
|
|
|
QCOMPARE(spy.count(), 1);
|
|
|
|
|
Rename all QWindow properties that have "window" in them
windowTitle, windowModality, windowIcon and so on are named that way
to be similar to the ones in QWidget. However QQuickWindow inherits
all of the declared properties, and we would like to have shorter
property names in QML. If you are working with a Window then it's
obvious the title property is the window title. Unfortunately,
there must be patches in many other modules which depend on this one.
In order to avoid the need to merge them all at the same time,
there is also patch https://codereview.qt-project.org/#change,39001
which temporarily adds backwards-compatible accessors, which can be
removed after the other modules are able to build without them.
We should not rename windowState to state, because in QML, state
usually drives the state machine for animation transitions etc.
(although QWindow is not an Item, a user might get confused about it).
Related patches are
https://codereview.qt-project.org/#change,39001
https://codereview.qt-project.org/#change,37764
https://codereview.qt-project.org/#change,37765
https://codereview.qt-project.org/#change,37766
https://codereview.qt-project.org/#change,37762
Change-Id: Ie4424ec15fbdef6b29b137f90a2ae33f173edd21
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
2012-10-22 10:47:34 +00:00
|
|
|
window.setModality(Qt::ApplicationModal);
|
|
|
|
QCOMPARE(window.modality(), Qt::ApplicationModal);
|
2012-04-04 10:11:40 +00:00
|
|
|
QCOMPARE(spy.count(), 2);
|
Rename all QWindow properties that have "window" in them
windowTitle, windowModality, windowIcon and so on are named that way
to be similar to the ones in QWidget. However QQuickWindow inherits
all of the declared properties, and we would like to have shorter
property names in QML. If you are working with a Window then it's
obvious the title property is the window title. Unfortunately,
there must be patches in many other modules which depend on this one.
In order to avoid the need to merge them all at the same time,
there is also patch https://codereview.qt-project.org/#change,39001
which temporarily adds backwards-compatible accessors, which can be
removed after the other modules are able to build without them.
We should not rename windowState to state, because in QML, state
usually drives the state machine for animation transitions etc.
(although QWindow is not an Item, a user might get confused about it).
Related patches are
https://codereview.qt-project.org/#change,39001
https://codereview.qt-project.org/#change,37764
https://codereview.qt-project.org/#change,37765
https://codereview.qt-project.org/#change,37766
https://codereview.qt-project.org/#change,37762
Change-Id: Ie4424ec15fbdef6b29b137f90a2ae33f173edd21
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
2012-10-22 10:47:34 +00:00
|
|
|
window.setModality(Qt::ApplicationModal);
|
|
|
|
QCOMPARE(window.modality(), Qt::ApplicationModal);
|
2012-04-04 10:11:40 +00:00
|
|
|
QCOMPARE(spy.count(), 2);
|
|
|
|
|
Rename all QWindow properties that have "window" in them
windowTitle, windowModality, windowIcon and so on are named that way
to be similar to the ones in QWidget. However QQuickWindow inherits
all of the declared properties, and we would like to have shorter
property names in QML. If you are working with a Window then it's
obvious the title property is the window title. Unfortunately,
there must be patches in many other modules which depend on this one.
In order to avoid the need to merge them all at the same time,
there is also patch https://codereview.qt-project.org/#change,39001
which temporarily adds backwards-compatible accessors, which can be
removed after the other modules are able to build without them.
We should not rename windowState to state, because in QML, state
usually drives the state machine for animation transitions etc.
(although QWindow is not an Item, a user might get confused about it).
Related patches are
https://codereview.qt-project.org/#change,39001
https://codereview.qt-project.org/#change,37764
https://codereview.qt-project.org/#change,37765
https://codereview.qt-project.org/#change,37766
https://codereview.qt-project.org/#change,37762
Change-Id: Ie4424ec15fbdef6b29b137f90a2ae33f173edd21
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
2012-10-22 10:47:34 +00:00
|
|
|
window.setModality(Qt::NonModal);
|
|
|
|
QCOMPARE(window.modality(), Qt::NonModal);
|
2012-04-04 10:11:40 +00:00
|
|
|
QCOMPARE(spy.count(), 3);
|
|
|
|
}
|
|
|
|
|
2012-04-23 13:18:01 +00:00
|
|
|
void tst_QWindow::inputReentrancy()
|
|
|
|
{
|
|
|
|
InputTestWindow window;
|
|
|
|
window.spinLoopWhenPressed = true;
|
|
|
|
|
|
|
|
window.setGeometry(80, 80, 40, 40);
|
|
|
|
window.show();
|
2012-07-20 10:49:12 +00:00
|
|
|
QVERIFY(QTest::qWaitForWindowExposed(&window));
|
2012-04-23 13:18:01 +00:00
|
|
|
|
|
|
|
// Queue three events.
|
|
|
|
QPointF local(12, 34);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, local, local, Qt::LeftButton);
|
|
|
|
local += QPointF(2, 2);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, local, local, Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&window, local, local, Qt::NoButton);
|
|
|
|
// Process them. However, the event handler for the press will also call
|
|
|
|
// processEvents() so the move and release will be delivered before returning
|
|
|
|
// from mousePressEvent(). The point is that no events should get lost.
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QCOMPARE(window.mousePressButton, int(Qt::LeftButton));
|
|
|
|
QCOMPARE(window.mouseReleaseButton, int(Qt::LeftButton));
|
|
|
|
QCOMPARE(window.mousePressedCount, 1);
|
|
|
|
QCOMPARE(window.mouseMovedCount, 1);
|
|
|
|
QCOMPARE(window.mouseReleasedCount, 1);
|
|
|
|
|
|
|
|
// Now the same for touch.
|
|
|
|
QList<QWindowSystemInterface::TouchPoint> points;
|
|
|
|
QWindowSystemInterface::TouchPoint tp1;
|
|
|
|
tp1.id = 1;
|
|
|
|
tp1.state = Qt::TouchPointPressed;
|
|
|
|
tp1.area = QRectF(10, 10, 4, 4);
|
|
|
|
points << tp1;
|
|
|
|
QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
|
|
|
|
points[0].state = Qt::TouchPointMoved;
|
|
|
|
points[0].area = QRectF(20, 20, 8, 8);
|
|
|
|
QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
|
|
|
|
points[0].state = Qt::TouchPointReleased;
|
|
|
|
QWindowSystemInterface::handleTouchEvent(&window, touchDevice, points);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QCOMPARE(window.touchPressedCount, 1);
|
|
|
|
QCOMPARE(window.touchMovedCount, 1);
|
|
|
|
QCOMPARE(window.touchReleasedCount, 1);
|
|
|
|
}
|
|
|
|
|
2012-05-23 12:07:39 +00:00
|
|
|
#ifndef QT_NO_TABLETEVENT
|
|
|
|
class TabletTestWindow : public QWindow
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
TabletTestWindow() : eventType(0) { }
|
|
|
|
void tabletEvent(QTabletEvent *ev) {
|
|
|
|
eventType = ev->type();
|
|
|
|
eventGlobal = ev->globalPosF();
|
|
|
|
eventLocal = ev->posF();
|
|
|
|
eventDevice = ev->device();
|
|
|
|
}
|
|
|
|
int eventType;
|
|
|
|
QPointF eventGlobal, eventLocal;
|
|
|
|
int eventDevice;
|
|
|
|
bool eventFilter(QObject *obj, QEvent *ev) {
|
|
|
|
if (ev->type() == QEvent::TabletEnterProximity
|
|
|
|
|| ev->type() == QEvent::TabletLeaveProximity) {
|
|
|
|
eventType = ev->type();
|
|
|
|
QTabletEvent *te = static_cast<QTabletEvent *>(ev);
|
|
|
|
eventDevice = te->device();
|
|
|
|
}
|
|
|
|
return QWindow::eventFilter(obj, ev);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
void tst_QWindow::tabletEvents()
|
|
|
|
{
|
|
|
|
#ifndef QT_NO_TABLETEVENT
|
|
|
|
TabletTestWindow window;
|
|
|
|
window.setGeometry(10, 10, 100, 100);
|
|
|
|
qGuiApp->installEventFilter(&window);
|
|
|
|
|
|
|
|
QPoint local(10, 10);
|
|
|
|
QPoint global = window.mapToGlobal(local);
|
|
|
|
QWindowSystemInterface::handleTabletEvent(&window, true, local, global, 1, 2, 0.5, 1, 2, 0.1, 0, 0, 0);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QTRY_VERIFY(window.eventType == QEvent::TabletPress);
|
|
|
|
QTRY_COMPARE(window.eventGlobal.toPoint(), global);
|
|
|
|
QTRY_COMPARE(window.eventLocal.toPoint(), local);
|
|
|
|
QWindowSystemInterface::handleTabletEvent(&window, false, local, global, 1, 2, 0.5, 1, 2, 0.1, 0, 0, 0);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QTRY_VERIFY(window.eventType == QEvent::TabletRelease);
|
|
|
|
|
|
|
|
QWindowSystemInterface::handleTabletEnterProximityEvent(1, 2, 3);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QTRY_VERIFY(window.eventType == QEvent::TabletEnterProximity);
|
|
|
|
QTRY_COMPARE(window.eventDevice, 1);
|
|
|
|
|
|
|
|
QWindowSystemInterface::handleTabletLeaveProximityEvent(1, 2, 3);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
QTRY_VERIFY(window.eventType == QEvent::TabletLeaveProximity);
|
|
|
|
QTRY_COMPARE(window.eventDevice, 1);
|
|
|
|
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2012-09-21 10:12:01 +00:00
|
|
|
void tst_QWindow::windowModality_QTBUG27039()
|
|
|
|
{
|
|
|
|
QWindow parent;
|
|
|
|
parent.setGeometry(10, 10, 100, 100);
|
|
|
|
parent.show();
|
|
|
|
|
|
|
|
InputTestWindow modalA;
|
|
|
|
modalA.setTransientParent(&parent);
|
|
|
|
modalA.setGeometry(10, 10, 20, 20);
|
Rename all QWindow properties that have "window" in them
windowTitle, windowModality, windowIcon and so on are named that way
to be similar to the ones in QWidget. However QQuickWindow inherits
all of the declared properties, and we would like to have shorter
property names in QML. If you are working with a Window then it's
obvious the title property is the window title. Unfortunately,
there must be patches in many other modules which depend on this one.
In order to avoid the need to merge them all at the same time,
there is also patch https://codereview.qt-project.org/#change,39001
which temporarily adds backwards-compatible accessors, which can be
removed after the other modules are able to build without them.
We should not rename windowState to state, because in QML, state
usually drives the state machine for animation transitions etc.
(although QWindow is not an Item, a user might get confused about it).
Related patches are
https://codereview.qt-project.org/#change,39001
https://codereview.qt-project.org/#change,37764
https://codereview.qt-project.org/#change,37765
https://codereview.qt-project.org/#change,37766
https://codereview.qt-project.org/#change,37762
Change-Id: Ie4424ec15fbdef6b29b137f90a2ae33f173edd21
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
2012-10-22 10:47:34 +00:00
|
|
|
modalA.setModality(Qt::ApplicationModal);
|
2012-09-21 10:12:01 +00:00
|
|
|
modalA.show();
|
|
|
|
|
|
|
|
InputTestWindow modalB;
|
|
|
|
modalB.setTransientParent(&parent);
|
|
|
|
modalB.setGeometry(30, 10, 20, 20);
|
Rename all QWindow properties that have "window" in them
windowTitle, windowModality, windowIcon and so on are named that way
to be similar to the ones in QWidget. However QQuickWindow inherits
all of the declared properties, and we would like to have shorter
property names in QML. If you are working with a Window then it's
obvious the title property is the window title. Unfortunately,
there must be patches in many other modules which depend on this one.
In order to avoid the need to merge them all at the same time,
there is also patch https://codereview.qt-project.org/#change,39001
which temporarily adds backwards-compatible accessors, which can be
removed after the other modules are able to build without them.
We should not rename windowState to state, because in QML, state
usually drives the state machine for animation transitions etc.
(although QWindow is not an Item, a user might get confused about it).
Related patches are
https://codereview.qt-project.org/#change,39001
https://codereview.qt-project.org/#change,37764
https://codereview.qt-project.org/#change,37765
https://codereview.qt-project.org/#change,37766
https://codereview.qt-project.org/#change,37762
Change-Id: Ie4424ec15fbdef6b29b137f90a2ae33f173edd21
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
2012-10-22 10:47:34 +00:00
|
|
|
modalB.setModality(Qt::ApplicationModal);
|
2012-09-21 10:12:01 +00:00
|
|
|
modalB.show();
|
|
|
|
|
|
|
|
QPointF local(5, 5);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&modalA, local, local, Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&modalA, local, local, Qt::NoButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&modalB, local, local, Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&modalB, local, local, Qt::NoButton);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
|
|
|
|
// modal A should be blocked since it was shown first, but modal B should not be blocked
|
|
|
|
QCOMPARE(modalB.mousePressedCount, 1);
|
|
|
|
QCOMPARE(modalA.mousePressedCount, 0);
|
|
|
|
|
|
|
|
modalB.hide();
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&modalA, local, local, Qt::LeftButton);
|
|
|
|
QWindowSystemInterface::handleMouseEvent(&modalA, local, local, Qt::NoButton);
|
|
|
|
QCoreApplication::processEvents();
|
|
|
|
|
|
|
|
// modal B has been hidden, modal A should be unblocked again
|
|
|
|
QCOMPARE(modalA.mousePressedCount, 1);
|
|
|
|
}
|
|
|
|
|
2013-02-08 09:49:52 +00:00
|
|
|
void tst_QWindow::visibility()
|
|
|
|
{
|
|
|
|
qRegisterMetaType<Qt::WindowModality>("QWindow::Visibility");
|
|
|
|
|
|
|
|
QWindow window;
|
|
|
|
QSignalSpy spy(&window, SIGNAL(visibilityChanged(QWindow::Visibility)));
|
|
|
|
|
|
|
|
window.setVisibility(QWindow::AutomaticVisibility);
|
|
|
|
QVERIFY(window.isVisible());
|
|
|
|
QVERIFY(window.visibility() != QWindow::Hidden);
|
|
|
|
QVERIFY(window.visibility() != QWindow::AutomaticVisibility);
|
|
|
|
QCOMPARE(spy.count(), 1);
|
|
|
|
spy.clear();
|
|
|
|
|
|
|
|
window.setVisibility(QWindow::Hidden);
|
|
|
|
QVERIFY(!window.isVisible());
|
|
|
|
QCOMPARE(window.visibility(), QWindow::Hidden);
|
|
|
|
QCOMPARE(spy.count(), 1);
|
|
|
|
spy.clear();
|
|
|
|
|
|
|
|
window.setVisibility(QWindow::FullScreen);
|
|
|
|
QVERIFY(window.isVisible());
|
|
|
|
QCOMPARE(window.windowState(), Qt::WindowFullScreen);
|
|
|
|
QCOMPARE(window.visibility(), QWindow::FullScreen);
|
|
|
|
QCOMPARE(spy.count(), 1);
|
|
|
|
spy.clear();
|
|
|
|
|
|
|
|
window.setWindowState(Qt::WindowNoState);
|
|
|
|
QCOMPARE(window.visibility(), QWindow::Windowed);
|
|
|
|
QCOMPARE(spy.count(), 1);
|
|
|
|
spy.clear();
|
|
|
|
|
|
|
|
window.setVisible(false);
|
|
|
|
QCOMPARE(window.visibility(), QWindow::Hidden);
|
|
|
|
QCOMPARE(spy.count(), 1);
|
|
|
|
spy.clear();
|
|
|
|
}
|
|
|
|
|
2013-02-25 07:54:30 +00:00
|
|
|
void tst_QWindow::mask()
|
|
|
|
{
|
|
|
|
QRegion mask = QRect(10, 10, 800 - 20, 600 - 20);
|
|
|
|
|
|
|
|
QWindow window;
|
|
|
|
window.resize(800, 600);
|
|
|
|
window.setMask(mask);
|
|
|
|
|
|
|
|
QCOMPARE(window.mask(), QRegion());
|
|
|
|
|
|
|
|
window.create();
|
|
|
|
window.setMask(mask);
|
|
|
|
|
|
|
|
QCOMPARE(window.mask(), mask);
|
|
|
|
}
|
|
|
|
|
2011-08-29 06:26:37 +00:00
|
|
|
#include <tst_qwindow.moc>
|
2012-03-24 08:48:12 +00:00
|
|
|
QTEST_MAIN(tst_QWindow)
|
2012-09-21 10:12:01 +00:00
|
|
|
|