Merge remote-tracking branch 'origin/5.14' into 5.15

Change-Id: Ic754916ddc223c6ce20f0298eec02a3513fc0222
This commit is contained in:
Qt Forward Merge Bot 2019-11-29 01:00:05 +01:00
commit 2a809ef657
9 changed files with 140 additions and 26 deletions

View File

@ -315,13 +315,12 @@ inline typename LinkBufferBase<MacroAssembler, ExecutableOffsetCalculator>::Code
va_start(argList, format);
WTF::dataLogFV(format, argList);
va_end(argList);
dataLogF(":\n");
dataLogF(
#if OS(WINDOWS)
" Code at [0x%p, 0x%p):\n",
": Code at [0x%p, 0x%p):",
#else
" Code at [%p, %p):\n",
": Code at [%p, %p):",
#endif
result.code().executableAddress(), static_cast<char*>(result.code().executableAddress()) + result.size());
disassemble(result.code(), m_size, " ", WTF::dataFile());

View File

@ -36,7 +36,7 @@ void disassemble(const MacroAssemblerCodePtr& codePtr, size_t size, const char*
if (tryToDisassemble(codePtr, size, prefix, out))
return;
out.printf("%sdisassembly not available for range %p...%p\n", prefix, codePtr.executableAddress(), static_cast<char*>(codePtr.executableAddress()) + size);
out.printf("%sdisassembly not available for range %p...%p", prefix, codePtr.executableAddress(), static_cast<char*>(codePtr.executableAddress()) + size);
}
} // namespace JSC

View File

@ -335,7 +335,7 @@ bool QQmlData::wasDeleted(const QObject *object)
return true;
const QObjectPrivate *priv = QObjectPrivate::get(object);
if (!priv || priv->wasDeleted)
if (!priv || priv->wasDeleted || priv->isDeletingChildren)
return true;
const QQmlData *ddata = QQmlData::get(object);

View File

