mirror of
https://github.com/gentoo-mirror/gentoo.git
synced 2026-08-06 00:48:18 -07:00
dev-qt: Drop unused patches
This commit is contained in:
@@ -1,152 +0,0 @@
|
||||
From baad82d242a4d8c1af6c87faaa7f25584183fd53 Mon Sep 17 00:00:00 2001
|
||||
From: Stephen Kelly <steveire@gmail.com>
|
||||
Date: Tue, 20 Dec 2016 00:44:12 +0000
|
||||
Subject: [PATCH] QIPM: Persist model indexes after emitting layoutChange, not
|
||||
before
|
||||
|
||||
Callers can persist a QModelIndex which was not persisted before in a
|
||||
slot connected to the signal, and such a persisted index must be updated
|
||||
in the course of the layoutChange.
|
||||
|
||||
Store the indexes to persist after emitting the signal.
|
||||
|
||||
Task-number: QTBUG-32981
|
||||
Change-Id: Ibee4c0d84817d72603a03fe5b22fdeefeac0695e
|
||||
Reviewed-by: David Faure <david.faure@kdab.com>
|
||||
---
|
||||
src/corelib/itemmodels/qidentityproxymodel.cpp | 18 ++---
|
||||
.../tst_qidentityproxymodel.cpp | 76 ++++++++++++++++++++++
|
||||
2 files changed, 85 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/src/corelib/itemmodels/qidentityproxymodel.cpp b/src/corelib/itemmodels/qidentityproxymodel.cpp
|
||||
index e537793..7c30679 100644
|
||||
--- a/src/corelib/itemmodels/qidentityproxymodel.cpp
|
||||
+++ b/src/corelib/itemmodels/qidentityproxymodel.cpp
|
||||
@@ -496,15 +496,6 @@ void QIdentityProxyModelPrivate::_q_sourceLayoutAboutToBeChanged(const QList<QPe
|
||||
{
|
||||
Q_Q(QIdentityProxyModel);
|
||||
|
||||
- const auto proxyPersistentIndexes = q->persistentIndexList();
|
||||
- for (const QPersistentModelIndex &proxyPersistentIndex : proxyPersistentIndexes) {
|
||||
- proxyIndexes << proxyPersistentIndex;
|
||||
- Q_ASSERT(proxyPersistentIndex.isValid());
|
||||
- const QPersistentModelIndex srcPersistentIndex = q->mapToSource(proxyPersistentIndex);
|
||||
- Q_ASSERT(srcPersistentIndex.isValid());
|
||||
- layoutChangePersistentIndexes << srcPersistentIndex;
|
||||
- }
|
||||
-
|
||||
QList<QPersistentModelIndex> parents;
|
||||
parents.reserve(sourceParents.size());
|
||||
for (const QPersistentModelIndex &parent : sourceParents) {
|
||||
@@ -518,6 +509,15 @@ void QIdentityProxyModelPrivate::_q_sourceLayoutAboutToBeChanged(const QList<QPe
|
||||
}
|
||||
|
||||
q->layoutAboutToBeChanged(parents, hint);
|
||||
+
|
||||
+ const auto proxyPersistentIndexes = q->persistentIndexList();
|
||||
+ for (const QPersistentModelIndex &proxyPersistentIndex : proxyPersistentIndexes) {
|
||||
+ proxyIndexes << proxyPersistentIndex;
|
||||
+ Q_ASSERT(proxyPersistentIndex.isValid());
|
||||
+ const QPersistentModelIndex srcPersistentIndex = q->mapToSource(proxyPersistentIndex);
|
||||
+ Q_ASSERT(srcPersistentIndex.isValid());
|
||||
+ layoutChangePersistentIndexes << srcPersistentIndex;
|
||||
+ }
|
||||
}
|
||||
|
||||
void QIdentityProxyModelPrivate::_q_sourceLayoutChanged(const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)
|
||||
diff --git a/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp b/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp
|
||||
index e946f31..564b854 100644
|
||||
--- a/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp
|
||||
+++ b/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp
|
||||
@@ -68,6 +68,8 @@ private slots:
|
||||
|
||||
void itemData();
|
||||
|
||||
+ void persistIndexOnLayoutChange();
|
||||
+
|
||||
protected:
|
||||
void verifyIdentity(QAbstractItemModel *model, const QModelIndex &parent = QModelIndex());
|
||||
|
||||
@@ -377,5 +379,79 @@ void tst_QIdentityProxyModel::itemData()
|
||||
QCOMPARE(proxy.itemData(topIndex).value(Qt::DisplayRole).toString(), QStringLiteral("Monday_appended"));
|
||||
}
|
||||
|
||||
+void dump(QAbstractItemModel* model, QString const& indent = " - ", QModelIndex const& parent = {})
|
||||
+{
|
||||
+ for (auto row = 0; row < model->rowCount(parent); ++row)
|
||||
+ {
|
||||
+ auto idx = model->index(row, 0, parent);
|
||||
+ qDebug() << (indent + idx.data().toString());
|
||||
+ dump(model, indent + "- ", idx);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+void tst_QIdentityProxyModel::persistIndexOnLayoutChange()
|
||||
+{
|
||||
+ DynamicTreeModel model;
|
||||
+
|
||||
+ QList<int> ancestors;
|
||||
+ for (auto i = 0; i < 3; ++i)
|
||||
+ {
|
||||
+ Q_UNUSED(i);
|
||||
+ ModelInsertCommand insertCommand(&model);
|
||||
+ insertCommand.setAncestorRowNumbers(ancestors);
|
||||
+ insertCommand.setStartRow(0);
|
||||
+ insertCommand.setEndRow(0);
|
||||
+ insertCommand.doCommand();
|
||||
+ ancestors.push_back(0);
|
||||
+ }
|
||||
+ ModelInsertCommand insertCommand(&model);
|
||||
+ insertCommand.setAncestorRowNumbers(ancestors);
|
||||
+ insertCommand.setStartRow(0);
|
||||
+ insertCommand.setEndRow(1);
|
||||
+ insertCommand.doCommand();
|
||||
+
|
||||
+ // dump(&model);
|
||||
+ // " - 1"
|
||||
+ // " - - 2"
|
||||
+ // " - - - 3"
|
||||
+ // " - - - - 4"
|
||||
+ // " - - - - 5"
|
||||
+
|
||||
+ QIdentityProxyModel proxy;
|
||||
+ proxy.setSourceModel(&model);
|
||||
+
|
||||
+ QPersistentModelIndex persistentIndex;
|
||||
+
|
||||
+ QPersistentModelIndex sourcePersistentIndex = model.match(model.index(0, 0), Qt::DisplayRole, "5", 1, Qt::MatchRecursive).first();
|
||||
+
|
||||
+ QCOMPARE(sourcePersistentIndex.data().toString(), QStringLiteral("5"));
|
||||
+
|
||||
+ bool gotLayoutAboutToBeChanged = false;
|
||||
+ bool gotLayoutChanged = false;
|
||||
+
|
||||
+ QObject::connect(&proxy, &QAbstractItemModel::layoutAboutToBeChanged, &proxy, [&proxy, &persistentIndex, &gotLayoutAboutToBeChanged]
|
||||
+ {
|
||||
+ gotLayoutAboutToBeChanged = true;
|
||||
+ persistentIndex = proxy.match(proxy.index(0, 0), Qt::DisplayRole, "5", 1, Qt::MatchRecursive).first();
|
||||
+ });
|
||||
+
|
||||
+ QObject::connect(&proxy, &QAbstractItemModel::layoutChanged, &proxy, [&proxy, &persistentIndex, &sourcePersistentIndex, &gotLayoutChanged]
|
||||
+ {
|
||||
+ gotLayoutChanged = true;
|
||||
+ QCOMPARE(QModelIndex(persistentIndex), proxy.mapFromSource(sourcePersistentIndex));
|
||||
+ });
|
||||
+
|
||||
+ ModelChangeChildrenLayoutsCommand layoutChangeCommand(&model, 0);
|
||||
+
|
||||
+ layoutChangeCommand.setAncestorRowNumbers(QList<int>{0, 0, 0});
|
||||
+ layoutChangeCommand.setSecondAncestorRowNumbers(QList<int>{0, 0});
|
||||
+
|
||||
+ layoutChangeCommand.doCommand();
|
||||
+
|
||||
+ QVERIFY(gotLayoutAboutToBeChanged);
|
||||
+ QVERIFY(gotLayoutChanged);
|
||||
+ QVERIFY(persistentIndex.isValid());
|
||||
+}
|
||||
+
|
||||
QTEST_MAIN(tst_QIdentityProxyModel)
|
||||
#include "tst_qidentityproxymodel.moc"
|
||||
--
|
||||
2.7.4
|
||||
|
||||
@@ -1,252 +0,0 @@
|
||||
From 3bd0fd8f97e7a33a874929a383a42e6c710bfff3 Mon Sep 17 00:00:00 2001
|
||||
From: Stephen Kelly <steveire@gmail.com>
|
||||
Date: Sat, 17 Dec 2016 06:20:06 +0000
|
||||
Subject: [PATCH] QSFPM: Fix handling of source model layout change
|
||||
|
||||
In sourceLayoutAboutToBeChanged the source model update is ignored if
|
||||
the affected parents are filtered out anyway. The same logic is
|
||||
attempted in the sourceLayoutChanged slot, but there the early-return
|
||||
logic is applied too late - the mapping is cleared before performing the
|
||||
early-return. Because pointers into the mapping are used in the
|
||||
internalPointer of QModelIndexes in this class, persistent indexes used
|
||||
later will segfault when attempting to dereference it.
|
||||
|
||||
Additionally, if a parent becomes invalid as a result of the
|
||||
layoutChange, it would be filtered out by the condition in the loop,
|
||||
resulting in a different result in the comparison of emptiness of the
|
||||
parents container.
|
||||
|
||||
Fix that by persisting the parent's container, and performing the test
|
||||
for early-return before clearing the mapping.
|
||||
|
||||
Task-number: QTBUG-47711
|
||||
Task-number: QTBUG-32981
|
||||
Change-Id: If45e8a1c97d39454160f52041bc9ae7e337dce97
|
||||
Reviewed-by: David Faure <david.faure@kdab.com>
|
||||
---
|
||||
src/corelib/itemmodels/qsortfilterproxymodel.cpp | 31 ++---
|
||||
.../tst_qsortfilterproxymodel.cpp | 126 +++++++++++++++++++++
|
||||
2 files changed, 137 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/src/corelib/itemmodels/qsortfilterproxymodel.cpp b/src/corelib/itemmodels/qsortfilterproxymodel.cpp
|
||||
index b0ddfa8..3331521 100644
|
||||
--- a/src/corelib/itemmodels/qsortfilterproxymodel.cpp
|
||||
+++ b/src/corelib/itemmodels/qsortfilterproxymodel.cpp
|
||||
@@ -171,6 +171,7 @@ public:
|
||||
QRowsRemoval itemsBeingRemoved;
|
||||
|
||||
QModelIndexPairList saved_persistent_indexes;
|
||||
+ QList<QPersistentModelIndex> saved_layoutChange_parents;
|
||||
|
||||
QHash<QModelIndex, Mapping *>::const_iterator create_mapping(
|
||||
const QModelIndex &source_parent) const;
|
||||
@@ -1331,23 +1332,23 @@ void QSortFilterProxyModelPrivate::_q_sourceLayoutAboutToBeChanged(const QList<Q
|
||||
Q_UNUSED(hint); // We can't forward Hint because we might filter additional rows or columns
|
||||
saved_persistent_indexes.clear();
|
||||
|
||||
- QList<QPersistentModelIndex> parents;
|
||||
+ saved_layoutChange_parents.clear();
|
||||
for (const QPersistentModelIndex &parent : sourceParents) {
|
||||
if (!parent.isValid()) {
|
||||
- parents << QPersistentModelIndex();
|
||||
+ saved_layoutChange_parents << QPersistentModelIndex();
|
||||
continue;
|
||||
}
|
||||
const QModelIndex mappedParent = q->mapFromSource(parent);
|
||||
// Might be filtered out.
|
||||
if (mappedParent.isValid())
|
||||
- parents << mappedParent;
|
||||
+ saved_layoutChange_parents << mappedParent;
|
||||
}
|
||||
|
||||
// All parents filtered out.
|
||||
- if (!sourceParents.isEmpty() && parents.isEmpty())
|
||||
+ if (!sourceParents.isEmpty() && saved_layoutChange_parents.isEmpty())
|
||||
return;
|
||||
|
||||
- emit q->layoutAboutToBeChanged(parents);
|
||||
+ emit q->layoutAboutToBeChanged(saved_layoutChange_parents);
|
||||
if (persistent.indexes.isEmpty())
|
||||
return;
|
||||
|
||||
@@ -1359,6 +1360,9 @@ void QSortFilterProxyModelPrivate::_q_sourceLayoutChanged(const QList<QPersisten
|
||||
Q_Q(QSortFilterProxyModel);
|
||||
Q_UNUSED(hint); // We can't forward Hint because we might filter additional rows or columns
|
||||
|
||||
+ if (!sourceParents.isEmpty() && saved_layoutChange_parents.isEmpty())
|
||||
+ return;
|
||||
+
|
||||
// Optimize: We only actually have to clear the mapping related to the contents of
|
||||
// sourceParents, not everything.
|
||||
qDeleteAll(source_index_mapping);
|
||||
@@ -1373,21 +1377,8 @@ void QSortFilterProxyModelPrivate::_q_sourceLayoutChanged(const QList<QPersisten
|
||||
source_index_mapping.clear();
|
||||
}
|
||||
|
||||
- QList<QPersistentModelIndex> parents;
|
||||
- for (const QPersistentModelIndex &parent : sourceParents) {
|
||||
- if (!parent.isValid()) {
|
||||
- parents << QPersistentModelIndex();
|
||||
- continue;
|
||||
- }
|
||||
- const QModelIndex mappedParent = q->mapFromSource(parent);
|
||||
- if (mappedParent.isValid())
|
||||
- parents << mappedParent;
|
||||
- }
|
||||
-
|
||||
- if (!sourceParents.isEmpty() && parents.isEmpty())
|
||||
- return;
|
||||
-
|
||||
- emit q->layoutChanged(parents);
|
||||
+ emit q->layoutChanged(saved_layoutChange_parents);
|
||||
+ saved_layoutChange_parents.clear();
|
||||
}
|
||||
|
||||
void QSortFilterProxyModelPrivate::_q_sourceRowsAboutToBeInserted(
|
||||
diff --git a/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp b/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp
|
||||
index 38e3c68..6b98d9f 100644
|
||||
--- a/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp
|
||||
+++ b/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp
|
||||
@@ -145,6 +145,8 @@ private slots:
|
||||
void canDropMimeData();
|
||||
void filterHint();
|
||||
|
||||
+ void sourceLayoutChangeLeavesValidPersistentIndexes();
|
||||
+
|
||||
protected:
|
||||
void buildHierarchy(const QStringList &data, QAbstractItemModel *model);
|
||||
void checkHierarchy(const QStringList &data, const QAbstractItemModel *model);
|
||||
@@ -4181,5 +4183,129 @@ void tst_QSortFilterProxyModel::filterHint()
|
||||
QAbstractItemModel::NoLayoutChangeHint);
|
||||
}
|
||||
|
||||
+/**
|
||||
+
|
||||
+ Creates a model where each item has one child, to a set depth,
|
||||
+ and the last item has no children. For a model created with
|
||||
+ setDepth(4):
|
||||
+
|
||||
+ - 1
|
||||
+ - - 2
|
||||
+ - - - 3
|
||||
+ - - - - 4
|
||||
+*/
|
||||
+class StepTreeModel : public QAbstractItemModel
|
||||
+{
|
||||
+ Q_OBJECT
|
||||
+public:
|
||||
+ StepTreeModel(QObject * parent = 0)
|
||||
+ : QAbstractItemModel(parent), m_depth(0) {}
|
||||
+
|
||||
+ int columnCount(const QModelIndex& = QModelIndex()) const override { return 1; }
|
||||
+
|
||||
+ int rowCount(const QModelIndex& parent = QModelIndex()) const override
|
||||
+ {
|
||||
+ quintptr parentId = (parent.isValid()) ? parent.internalId() : 0;
|
||||
+ return (parentId < m_depth) ? 1 : 0;
|
||||
+ }
|
||||
+
|
||||
+ QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const override
|
||||
+ {
|
||||
+ if (role != Qt::DisplayRole)
|
||||
+ return QVariant();
|
||||
+
|
||||
+ return QString::number(index.internalId());
|
||||
+ }
|
||||
+
|
||||
+ QModelIndex index(int, int, const QModelIndex& parent = QModelIndex()) const override
|
||||
+ {
|
||||
+ quintptr parentId = (parent.isValid()) ? parent.internalId() : 0;
|
||||
+ if (parentId >= m_depth)
|
||||
+ return QModelIndex();
|
||||
+
|
||||
+ return createIndex(0, 0, parentId + 1);
|
||||
+ }
|
||||
+
|
||||
+ QModelIndex parent(const QModelIndex& index) const override
|
||||
+ {
|
||||
+ if (index.internalId() == 0)
|
||||
+ return QModelIndex();
|
||||
+
|
||||
+ return createIndex(0, 0, index.internalId() - 1);
|
||||
+ }
|
||||
+
|
||||
+ void setDepth(quintptr depth)
|
||||
+ {
|
||||
+ int parentIdWithLayoutChange = (m_depth < depth) ? m_depth : depth;
|
||||
+
|
||||
+ QList<QPersistentModelIndex> parentsOfLayoutChange;
|
||||
+ parentsOfLayoutChange.push_back(createIndex(0, 0, parentIdWithLayoutChange));
|
||||
+
|
||||
+ layoutAboutToBeChanged(parentsOfLayoutChange);
|
||||
+
|
||||
+ auto existing = persistentIndexList();
|
||||
+
|
||||
+ QList<QModelIndex> updated;
|
||||
+
|
||||
+ for (auto idx : existing) {
|
||||
+ if (indexDepth(idx) <= depth)
|
||||
+ updated.push_back(idx);
|
||||
+ else
|
||||
+ updated.push_back({});
|
||||
+ }
|
||||
+
|
||||
+ m_depth = depth;
|
||||
+
|
||||
+ changePersistentIndexList(existing, updated);
|
||||
+
|
||||
+ layoutChanged(parentsOfLayoutChange);
|
||||
+ }
|
||||
+
|
||||
+private:
|
||||
+ static quintptr indexDepth(QModelIndex const& index)
|
||||
+ {
|
||||
+ return (index.isValid()) ? 1 + indexDepth(index.parent()) : 0;
|
||||
+ }
|
||||
+
|
||||
+private:
|
||||
+ quintptr m_depth;
|
||||
+};
|
||||
+
|
||||
+void tst_QSortFilterProxyModel::sourceLayoutChangeLeavesValidPersistentIndexes()
|
||||
+{
|
||||
+ StepTreeModel model;
|
||||
+ Q_SET_OBJECT_NAME(model);
|
||||
+ model.setDepth(4);
|
||||
+
|
||||
+ QSortFilterProxyModel proxy1;
|
||||
+ proxy1.setSourceModel(&model);
|
||||
+ Q_SET_OBJECT_NAME(proxy1);
|
||||
+
|
||||
+ proxy1.setFilterRegExp("1|2");
|
||||
+
|
||||
+ // The current state of things:
|
||||
+ // model proxy
|
||||
+ // - 1 - 1
|
||||
+ // - - 2 - - 2
|
||||
+ // - - - 3
|
||||
+ // - - - - 4
|
||||
+
|
||||
+ // The setDepth call below removes '4' with a layoutChanged call.
|
||||
+ // Because the proxy filters that out anyway, the proxy doesn't need
|
||||
+ // to emit any signals or update persistent indexes.
|
||||
+
|
||||
+ QPersistentModelIndex persistentIndex = proxy1.index(0, 0, proxy1.index(0, 0));
|
||||
+
|
||||
+ model.setDepth(3);
|
||||
+
|
||||
+ // Calling parent() causes the internalPointer to be used.
|
||||
+ // Before fixing QTBUG-47711, that could be a dangling pointer.
|
||||
+ // The use of qDebug here makes sufficient use of the heap to
|
||||
+ // cause corruption at runtime with normal use on linux (before
|
||||
+ // the fix). valgrind confirms the fix.
|
||||
+ qDebug() << persistentIndex.parent();
|
||||
+ QVERIFY(persistentIndex.parent().isValid());
|
||||
+}
|
||||
+
|
||||
QTEST_MAIN(tst_QSortFilterProxyModel)
|
||||
#include "tst_qsortfilterproxymodel.moc"
|
||||
--
|
||||
2.7.4
|
||||
|
||||
|
||||
@@ -1,195 +0,0 @@
|
||||
From 0874861bcc70313c343aba5e5566ed30b69eed1c Mon Sep 17 00:00:00 2001
|
||||
From: Stephen Kelly <steveire@gmail.com>
|
||||
Date: Mon, 19 Dec 2016 21:13:57 +0000
|
||||
Subject: [PATCH] QSFPM: Remove data manipulation from move handlers
|
||||
|
||||
Similar to the fix in the parent commit, incorrect updating of the
|
||||
internal data structures during layout changes can lead to dangling
|
||||
pointers being dereferenced later. Moves are treated as layoutChanges
|
||||
by this proxy by forwarding to the appropriate method. However, data is
|
||||
incorrectly cleared prior to that forwarding. Remove that, and let the
|
||||
layoutChange handling take appropriate action.
|
||||
|
||||
Change-Id: Iee951e37152328a4e6a5fb8e5385c32a2fe4c0bd
|
||||
Reviewed-by: David Faure <david.faure@kdab.com>
|
||||
---
|
||||
src/corelib/itemmodels/qsortfilterproxymodel.cpp | 67 ++++------------------
|
||||
.../tst_qsortfilterproxymodel.cpp | 46 +++++++++++++++
|
||||
2 files changed, 58 insertions(+), 55 deletions(-)
|
||||
|
||||
diff --git a/src/corelib/itemmodels/qsortfilterproxymodel.cpp b/src/corelib/itemmodels/qsortfilterproxymodel.cpp
|
||||
index 3331521..226a240 100644
|
||||
--- a/src/corelib/itemmodels/qsortfilterproxymodel.cpp
|
||||
+++ b/src/corelib/itemmodels/qsortfilterproxymodel.cpp
|
||||
@@ -1418,49 +1418,27 @@ void QSortFilterProxyModelPrivate::_q_sourceRowsRemoved(
|
||||
void QSortFilterProxyModelPrivate::_q_sourceRowsAboutToBeMoved(
|
||||
const QModelIndex &sourceParent, int /* sourceStart */, int /* sourceEnd */, const QModelIndex &destParent, int /* dest */)
|
||||
{
|
||||
- Q_Q(QSortFilterProxyModel);
|
||||
// Because rows which are contiguous in the source model might not be contiguous
|
||||
// in the proxy due to sorting, the best thing we can do here is be specific about what
|
||||
// parents are having their children changed.
|
||||
// Optimize: Emit move signals if the proxy is not sorted. Will need to account for rows
|
||||
// being filtered out though.
|
||||
|
||||
- saved_persistent_indexes.clear();
|
||||
-
|
||||
QList<QPersistentModelIndex> parents;
|
||||
- parents << q->mapFromSource(sourceParent);
|
||||
+ parents << sourceParent;
|
||||
if (sourceParent != destParent)
|
||||
- parents << q->mapFromSource(destParent);
|
||||
- emit q->layoutAboutToBeChanged(parents);
|
||||
- if (persistent.indexes.isEmpty())
|
||||
- return;
|
||||
- saved_persistent_indexes = store_persistent_indexes();
|
||||
+ parents << destParent;
|
||||
+ _q_sourceLayoutAboutToBeChanged(parents, QAbstractItemModel::NoLayoutChangeHint);
|
||||
}
|
||||
|
||||
void QSortFilterProxyModelPrivate::_q_sourceRowsMoved(
|
||||
const QModelIndex &sourceParent, int /* sourceStart */, int /* sourceEnd */, const QModelIndex &destParent, int /* dest */)
|
||||
{
|
||||
- Q_Q(QSortFilterProxyModel);
|
||||
-
|
||||
- // Optimize: We only need to clear and update the persistent indexes which are children of
|
||||
- // sourceParent or destParent
|
||||
- qDeleteAll(source_index_mapping);
|
||||
- source_index_mapping.clear();
|
||||
-
|
||||
- update_persistent_indexes(saved_persistent_indexes);
|
||||
- saved_persistent_indexes.clear();
|
||||
-
|
||||
- if (dynamic_sortfilter && update_source_sort_column()) {
|
||||
- //update_source_sort_column might have created wrong mapping so we have to clear it again
|
||||
- qDeleteAll(source_index_mapping);
|
||||
- source_index_mapping.clear();
|
||||
- }
|
||||
-
|
||||
QList<QPersistentModelIndex> parents;
|
||||
- parents << q->mapFromSource(sourceParent);
|
||||
+ parents << sourceParent;
|
||||
if (sourceParent != destParent)
|
||||
- parents << q->mapFromSource(destParent);
|
||||
- emit q->layoutChanged(parents);
|
||||
+ parents << destParent;
|
||||
+ _q_sourceLayoutChanged(parents, QAbstractItemModel::NoLayoutChangeHint);
|
||||
}
|
||||
|
||||
void QSortFilterProxyModelPrivate::_q_sourceColumnsAboutToBeInserted(
|
||||
@@ -1522,42 +1500,21 @@ void QSortFilterProxyModelPrivate::_q_sourceColumnsRemoved(
|
||||
void QSortFilterProxyModelPrivate::_q_sourceColumnsAboutToBeMoved(
|
||||
const QModelIndex &sourceParent, int /* sourceStart */, int /* sourceEnd */, const QModelIndex &destParent, int /* dest */)
|
||||
{
|
||||
- Q_Q(QSortFilterProxyModel);
|
||||
-
|
||||
- saved_persistent_indexes.clear();
|
||||
-
|
||||
QList<QPersistentModelIndex> parents;
|
||||
- parents << q->mapFromSource(sourceParent);
|
||||
+ parents << sourceParent;
|
||||
if (sourceParent != destParent)
|
||||
- parents << q->mapFromSource(destParent);
|
||||
- emit q->layoutAboutToBeChanged(parents);
|
||||
-
|
||||
- if (persistent.indexes.isEmpty())
|
||||
- return;
|
||||
- saved_persistent_indexes = store_persistent_indexes();
|
||||
+ parents << destParent;
|
||||
+ _q_sourceLayoutAboutToBeChanged(parents, QAbstractItemModel::NoLayoutChangeHint);
|
||||
}
|
||||
|
||||
void QSortFilterProxyModelPrivate::_q_sourceColumnsMoved(
|
||||
const QModelIndex &sourceParent, int /* sourceStart */, int /* sourceEnd */, const QModelIndex &destParent, int /* dest */)
|
||||
{
|
||||
- Q_Q(QSortFilterProxyModel);
|
||||
-
|
||||
- qDeleteAll(source_index_mapping);
|
||||
- source_index_mapping.clear();
|
||||
-
|
||||
- update_persistent_indexes(saved_persistent_indexes);
|
||||
- saved_persistent_indexes.clear();
|
||||
-
|
||||
- if (dynamic_sortfilter && update_source_sort_column()) {
|
||||
- qDeleteAll(source_index_mapping);
|
||||
- source_index_mapping.clear();
|
||||
- }
|
||||
-
|
||||
QList<QPersistentModelIndex> parents;
|
||||
- parents << q->mapFromSource(sourceParent);
|
||||
+ parents << sourceParent;
|
||||
if (sourceParent != destParent)
|
||||
- parents << q->mapFromSource(destParent);
|
||||
- emit q->layoutChanged(parents);
|
||||
+ parents << destParent;
|
||||
+ _q_sourceLayoutChanged(parents, QAbstractItemModel::NoLayoutChangeHint);
|
||||
}
|
||||
|
||||
/*!
|
||||
diff --git a/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp b/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp
|
||||
index 6b98d9f..7b6c470 100644
|
||||
--- a/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp
|
||||
+++ b/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp
|
||||
@@ -146,6 +146,7 @@ private slots:
|
||||
void filterHint();
|
||||
|
||||
void sourceLayoutChangeLeavesValidPersistentIndexes();
|
||||
+ void rowMoveLeavesValidPersistentIndexes();
|
||||
|
||||
protected:
|
||||
void buildHierarchy(const QStringList &data, QAbstractItemModel *model);
|
||||
@@ -4307,5 +4308,50 @@ void tst_QSortFilterProxyModel::sourceLayoutChangeLeavesValidPersistentIndexes()
|
||||
QVERIFY(persistentIndex.parent().isValid());
|
||||
}
|
||||
|
||||
+void tst_QSortFilterProxyModel::rowMoveLeavesValidPersistentIndexes()
|
||||
+{
|
||||
+ DynamicTreeModel model;
|
||||
+ Q_SET_OBJECT_NAME(model);
|
||||
+
|
||||
+ QList<int> ancestors;
|
||||
+ for (auto i = 0; i < 5; ++i)
|
||||
+ {
|
||||
+ Q_UNUSED(i);
|
||||
+ ModelInsertCommand insertCommand(&model);
|
||||
+ insertCommand.setAncestorRowNumbers(ancestors);
|
||||
+ insertCommand.setStartRow(0);
|
||||
+ insertCommand.setEndRow(0);
|
||||
+ insertCommand.doCommand();
|
||||
+ ancestors.push_back(0);
|
||||
+ }
|
||||
+
|
||||
+ QSortFilterProxyModel proxy1;
|
||||
+ proxy1.setSourceModel(&model);
|
||||
+ Q_SET_OBJECT_NAME(proxy1);
|
||||
+
|
||||
+ proxy1.setFilterRegExp("1|2");
|
||||
+
|
||||
+ auto item5 = model.match(model.index(0, 0), Qt::DisplayRole, "5", 1, Qt::MatchRecursive).first();
|
||||
+ auto item3 = model.match(model.index(0, 0), Qt::DisplayRole, "3", 1, Qt::MatchRecursive).first();
|
||||
+
|
||||
+ Q_ASSERT(item5.isValid());
|
||||
+ Q_ASSERT(item3.isValid());
|
||||
+
|
||||
+ QPersistentModelIndex persistentIndex = proxy1.match(proxy1.index(0, 0), Qt::DisplayRole, "2", 1, Qt::MatchRecursive).first();
|
||||
+
|
||||
+ ModelMoveCommand moveCommand(&model, 0);
|
||||
+ moveCommand.setAncestorRowNumbers(QList<int>{0, 0, 0, 0});
|
||||
+ moveCommand.setStartRow(0);
|
||||
+ moveCommand.setEndRow(0);
|
||||
+ moveCommand.setDestRow(0);
|
||||
+ moveCommand.setDestAncestors(QList<int>{0, 0, 0});
|
||||
+ moveCommand.doCommand();
|
||||
+
|
||||
+ // Calling parent() causes the internalPointer to be used.
|
||||
+ // Before fixing QTBUG-47711 (moveRows case), that could be
|
||||
+ // a dangling pointer.
|
||||
+ QVERIFY(persistentIndex.parent().isValid());
|
||||
+}
|
||||
+
|
||||
QTEST_MAIN(tst_QSortFilterProxyModel)
|
||||
#include "tst_qsortfilterproxymodel.moc"
|
||||
--
|
||||
2.7.4
|
||||
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
From 291eba6f8099a0fec8fbd9cf8a1fb67e5c9f4f8d Mon Sep 17 00:00:00 2001
|
||||
From: Palo Kisa <palo.kisa@gmail.com>
|
||||
Date: Mon, 7 Nov 2016 18:27:17 +0100
|
||||
Subject: QClipboard: Fix emitting changed() in XCB
|
||||
|
||||
In XCB environment the QClipboard::changed() was not delivered if the
|
||||
QClipboard::clear() was issued by other Qt app/process.
|
||||
|
||||
If the QClipboard::clear() is used, then the owner in
|
||||
xcb_xfixes_selection_notify_event_t is XCB_NONE, so we need make the
|
||||
decission to handle this event by the selection_timestamp and our
|
||||
m_timestamp[mode].
|
||||
|
||||
Task-number: QTBUG-56972
|
||||
Change-Id: If4c486ac02223eac506465cac7ff1a07bd02a187
|
||||
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
|
||||
---
|
||||
src/plugins/platforms/xcb/qxcbclipboard.cpp | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbclipboard.cpp b/src/plugins/platforms/xcb/qxcbclipboard.cpp
|
||||
index d44ebae..40abef4 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbclipboard.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbclipboard.cpp
|
||||
@@ -723,8 +723,10 @@ void QXcbClipboard::handleXFixesSelectionRequest(xcb_xfixes_selection_notify_eve
|
||||
if (mode > QClipboard::Selection)
|
||||
return;
|
||||
|
||||
- // here we care only about the xfixes events that come from non Qt processes
|
||||
- if (event->owner != XCB_NONE && event->owner != owner()) {
|
||||
+ // Note1: Here we care only about the xfixes events that come from other processes.
|
||||
+ // Note2: If the QClipboard::clear() is issued, event->owner is XCB_NONE,
|
||||
+ // so we check selection_timestamp to not handle our own QClipboard::clear().
|
||||
+ if (event->owner != owner() && event->selection_timestamp > m_timestamp[mode]) {
|
||||
if (!m_xClipboard[mode]) {
|
||||
m_xClipboard[mode].reset(new QXcbClipboardMime(mode, this));
|
||||
} else {
|
||||
--
|
||||
cgit v1.0-4-g1e03
|
||||
@@ -1,34 +0,0 @@
|
||||
From 92805a0e9c488e47280e93f65e5378818e340ad1 Mon Sep 17 00:00:00 2001
|
||||
From: Laszlo Agocs <laszlo.agocs@qt.io>
|
||||
Date: Mon, 7 Nov 2016 11:23:21 +0100
|
||||
Subject: Fix EGL break on Debian X32
|
||||
|
||||
Change to QT_POINTER_SIZE instead of Q_PROCESSOR_WORDSIZE. The latter
|
||||
is 8 due to targeting 64-bit, but pointers are 32-bit still in such
|
||||
builds. For the condition in question it is the pointer size that
|
||||
matters.
|
||||
|
||||
Task-number: QTBUG-56686
|
||||
Change-Id: I96c203cae91ceb8404606de605c4fdb1a02a9d5f
|
||||
Reviewed-by: Dmitry Shachnev <mitya57@gmail.com>
|
||||
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
|
||||
---
|
||||
src/platformsupport/eglconvenience/qt_egl_p.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/platformsupport/eglconvenience/qt_egl_p.h b/src/platformsupport/eglconvenience/qt_egl_p.h
|
||||
index 615ee4b80a..b1495c9f9d 100644
|
||||
--- a/src/platformsupport/eglconvenience/qt_egl_p.h
|
||||
+++ b/src/platformsupport/eglconvenience/qt_egl_p.h
|
||||
@@ -83,7 +83,7 @@ struct QtEglConverter<uint32_t, uintptr_t>
|
||||
{ return v; }
|
||||
};
|
||||
|
||||
-#if Q_PROCESSOR_WORDSIZE > 4
|
||||
+#if QT_POINTER_SIZE > 4
|
||||
template <>
|
||||
struct QtEglConverter<uintptr_t, uint32_t>
|
||||
{
|
||||
--
|
||||
cgit v1.1-6-g87c4
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
From d25346417238b7dc0fb37359a9b56eff2908a5dc Mon Sep 17 00:00:00 2001
|
||||
From: =?utf8?q?Daniel=20Vr=C3=A1til?= <daniel.vratil@kdab.com>
|
||||
Date: Mon, 18 Sep 2017 22:33:55 +0200
|
||||
Subject: [PATCH] Only call mysql_library_end() once when using MariaDB
|
||||
|
||||
MariaDB allows only a single call to mysql_library_end(), all subsequent calls
|
||||
to mysql_library_init() or any other API call will fail. Since QMYSQLDriver
|
||||
calls mysql_library_end() function whenever the refcount drops to 0, this
|
||||
breaks applications that close and reopen database connections.
|
||||
|
||||
This change registers call to mysql_library_init() via qAddPostRoutine()
|
||||
when compiled against MariaDB, so that we only call it once.
|
||||
|
||||
Task-number: QTBUG-63108
|
||||
Change-Id: I22c1f0c5b081216f12596a32748dca25cae919e9
|
||||
Reviewed-by: Andy Shaw <andy.shaw@qt.io>
|
||||
---
|
||||
src/plugins/sqldrivers/mysql/qsql_mysql.cpp | 18 ++++++++++++------
|
||||
1 file changed, 12 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/plugins/sqldrivers/mysql/qsql_mysql.cpp b/src/plugins/sqldrivers/mysql/qsql_mysql.cpp
|
||||
index ee439fa..6e428fb 100644
|
||||
--- a/src/sql/drivers/mysql/qsql_mysql.cpp
|
||||
+++ b/src/sql/drivers/mysql/qsql_mysql.cpp
|
||||
@@ -1158,16 +1158,22 @@ static void qLibraryInit()
|
||||
}
|
||||
# endif // MYSQL_VERSION_ID
|
||||
#endif // Q_NO_MYSQL_EMBEDDED
|
||||
+
|
||||
+#ifdef MARIADB_BASE_VERSION
|
||||
+ qAddPostRoutine(mysql_server_end);
|
||||
+#endif
|
||||
}
|
||||
|
||||
static void qLibraryEnd()
|
||||
{
|
||||
-#ifndef Q_NO_MYSQL_EMBEDDED
|
||||
-# if MYSQL_VERSION_ID > 40000
|
||||
-# if (MYSQL_VERSION_ID >= 40110 && MYSQL_VERSION_ID < 50000) || MYSQL_VERSION_ID >= 50003
|
||||
- mysql_library_end();
|
||||
-# else
|
||||
- mysql_server_end();
|
||||
+#if !defined(MARIADB_BASE_VERSION)
|
||||
+# if !defined(Q_NO_MYSQL_EMBEDDED)
|
||||
+# if MYSQL_VERSION_ID > 40000
|
||||
+# if (MYSQL_VERSION_ID >= 40110 && MYSQL_VERSION_ID < 50000) || MYSQL_VERSION_ID >= 50003
|
||||
+ mysql_library_end();
|
||||
+# else
|
||||
+ mysql_server_end();
|
||||
+# endif
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
--
|
||||
2.7.4
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
diff -Naur qtwebengine-opensource-src-5.7.0.orig/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.h qtwebengine-opensource-src-5.7.0/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.h
|
||||
--- qtwebengine-opensource-src-5.7.0.orig/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.h 2016-11-23 13:01:20.929772871 -0800
|
||||
+++ qtwebengine-opensource-src-5.7.0/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.h 2016-11-23 13:02:18.879462854 -0800
|
||||
@@ -24,7 +24,9 @@
|
||||
// Disable deprecated features which result in spammy compile warnings. This
|
||||
// list of defines must mirror those in the 'defines' section of BUILD.gn file &
|
||||
// ffmpeg.gyp file or the headers below will generate different structures!
|
||||
+#if !defined(USE_SYSTEM_FFMPEG)
|
||||
#define FF_API_CONVERGENCE_DURATION 0
|
||||
+#endif
|
||||
// Upstream libavcodec/utils.c still uses the deprecated
|
||||
// av_dup_packet(), causing deprecation warnings.
|
||||
// The normal fix for such things is to disable the feature as below,
|
||||
@@ -1,51 +0,0 @@
|
||||
diff -Naur qtwebengine-opensource-src-5.7.0.orig/src/3rdparty/chromium/third_party/WebKit/Source/platform/text/TextBreakIterator.cpp qtwebengine-opensource-src-5.7.0/src/3rdparty/chromium/third_party/WebKit/Source/platform/text/TextBreakIterator.cpp
|
||||
--- qtwebengine-opensource-src-5.7.0.orig/src/3rdparty/chromium/third_party/WebKit/Source/platform/text/TextBreakIterator.cpp 2016-11-15 17:07:38.680665385 -0800
|
||||
+++ qtwebengine-opensource-src-5.7.0/src/3rdparty/chromium/third_party/WebKit/Source/platform/text/TextBreakIterator.cpp 2016-11-15 17:12:17.564001354 -0800
|
||||
@@ -26,6 +26,9 @@
|
||||
#include "wtf/StdLibExtras.h"
|
||||
#include "wtf/text/CharacterNames.h"
|
||||
|
||||
+#include <unicode/uchar.h>
|
||||
+#include <unicode/uvernum.h>
|
||||
+
|
||||
namespace blink {
|
||||
|
||||
unsigned numGraphemeClusters(const String& string)
|
||||
@@ -122,13 +125,18 @@
|
||||
{ B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), 0, B(0, 0, 0, 0, 0, 0, 0, 0), 0, 0, 0, B(0, 0, 0, 0, 0, 0, 0, 0), 0, 0, 0, B(0, 0, 0, 0, 0, 0, 0, 0) }, // DEL
|
||||
};
|
||||
|
||||
+#if U_ICU_VERSION_MAJOR_NUM >= 58
|
||||
+#define BA_LB_COUNT (U_LB_COUNT - 3)
|
||||
+#else
|
||||
+#define BA_LB_COUNT U_LB_COUNT
|
||||
+#endif
|
||||
// Line breaking table for CSS word-break: break-all. This table differs from
|
||||
// asciiLineBreakTable in:
|
||||
// - Indices are Line Breaking Classes defined in UAX#14 Unicode Line Breaking
|
||||
// Algorithm: http://unicode.org/reports/tr14/#DescriptionOfProperties
|
||||
// - 1 indicates additional break opportunities. 0 indicates to fallback to
|
||||
// normal line break, not "prohibit break."
|
||||
-static const unsigned char breakAllLineBreakClassTable[][U_LB_COUNT / 8 + 1] = {
|
||||
+static const unsigned char breakAllLineBreakClassTable[][BA_LB_COUNT / 8 + 1] = {
|
||||
// XX AI AL B2 BA BB BK CB CL CM CR EX GL HY ID IN IS LF NS NU OP PO PR QU SA SG SP SY ZW NL WJ H2 H3 JL JT JV CP CJ HL RI
|
||||
{ B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // XX
|
||||
{ B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 1, 0, 1, 0), B(1, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0) }, // AI
|
||||
@@ -178,7 +186,7 @@
|
||||
#undef AL
|
||||
|
||||
static_assert(WTF_ARRAY_LENGTH(asciiLineBreakTable) == asciiLineBreakTableLastChar - asciiLineBreakTableFirstChar + 1, "asciiLineBreakTable should be consistent");
|
||||
-static_assert(WTF_ARRAY_LENGTH(breakAllLineBreakClassTable) == U_LB_COUNT, "breakAllLineBreakClassTable should be consistent");
|
||||
+static_assert(WTF_ARRAY_LENGTH(breakAllLineBreakClassTable) == BA_LB_COUNT, "breakAllLineBreakClassTable should be consistent");
|
||||
|
||||
static inline bool shouldBreakAfter(UChar lastCh, UChar ch, UChar nextCh)
|
||||
{
|
||||
@@ -209,7 +217,7 @@
|
||||
|
||||
static inline bool shouldBreakAfterBreakAll(ULineBreak lastLineBreak, ULineBreak lineBreak)
|
||||
{
|
||||
- if (lineBreak >= 0 && lineBreak < U_LB_COUNT && lastLineBreak >= 0 && lastLineBreak < U_LB_COUNT) {
|
||||
+ if (lineBreak >= 0 && lineBreak < BA_LB_COUNT && lastLineBreak >= 0 && lastLineBreak < BA_LB_COUNT) {
|
||||
const unsigned char* tableRow = breakAllLineBreakClassTable[lastLineBreak];
|
||||
return tableRow[lineBreak / 8] & (1 << (lineBreak % 8));
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
From fa8cdb3a32c377b6290d0a92d2522186bcd48293 Mon Sep 17 00:00:00 2001
|
||||
From: Allan Sandfeld Jensen <allan.jensen@theqtcompany.com>
|
||||
Date: Tue, 9 Aug 2016 16:21:29 +0200
|
||||
Subject: Do not depend on Linux 4.5
|
||||
|
||||
Avoid using MADV_FREE that was only recently added to Linux. It will fail when
|
||||
run on older Linux kernels.
|
||||
|
||||
Change-Id: I9b0369fb31402f088b2327c12f70dd39f5e4c8c0
|
||||
Reviewed-by: Peter Varga <pvarga@inf.u-szeged.hu>
|
||||
---
|
||||
chromium/third_party/WebKit/Source/wtf/allocator/PageAllocator.cpp | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/src/3rdparty/chromium/third_party/WebKit/Source/wtf/PageAllocator.cpp b/src/3rdparty/chromium/third_party/WebKit/Source/wtf/PageAllocator.cpp
|
||||
index 12c9a7b..1639013 100644
|
||||
--- a/src/3rdparty/chromium/third_party/WebKit/Source/wtf/PageAllocator.cpp
|
||||
+++ b/src/3rdparty/chromium/third_party/WebKit/Source/wtf/PageAllocator.cpp
|
||||
@@ -39,6 +39,11 @@
|
||||
|
||||
#include <sys/mman.h>
|
||||
|
||||
+#if OS(LINUX) && defined(MADV_FREE)
|
||||
+// Added in Linux 4.5, but we don't want to depend on 4.5 at runtime
|
||||
+#undef MADV_FREE
|
||||
+#endif
|
||||
+
|
||||
#ifndef MADV_FREE
|
||||
#define MADV_FREE MADV_DONTNEED
|
||||
#endif
|
||||
--
|
||||
cgit v1.0-4-g1e03
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
# dev-qt/qtwebengine: Fix detecting audio backends.
|
||||
|
||||
# The upstream change doesn't really work for us, so we'll make
|
||||
# it work with us.
|
||||
# Gentoo-Bug: https://bugs.gentoo.org/603498
|
||||
|
||||
--- /src/core/config/linux.pri 2016-12-23 00:05:41.057955774 +0200
|
||||
+++ /src/core/config/linux.pri 2016-12-23 00:09:39.000573909 +0200
|
||||
@@ -35,12 +35,12 @@
|
||||
contains(QT_CONFIG, system-png): GYP_CONFIG += use_system_libpng=1
|
||||
contains(QT_CONFIG, system-jpeg): GYP_CONFIG += use_system_libjpeg=1
|
||||
contains(QT_CONFIG, system-harfbuzz): GYP_CONFIG += use_system_harfbuzz=1
|
||||
-contains(QT_CONFIG, pulseaudio) {
|
||||
+use?(pulseaudio) {
|
||||
GYP_CONFIG += use_pulseaudio=1
|
||||
} else {
|
||||
GYP_CONFIG += use_pulseaudio=0
|
||||
}
|
||||
-contains(QT_CONFIG, alsa) {
|
||||
+use?(alsa) {
|
||||
GYP_CONFIG += use_alsa=1
|
||||
} else {
|
||||
GYP_CONFIG += use_alsa=0
|
||||
@@ -1,144 +0,0 @@
|
||||
From 64fdd317d4127142ad9e967197a2df6ac81ef55f Mon Sep 17 00:00:00 2001
|
||||
From: Allan Sandfeld Jensen <allan.jensen@qt.io>
|
||||
Date: Wed, 29 Mar 2017 17:42:18 +0200
|
||||
Subject: [PATCH] Fix build with GCC 7.0
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=utf8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Fixes some ambiguities and outright wrong code GCC 7 doesn't accept but
|
||||
earlier compilers did.
|
||||
|
||||
Task-number:QTBUG-59776
|
||||
Change-Id: I012f121842ac6cde49db0d571efc62aabe2115e3
|
||||
Reviewed-by: Michael Brüning <michael.bruning@qt.io>
|
||||
---
|
||||
.../mojo/public/cpp/bindings/interface_ptr_info.h | 2 +-
|
||||
.../third_party/WebKit/Source/wtf/LinkedHashSet.h | 2 ++
|
||||
chromium/v8/src/objects-body-descriptors.h | 2 +-
|
||||
chromium/v8/src/objects-inl.h | 19 +++++++++++++++++++
|
||||
chromium/v8/src/objects.h | 16 ++--------------
|
||||
5 files changed, 25 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/src/3rdparty/chromium/mojo/public/cpp/bindings/interface_ptr_info.h b/src/3rdparty/chromium/mojo/public/cpp/bindings/interface_ptr_info.h
|
||||
index 5bd29d5..c94a5ac 100644
|
||||
--- a/src/3rdparty/chromium/mojo/public/cpp/bindings/interface_ptr_info.h
|
||||
+++ b/src/3rdparty/chromium/mojo/public/cpp/bindings/interface_ptr_info.h
|
||||
@@ -34,7 +34,7 @@ class InterfacePtrInfo {
|
||||
|
||||
InterfacePtrInfo& operator=(InterfacePtrInfo&& other) {
|
||||
if (this != &other) {
|
||||
- handle_ = other.handle_.Pass();
|
||||
+ handle_ = std::move(other.handle_);
|
||||
version_ = other.version_;
|
||||
other.version_ = 0u;
|
||||
}
|
||||
--
|
||||
2.7.4
|
||||
From 493441248c82d9f39d0947e3bbf4571736e1cf85 Mon Sep 17 00:00:00 2001
|
||||
From: Allan Sandfeld Jensen <allan.jensen@qt.io>
|
||||
Date: Wed, 29 Mar 2017 15:53:00 +0200
|
||||
Subject: [PATCH 1/1] Fix build with GCC 7.0
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=utf8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Fixes a few problems with using undeclared functions and ambigious
|
||||
code.
|
||||
|
||||
Task-number: QTBUG-59776
|
||||
Change-Id: I59813919b4867d5dd3499a45baed004a1a1c1a3c
|
||||
Reviewed-by: Michael Brüning <michael.bruning@qt.io>
|
||||
---
|
||||
chromium/third_party/WebKit/Source/wtf/LinkedHashSet.h | 2 ++
|
||||
.../third_party/pdfium/fpdfsdk/javascript/global.cpp | 8 ++++----
|
||||
chromium/v8/src/objects-body-descriptors.h | 2 +-
|
||||
chromium/v8/src/objects-inl.h | 18 ++++++++++++++++++
|
||||
chromium/v8/src/objects.h | 16 ++--------------
|
||||
5 files changed, 27 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/src/3rdparty/chromium/third_party/WebKit/Source/wtf/LinkedHashSet.h b/src/3rdparty/chromium/third_party/WebKit/Source/wtf/LinkedHashSet.h
|
||||
index e85c72f..6f94cd6 100644
|
||||
--- a/src/3rdparty/chromium/third_party/WebKit/Source/wtf/LinkedHashSet.h
|
||||
+++ b/src/3rdparty/chromium/third_party/WebKit/Source/wtf/LinkedHashSet.h
|
||||
@@ -542,6 +542,8 @@ inline LinkedHashSet<T, U, V, W>& LinkedHashSet<T, U, V, W>::operator=(LinkedHas
|
||||
return *this;
|
||||
}
|
||||
|
||||
+inline void swapAnchor(LinkedHashSetNodeBase& a, LinkedHashSetNodeBase& b);
|
||||
+
|
||||
template<typename T, typename U, typename V, typename W>
|
||||
inline void LinkedHashSet<T, U, V, W>::swap(LinkedHashSet& other)
|
||||
{
|
||||
diff --git a/src/3rdparty/chromium/v8/src/objects-body-descriptors.h b/src/3rdparty/chromium/v8/src/objects-body-descriptors.h
|
||||
index 91cb888..a1c3634 100644
|
||||
--- a/src/3rdparty/chromium/v8/src/objects-body-descriptors.h
|
||||
+++ b/src/3rdparty/chromium/v8/src/objects-body-descriptors.h
|
||||
@@ -99,7 +99,7 @@ class FixedBodyDescriptor final : public BodyDescriptorBase {
|
||||
|
||||
template <typename StaticVisitor>
|
||||
static inline void IterateBody(HeapObject* obj, int object_size) {
|
||||
- IterateBody(obj);
|
||||
+ IterateBody<StaticVisitor>(obj);
|
||||
}
|
||||
};
|
||||
|
||||
diff --git a/src/3rdparty/chromium/v8/src/objects-inl.h b/src/3rdparty/chromium/v8/src/objects-inl.h
|
||||
index 58441d3..4c486ea 100644
|
||||
--- a/src/3rdparty/chromium/v8/src/objects-inl.h
|
||||
+++ b/src/3rdparty/chromium/v8/src/objects-inl.h
|
||||
@@ -7588,6 +7588,24 @@ bool GlobalDictionaryShape::IsDeleted(Dictionary* dict, int entry) {
|
||||
}
|
||||
|
||||
|
||||
+template <typename Derived, typename Shape, typename Key>
|
||||
+inline uint32_t HashTable<Derived,Shape,Key>::Hash(Key key) {
|
||||
+ if (Shape::UsesSeed) {
|
||||
+ return Shape::SeededHash(key, GetHeap()->HashSeed());
|
||||
+ } else {
|
||||
+ return Shape::Hash(key);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+template <typename Derived, typename Shape, typename Key>
|
||||
+inline uint32_t HashTable<Derived,Shape,Key>::HashForObject(Key key, Object* object) {
|
||||
+ if (Shape::UsesSeed) {
|
||||
+ return Shape::SeededHashForObject(key, GetHeap()->HashSeed(), object);
|
||||
+ } else {
|
||||
+ return Shape::HashForObject(key, object);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
bool ObjectHashTableShape::IsMatch(Handle<Object> key, Object* other) {
|
||||
return key->SameValue(other);
|
||||
}
|
||||
diff --git a/src/3rdparty/chromium/v8/src/objects.h b/src/3rdparty/chromium/v8/src/objects.h
|
||||
index 7d774be..42da5fa 100644
|
||||
--- a/src/3rdparty/chromium/v8/src/objects.h
|
||||
+++ b/src/3rdparty/chromium/v8/src/objects.h
|
||||
@@ -3194,21 +3194,9 @@ class HashTable : public HashTableBase {
|
||||
typedef Shape ShapeT;
|
||||
|
||||
// Wrapper methods
|
||||
- inline uint32_t Hash(Key key) {
|
||||
- if (Shape::UsesSeed) {
|
||||
- return Shape::SeededHash(key, GetHeap()->HashSeed());
|
||||
- } else {
|
||||
- return Shape::Hash(key);
|
||||
- }
|
||||
- }
|
||||
+ inline uint32_t Hash(Key key);
|
||||
|
||||
- inline uint32_t HashForObject(Key key, Object* object) {
|
||||
- if (Shape::UsesSeed) {
|
||||
- return Shape::SeededHashForObject(key, GetHeap()->HashSeed(), object);
|
||||
- } else {
|
||||
- return Shape::HashForObject(key, object);
|
||||
- }
|
||||
- }
|
||||
+ inline uint32_t HashForObject(Key key, Object* object);
|
||||
|
||||
// Returns a new HashTable object.
|
||||
MUST_USE_RESULT static Handle<Derived> New(
|
||||
--
|
||||
2.7.4
|
||||
Reference in New Issue
Block a user