Merge remote-tracking branch 'origin/5.11' into 5.12
Conflicts: src/quick/items/qquickevents_p_p.h Change-Id: I8c699aeb46903e2ea80a97a346cb5af460859a98
This commit is contained in:
commit
87662fd1b7
|
@ -123,7 +123,7 @@ struct ExecutableAllocator {
|
|||
}
|
||||
# endif
|
||||
# elif OS(INTEGRITY)
|
||||
OSAllocator::setMemoryAttributes(addr, /*writable*/ true, /*executable*/ false);
|
||||
OSAllocator::setMemoryAttributes(addr, size, /*writable*/ true, /*executable*/ false);
|
||||
# else
|
||||
int mode = PROT_READ | PROT_WRITE;
|
||||
if (mprotect(addr, size, mode) != 0) {
|
||||
|
@ -159,7 +159,7 @@ struct ExecutableAllocator {
|
|||
}
|
||||
# endif
|
||||
# elif OS(INTEGRITY)
|
||||
OSAllocator::setMemoryAttributes(addr, /*writable*/ false, /*executable*/ true);
|
||||
OSAllocator::setMemoryAttributes(addr, size, /*writable*/ false, /*executable*/ true);
|
||||
# else
|
||||
int mode = PROT_READ | PROT_EXEC;
|
||||
if (mprotect(addr, size, mode) != 0) {
|
||||
|
|
|
@ -75,7 +75,7 @@ public:
|
|||
static bool canAllocateExecutableMemory();
|
||||
|
||||
#if defined(Q_OS_INTEGRITY)
|
||||
static void setMemoryAttributes(void* addr, bool writable, bool executable);
|
||||
static void setMemoryAttributes(void* addr, size_t size, bool writable, bool executable);
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
|
@ -123,10 +123,14 @@ Error setAttributes(MemoryRegion mr, bool writable, bool executable)
|
|||
return SetMemoryRegionAttributes(mr, attributes);
|
||||
}
|
||||
|
||||
void OSAllocator::setMemoryAttributes(void* addr, bool writable, bool executable)
|
||||
void OSAllocator::setMemoryAttributes(void* addr, size_t size, bool writable, bool executable)
|
||||
{
|
||||
const MRPair* pair = memoryRegionsContainer.getMRPair((Address)addr);
|
||||
CheckSuccess(setAttributes(pair->vmr, writable, executable));
|
||||
Address addressIterator = Address(addr);
|
||||
for(int i=0; i<(size + ASP_PAGESIZE -1)/ASP_PAGESIZE; i++) {
|
||||
const MRPair* pair = memoryRegionsContainer.getMRPair(addressIterator);
|
||||
CheckSuccess(setAttributes(pair->vmr, writable, executable));
|
||||
addressIterator += ASP_PAGESIZE;
|
||||
}
|
||||
}
|
||||
|
||||
void* OSAllocator::reserveUncommitted(size_t bytes, Usage usage, bool writable, bool executable)
|
||||
|
@ -140,9 +144,9 @@ void* OSAllocator::reserveUncommitted(size_t bytes, Usage usage, bool writable,
|
|||
Address addressIterator = virtualStart;
|
||||
for(int i=0; i<(bytes + ASP_PAGESIZE -1)/ASP_PAGESIZE; i++) {
|
||||
MRPair pair;
|
||||
pair.start = addressIterator;
|
||||
CheckSuccess(SplitMemoryRegion(VMR, ASP_PAGESIZE, &pair.vmr));
|
||||
CheckSuccess(setAttributes(pair.vmr, writable, executable));
|
||||
pair.start = addressIterator;
|
||||
|
||||
memoryRegionsContainer.insertMRPair(&pair);
|
||||
addressIterator += ASP_PAGESIZE;
|
||||
|
|
|
@ -54,7 +54,9 @@
|
|||
#include <QThread>
|
||||
#include <QMutex>
|
||||
#include <QWaitCondition>
|
||||
#if QT_CONFIG(filesystemwatcher)
|
||||
#include <QFileSystemWatcher>
|
||||
#endif
|
||||
#include <QFileInfo>
|
||||
#include <QDir>
|
||||
|
||||
|
|
|
@ -359,7 +359,7 @@ List properties should have no setter. In the example above, the Q_PROPERTY()
|
|||
declarative will look like this:
|
||||
|
||||
\code
|
||||
Q_PROPERTY(QQmlListProperty<Fruit> fruit READ fruit);
|
||||
Q_PROPERTY(QQmlListProperty<Fruit> fruit READ fruit)
|
||||
\endcode
|
||||
|
||||
QML list properties are type-safe - in this case \c {Fruit} is a QObject type that
|
||||
|
|
|
@ -1632,6 +1632,7 @@ void QQuickPathView::mousePressEvent(QMouseEvent *event)
|
|||
|
||||
void QQuickPathViewPrivate::handleMousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
Q_Q(QQuickPathView);
|
||||
if (!interactive || !items.count() || !model || !modelCount)
|
||||
return;
|
||||
velocityBuffer.clear();
|
||||
|
@ -1657,6 +1658,7 @@ void QQuickPathViewPrivate::handleMousePressEvent(QMouseEvent *event)
|
|||
stealMouse = true; // If we've been flicked then steal the click.
|
||||
else
|
||||
stealMouse = false;
|
||||
q->setKeepMouseGrab(stealMouse);
|
||||
|
||||
timer.start();
|
||||
lastPosTime = computeCurrentTime(event);
|
||||
|
|
|
@ -697,8 +697,8 @@ bool QQuickWindowPrivate::deliverTouchAsMouse(QQuickItem *item, QQuickPointerEve
|
|||
touchMouseId = p.id();
|
||||
if (!q->mouseGrabberItem())
|
||||
item->grabMouse();
|
||||
auto pointerEventPoint = pointerEvent->pointById(p.id());
|
||||
pointerEventPoint->setGrabberItem(item);
|
||||
if (auto pointerEventPoint = pointerEvent->pointById(p.id()))
|
||||
pointerEventPoint->setGrabberItem(item);
|
||||
|
||||
if (checkIfDoubleClicked(event->timestamp())) {
|
||||
QScopedPointer<QMouseEvent> mouseDoubleClick(touchToMouseEvent(QEvent::MouseButtonDblClick, p, event.data(), item, false));
|
||||
|
@ -2637,19 +2637,22 @@ void QQuickWindowPrivate::deliverMatchingPointsToItem(QQuickItem *item, QQuickPo
|
|||
// update accepted new points.
|
||||
bool isPressOrRelease = pointerEvent->isPressEvent() || pointerEvent->isReleaseEvent();
|
||||
for (auto point: qAsConst(touchEvent->touchPoints())) {
|
||||
auto pointerEventPoint = ptEvent->pointById(point.id());
|
||||
pointerEventPoint->setAccepted();
|
||||
if (isPressOrRelease)
|
||||
pointerEventPoint->setGrabberItem(item);
|
||||
if (auto pointerEventPoint = ptEvent->pointById(point.id())) {
|
||||
pointerEventPoint->setAccepted();
|
||||
if (isPressOrRelease)
|
||||
pointerEventPoint->setGrabberItem(item);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// But if the event was not accepted then we know this item
|
||||
// will not be interested in further updates for those touchpoint IDs either.
|
||||
for (auto point: qAsConst(touchEvent->touchPoints())) {
|
||||
if (point.state() == Qt::TouchPointPressed) {
|
||||
if (ptEvent->pointById(point.id())->exclusiveGrabber() == item) {
|
||||
qCDebug(DBG_TOUCH_TARGET) << "TP" << hex << point.id() << "disassociated";
|
||||
ptEvent->pointById(point.id())->setGrabberItem(nullptr);
|
||||
if (auto *tp = ptEvent->pointById(point.id())) {
|
||||
if (tp->exclusiveGrabber() == item) {
|
||||
qCDebug(DBG_TOUCH_TARGET) << "TP" << hex << point.id() << "disassociated";
|
||||
tp->setGrabberItem(nullptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -50,6 +50,8 @@
|
|||
|
||||
#include <math.h>
|
||||
|
||||
Q_LOGGING_CATEGORY(lcTests, "qt.quick.tests")
|
||||
|
||||
using namespace QQuickViewTestUtil;
|
||||
using namespace QQuickVisualTestUtil;
|
||||
|
||||
|
@ -2263,6 +2265,59 @@ void tst_QQuickPathView::nestedinFlickable()
|
|||
QCOMPARE(fflickingSpy.count(), 0);
|
||||
QCOMPARE(fflickStartedSpy.count(), 0);
|
||||
QCOMPARE(fflickEndedSpy.count(), 0);
|
||||
|
||||
// now test that two quick flicks are both handled by the pathview
|
||||
movingSpy.clear();
|
||||
moveStartedSpy.clear();
|
||||
moveEndedSpy.clear();
|
||||
fflickingSpy.clear();
|
||||
fflickStartedSpy.clear();
|
||||
fflickEndedSpy.clear();
|
||||
int shortInterval = 2;
|
||||
QTest::mousePress(window.data(), Qt::LeftButton, 0, QPoint(23,216));
|
||||
QTest::mouseMove(window.data(), QPoint(48,216), shortInterval);
|
||||
QTest::mouseRelease(window.data(), Qt::LeftButton, 0, QPoint(73,217));
|
||||
QVERIFY(pathview->isMoving());
|
||||
QTest::mousePress(window.data(), Qt::LeftButton, 0, QPoint(21,216));
|
||||
QTest::mouseMove(window.data(), QPoint(46,216), shortInterval);
|
||||
QTest::mouseRelease(window.data(), Qt::LeftButton, 0, QPoint(71,217));
|
||||
QVERIFY(pathview->isMoving());
|
||||
// moveEndedSpy.count() and moveStartedSpy.count() should be exactly 1
|
||||
// but in CI we sometimes see a scheduling issue being hit which
|
||||
// causes the main thread to be stalled while the animation thread
|
||||
// continues, allowing the animation timer to finish after the first
|
||||
// call to QVERIFY(pathview->isMoving()) in the code above, prior to
|
||||
// the detected beginning of the second flick, which can cause both of
|
||||
// those signal counts to be 2 rather than 1.
|
||||
// Note that this is not a true problem (this scheduling quirk just
|
||||
// means that the unit test is not testing the enforced behavior
|
||||
// as strictly as it would otherwise); it is only a bug if it results
|
||||
// in the Flickable handling one or more of the flicks, and that
|
||||
// is unconditionally tested below.
|
||||
// To avoid false positive test failure in the scheduling quirk case
|
||||
// we allow the multiple signal count case, rather than simply:
|
||||
// QTRY_COMPARE(moveEndedSpy.count(), 1);
|
||||
// QCOMPARE(moveStartedSpy.count(), 1);
|
||||
QTRY_VERIFY(moveEndedSpy.count() > 0);
|
||||
qCDebug(lcTests) << "After receiving moveEnded signal:"
|
||||
<< "moveEndedSpy.count():" << moveEndedSpy.count()
|
||||
<< "moveStartedSpy.count():" << moveStartedSpy.count()
|
||||
<< "fflickingSpy.count():" << fflickingSpy.count()
|
||||
<< "fflickStartedSpy.count():" << fflickStartedSpy.count()
|
||||
<< "fflickEndedSpy.count():" << fflickEndedSpy.count();
|
||||
QTRY_COMPARE(moveStartedSpy.count(), moveEndedSpy.count());
|
||||
qCDebug(lcTests) << "After receiving matched moveEnded signal(s):"
|
||||
<< "moveEndedSpy.count():" << moveEndedSpy.count()
|
||||
<< "moveStartedSpy.count():" << moveStartedSpy.count()
|
||||
<< "fflickingSpy.count():" << fflickingSpy.count()
|
||||
<< "fflickStartedSpy.count():" << fflickStartedSpy.count()
|
||||
<< "fflickEndedSpy.count():" << fflickEndedSpy.count();
|
||||
QVERIFY(moveStartedSpy.count() <= 2);
|
||||
// Flickable should not handle this
|
||||
QCOMPARE(fflickingSpy.count(), 0);
|
||||
QCOMPARE(fflickStartedSpy.count(), 0);
|
||||
QCOMPARE(fflickEndedSpy.count(), 0);
|
||||
|
||||
}
|
||||
|
||||
void tst_QQuickPathView::flickableDelegate()
|
||||
|
|
Loading…
Reference in New Issue