@ -42,6 +42,7 @@
#include <private/qsgadaptationlayer_p.h>
#include <private/qevent_p.h>
#include <private/qquickitem_p.h>
#include <private/qquickwindow_p.h>
#include <private/qguiapplication_p.h>
#include <QEvent>
#include <QMouseEvent>
@ -448,6 +449,7 @@ QQuickMultiPointTouchArea::QQuickMultiPointTouchArea(QQuickItem *parent)
: QQuickItem(parent),
_minimumTouchPoints(0),
_maximumTouchPoints(INT_MAX),
_touchMouseDevice(nullptr),
_stealMouse(false),
_mouseEnabled(true)
{
@ -586,10 +588,10 @@ void QQuickMultiPointTouchArea::updateTouchData(QEvent *event)
bool ended = false;
bool moved = false;
bool started = false;
bool isMouseEvent = false;
clearTouchLists();
QList<QTouchEvent::TouchPoint> touchPoints;
QQuickWindowPrivate *windowPriv = QQuickWindowPrivate::get(window());
switch (event->type()) {
case QEvent::TouchBegin:
@ -598,6 +600,9 @@ void QQuickMultiPointTouchArea::updateTouchData(QEvent *event)
touchPoints = static_cast<QTouchEvent*>(event)->touchPoints();
break;
case QEvent::MouseButtonPress:
_mouseQpaTouchPoint = QTouchEvent::TouchPoint(windowPriv->touchMouseId);
_touchMouseDevice = windowPriv->touchMouseDevice->qTouchDevice();
Q_FALLTHROUGH();
case QEvent::MouseMove:
case QEvent::MouseButtonRelease: {
QMouseEvent *me = static_cast<QMouseEvent*>(event);
@ -617,7 +622,6 @@ void QQuickMultiPointTouchArea::updateTouchData(QEvent *event)
_mouseQpaTouchPoint.setState(Qt::TouchPointPressed);
}
touchPoints << _mouseQpaTouchPoint;
isMouseEvent = true;
break;
}
default:
@ -625,11 +629,6 @@ void QQuickMultiPointTouchArea::updateTouchData(QEvent *event)
break;
}
if (!isMouseEvent && _mouseTouchPoint) {
QQuickWindow *c = window();
if (c && c->mouseGrabberItem() == this)
touchPoints << _mouseQpaTouchPoint;
}
int numTouchPoints = touchPoints.count();
//always remove released touches, and make sure we handle all releases before adds.
for (const QTouchEvent::TouchPoint &p : qAsConst(touchPoints)) {
@ -756,7 +755,7 @@ void QQuickMultiPointTouchArea::addTouchPoint(const QMouseEvent *e)
dtp = new QQuickTouchPoint(false);
updateTouchPoint(dtp, e);
dtp->setPressed(true);
_touchPoints.insert(-1, dtp);
_touchPoints.insert(_touchMouseDevice && _mouseQpaTouchPoint.id() > 0 ? _mouseQpaTouchPoint.id() : -1, dtp);
_pressedTouchPoints.append(dtp);
_mouseTouchPoint = dtp;
}
@ -839,8 +838,7 @@ void QQuickMultiPointTouchArea::mousePressEvent(QMouseEvent *event)
setKeepMouseGrab(false);
event->setAccepted(true);
_mousePos = event->localPos();
if (event->source() != Qt::MouseEventNotSynthesized)
if (event->source() != Qt::MouseEventNotSynthesized && event->source() != Qt::MouseEventSynthesizedByQt)
return;
if (_touchPoints.count() >= _minimumTouchPoints - 1 && _touchPoints.count() < _maximumTouchPoints) {
@ -855,7 +853,7 @@ void QQuickMultiPointTouchArea::mouseMoveEvent(QMouseEvent *event)
return;
}
if (event->source() != Qt::MouseEventNotSynthesized)
if (event->source() != Qt::MouseEventNotSynthesized && event->source() != Qt::MouseEventSynthesizedByQt)
return;
_movedTouchPoints.clear();
@ -870,7 +868,7 @@ void QQuickMultiPointTouchArea::mouseReleaseEvent(QMouseEvent *event)
return;
}
if (event->source() != Qt::MouseEventNotSynthesized)
if (event->source() != Qt::MouseEventNotSynthesized && event->source() != Qt::MouseEventSynthesizedByQt)
return;
if (_mouseTouchPoint) {
@ -880,18 +878,16 @@ void QQuickMultiPointTouchArea::mouseReleaseEvent(QMouseEvent *event)
_mouseTouchPoint = nullptr;
}
QQuickWindow *c = window();
if (c && c->mouseGrabberItem() == this)
ungrabMouse();
setKeepMouseGrab(false);
}
void QQuickMultiPointTouchArea::ungrab()
void QQuickMultiPointTouchArea::ungrab(bool normalRelease)
{
_stealMouse = false;
setKeepMouseGrab(false);
setKeepTouchGrab(false);
ungrabTouchPoints();
if (!normalRelease)
ungrabTouchPoints();
if (_touchPoints.count()) {
for (QObject *obj : qAsConst(_touchPoints))
@ -969,13 +965,25 @@ bool QQuickMultiPointTouchArea::childMouseEventFilter(QQuickItem *receiver, QEve
if (!isEnabled() || !isVisible())
return QQuickItem::childMouseEventFilter(receiver, event);
switch (event->type()) {
case QEvent::MouseButtonPress:
case QEvent::MouseButtonPress: {
QQuickWindowPrivate *windowPriv = QQuickWindowPrivate::get(window());
// If we already got a chance to filter the touchpoint that generated this synth-mouse-press,
// and chose not to filter it, ignore it now, too.
if (static_cast<QMouseEvent *>(event)->source() == Qt::MouseEventSynthesizedByQt &&
_lastFilterableTouchPointIds.contains(windowPriv->touchMouseId))
return false;
} Q_FALLTHROUGH();
case QEvent::MouseMove:
case QEvent::MouseButtonRelease:
return sendMouseEvent(static_cast<QMouseEvent *>(event));
break;
case QEvent::TouchBegin:
_lastFilterableTouchPointIds.clear();
Q_FALLTHROUGH();
case QEvent::TouchUpdate:
for (auto tp : static_cast<QTouchEvent*>(event)->touchPoints()) {
if (tp.state() == Qt::TouchPointPressed)
_lastFilterableTouchPointIds << tp.id();
}
if (!shouldFilter(event))
return false;
updateTouchData(event);
@ -984,7 +992,7 @@ bool QQuickMultiPointTouchArea::childMouseEventFilter(QQuickItem *receiver, QEve
if (!shouldFilter(event))
return false;
updateTouchData(event);
ungrab();
ungrab(true);
}
break;
default:

View File

@ -289,7 +289,7 @@ protected:
#endif
private:
void ungrab();
void ungrab(bool normalRelease = false);
QMap<int,QQuickTouchPoint*> _touchPrototypes; //TouchPoints defined in QML
QMap<int,QObject*> _touchPoints; //All current touch points
QList<QObject*> _releasedTouchPoints;
@ -297,8 +297,10 @@ private:
QList<QObject*> _movedTouchPoints;
int _minimumTouchPoints;
int _maximumTouchPoints;
QVector<int> _lastFilterableTouchPointIds;
QPointer<QQuickTouchPoint> _mouseTouchPoint; // exists when mouse button is down and _mouseEnabled is true; null otherwise
QTouchEvent::TouchPoint _mouseQpaTouchPoint; // synthetic QPA touch point to hold state and position of the mouse
const QTouchDevice *_touchMouseDevice;
QPointF _mousePos;
bool _stealMouse;
bool _mouseEnabled;

View File

@ -2711,6 +2711,23 @@ void QQuickTableView::setContentHeight(qreal height)
QQuickFlickable::setContentHeight(height);
}
/*!
\qmlproperty TableView QtQuick::TableView::syncView
If this property of a TableView is set to another TableView, both the
tables will synchronize with regard to flicking, column widths/row heights,
and spacing according to \l syncDirection.
If \l syncDirection contains \l Qt.Horizontal, current tableView's column
widths, column spacing, and horizontal flicking movement synchronizes with
syncView's.
If \l syncDirection contains \l Qt.Vertical, current tableView's row
heights, row spacing, and vertical flicking movement synchronizes with
syncView's.
\sa syncDirection
*/
QQuickTableView *QQuickTableView::syncView() const
{
return d_func()->assignedSyncView;
@ -2728,6 +2745,24 @@ void QQuickTableView::setSyncView(QQuickTableView *view)
emit syncViewChanged();
}
/*!
\qmlproperty Qt::Orientations QtQuick::TableView::syncDirection
If the \l syncView is set on a TableView, this property controls
synchronization of flicking direction(s) for both tables. The default is \c
{Qt.Horizontal | Qt.Vertical}, which means that if you flick either table
in either direction, the other table is flicked the same amount in the
same direction.
This property and \l syncView can be used to make two tableViews
synchronize with each other smoothly in flicking regardless of the different
overshoot/undershoot, velocity, acceleration/deceleration or rebound
animation, and so on.
A typical use case is to make several headers flick along with the table.
\sa syncView, headerView
*/
Qt::Orientations QQuickTableView::syncDirection() const
{
return d_func()->assignedSyncDirection;

View File

@ -395,6 +395,9 @@ QSGTexture::~QSGTexture()
Binding a texture may also include uploading the texture data from
a previously set QImage.
\warning This function should only be called when running with the
direct OpenGL rendering path.
\warning This function can only be called from the rendering thread.
*/

View File

@ -31,12 +31,15 @@
#include <private/qquickmultipointtoucharea_p.h>
#include <private/qquickflickable_p.h>
#include <private/qquickmousearea_p.h>
#include <private/qquickwindow_p.h>
#include <qpa/qwindowsysteminterface.h>
#include <QtQuick/qquickview.h>
#include <QtGui/QScreen>
#include "../../shared/util.h"
#include "../shared/viewtestutil.h"
Q_LOGGING_CATEGORY(lcTests, "qt.quick.tests")
class tst_QQuickMultiPointTouchArea : public QQmlDataTest
{
Q_OBJECT
@ -62,6 +65,7 @@ private slots:
void nested();
void inFlickable();
void inFlickable2();
void inFlickableWithPressDelay();
void inMouseArea();
void mouseAsTouchpoint();
void invisible();
@ -812,6 +816,68 @@ void tst_QQuickMultiPointTouchArea::inFlickable2()
QTRY_VERIFY(!flickable->isMoving());
}
void tst_QQuickMultiPointTouchArea::inFlickableWithPressDelay() // QTBUG-78818
{
const int dragThreshold = QGuiApplication::styleHints()->startDragDistance();
QScopedPointer<QQuickView> window(createAndShowView("inFlickable.qml"));
QVERIFY(window->rootObject() != nullptr);
QQuickWindowPrivate *windowPriv = QQuickWindowPrivate::get(window.data());
QQuickFlickable *flickable = qobject_cast<QQuickFlickable *>(window->rootObject());
QVERIFY(flickable != nullptr);
flickable->setPressDelay(50);
QQuickMultiPointTouchArea *mpta = window->rootObject()->findChild<QQuickMultiPointTouchArea*>();
QVERIFY(mpta != nullptr);
mpta->setMinimumTouchPoints(1);
QQuickTouchPoint *point11 = window->rootObject()->findChild<QQuickTouchPoint*>("point1");
QPoint p1(20,100);
// press: Flickable prevents delivery of TouchBegin, but sends mouse press instead, after the delay.
// MPTA handles the mouse press, and its first declared touchpoint is pressed.
QTest::touchEvent(window.data(), device).press(0, p1);
QQuickTouchUtils::flush(window.data());
QTRY_COMPARE(point11->pressed(), true);
auto pointerEvent = windowPriv->pointerEventInstance(QQuickPointerDevice::touchDevices().at(0));
QCOMPARE(pointerEvent->point(0)->exclusiveGrabber(), mpta);
// release: MPTA receives TouchEnd (which is asymmetric with mouse press); does NOT emit canceled.
QTest::touchEvent(window.data(), device).release(0, p1);
QQuickTouchUtils::flush(window.data());
QCOMPARE(flickable->property("cancelCount").toInt(), 0);
// press again
QTest::touchEvent(window.data(), device).press(0, p1);
QQuickTouchUtils::flush(window.data());
QTRY_COMPARE(point11->pressed(), true); // wait until pressDelay exceeded
QCOMPARE(pointerEvent->point(0)->exclusiveGrabber(), mpta);
// drag past the threshold: Flickable takes over the grab, MPTA gets touchUngrab and is no longer pressed
int i = 0;
for (; i < 10 && window->mouseGrabberItem() != flickable; ++i) {
p1 += QPoint(0,dragThreshold);
QTest::touchEvent(window.data(), device).move(0, p1);
QQuickTouchUtils::flush(window.data());
}
QCOMPARE(window->mouseGrabberItem(), flickable);
qCDebug(lcTests, "Flickable stole grab from MPTA after %d moves", i);
QCOMPARE(pointerEvent->point(0)->exclusiveGrabber(), flickable);
QCOMPARE(point11->pressed(), false);
QVERIFY(flickable->property("cancelCount").toInt() > 0); // actually 2 because 2 touchPoints are declared... but only one was really cancelled
// drag a little more and the Flickable moves
p1 += QPoint(0,1);
QTest::touchEvent(window.data(), device).move(0, p1);
QQuickTouchUtils::flush(window.data());
QVERIFY(flickable->contentY() < 0);
QVERIFY(flickable->isMoving());
QTest::touchEvent(window.data(), device).release(0, p1);
QQuickTouchUtils::flush(window.data());
QTRY_VERIFY(!flickable->isMoving());
}
// QTBUG-31047
void tst_QQuickMultiPointTouchArea::inMouseArea()
{

View File

@ -212,6 +212,7 @@ bool tst_Scenegraph::renderAndGrab(const QString& qmlFile, const QStringList& ex
{
bool usePipe = true; // Whether to transport the grabbed image using temp. file or pipe. TBD: cmdline option
QProcess grabber;
grabber.setProcessChannelMode(QProcess::ForwardedErrorChannel);
QStringList args = extraArgs;
QString tmpfile = usePipe ? QString("-") : QString("/tmp/qmlscenegrabber-%1-out.ppm").arg(QCoreApplication::applicationPid());
args << qmlFile << "-o" << tmpfile;