johu 14/03/13 16:02:45 Added: katepart-4.12.3-crash-fix.patch Log: Revision bump adds backported upstream patch by Michael Palimaka <[email protected]>, spotted by Thomas <[email protected]>. Patch fixes crashes in kde-bae/kate and dev-util/kdevelop, bug #502494. (Portage version: 2.2.8-r1/cvs/Linux x86_64, signed Manifest commit with key F3CFD2BD)
Revision Changes Path 1.1 kde-base/katepart/files/katepart-4.12.3-crash-fix.patch file : http://sources.gentoo.org/viewvc.cgi/gentoo-x86/kde-base/katepart/files/katepart-4.12.3-crash-fix.patch?rev=1.1&view=markup plain: http://sources.gentoo.org/viewvc.cgi/gentoo-x86/kde-base/katepart/files/katepart-4.12.3-crash-fix.patch?rev=1.1&content-type=text/plain Index: katepart-4.12.3-crash-fix.patch =================================================================== diff --git a/part/completion/katecompletionmodel.cpp b/part/completion/katecompletionmodel.cpp index 3fa8080..22af495 100644 --- a/part/completion/katecompletionmodel.cpp +++ b/part/completion/katecompletionmodel.cpp @@ -504,7 +504,7 @@ QModelIndex KateCompletionModel::indexForGroup( Group * g ) const return createIndex(row, 0, 0); } -void KateCompletionModel::clearGroups( bool shouldReset ) +void KateCompletionModel::clearGroups() { clearExpanding(); m_ungrouped->clear(); @@ -536,9 +536,6 @@ void KateCompletionModel::clearGroups( bool shouldReset ) m_emptyGroups.append(m_bestMatches); m_groupHash.insert(BestMatchesProperty, m_bestMatches); - - if(shouldReset) - reset(); } QSet<KateCompletionModel::Group*> KateCompletionModel::createItems(const HierarchicalModelHandler& _handler, const QModelIndex& i, bool notifyModel) { @@ -577,9 +574,10 @@ QSet<KateCompletionModel::Group*> KateCompletionModel::deleteItems(const QModelI void KateCompletionModel::createGroups() { + beginResetModel(); //After clearing the model, it has to be reset, else we will be in an invalid state while inserting //new groups. - clearGroups(true); + clearGroups(); bool has_groups=false; foreach (CodeCompletionModel* sourceModel, m_completionModels) { @@ -600,10 +598,7 @@ void KateCompletionModel::createGroups() makeGroupItemsUnique(); updateBestMatches(); - - reset(); - - emit contentGeometryChanged(); + endResetModel(); } KateCompletionModel::Group* KateCompletionModel::createItem(const HierarchicalModelHandler& handler, const QModelIndex& sourceIndex, bool notifyModel) @@ -660,9 +655,7 @@ void KateCompletionModel::slotRowsInserted( const QModelIndex & parent, int star affectedGroups += createItems(handler, parent.isValid() ? parent.child(i, 0) : handler.model()->index(i, 0), true); foreach (Group* g, affectedGroups) - hideOrShowGroup(g); - - emit contentGeometryChanged(); + hideOrShowGroup(g, true); } void KateCompletionModel::slotRowsRemoved( const QModelIndex & parent, int start, int end ) @@ -678,9 +671,7 @@ void KateCompletionModel::slotRowsRemoved( const QModelIndex & parent, int start } foreach (Group* g, affectedGroups) - hideOrShowGroup(g); - - emit contentGeometryChanged(); + hideOrShowGroup(g, true); } KateCompletionModel::Group* KateCompletionModel::fetchGroup( int attribute, const QString& scope, bool forceGrouping ) @@ -938,31 +929,32 @@ void KateCompletionModel::setCurrentCompletion( KTextEditor::CodeCompletionModel m_currentMatch[model] = completion; - bool needsReset = false; + const bool resetModel = (changeType != Narrow); + if (resetModel) { + beginResetModel(); + } if (!hasGroups()) { - needsReset |= changeCompletions(m_ungrouped, changeType); + changeCompletions(m_ungrouped, changeType, !resetModel); } else { foreach (Group* g, m_rowTable) { if(g != m_argumentHints) - needsReset |= changeCompletions(g, changeType); + changeCompletions(g, changeType, !resetModel); } foreach (Group* g, m_emptyGroups) { if(g != m_argumentHints) - needsReset |= changeCompletions(g, changeType); + changeCompletions(g, changeType, !resetModel); } } // NOTE: best matches are also updated in resort resort(); - kDebug()<<"needsReset"<<needsReset; - if(needsReset) - reset(); + if (resetModel) { + endResetModel(); + } clearExpanding(); //We need to do this, or be aware of expanding-widgets while filtering. - emit contentGeometryChanged(); - kDebug(); } QString KateCompletionModel::commonPrefixInternal(const QString &forcePrefix) const @@ -1024,15 +1016,14 @@ QString KateCompletionModel::commonPrefix(QModelIndex selectedIndex) const return commonPrefix; } -bool KateCompletionModel::changeCompletions( Group * g, changeTypes changeType ) +void KateCompletionModel::changeCompletions( Group * g, changeTypes changeType, bool notifyModel ) { - bool notifyModel = true; if(changeType != Narrow) { - notifyModel = false; g->filtered = g->prefilter; //In the "Broaden" or "Change" case, just re-filter everything, //and don't notify the model. The model is notified afterwards through a reset(). } + //This code determines what of the filtered items still fit, and computes the ranges that were removed, giving //them to beginRemoveRows(..) in batches @@ -1054,14 +1045,13 @@ bool KateCompletionModel::changeCompletions( Group * g, changeTypes changeType ) } } - if(deleteUntil != -1) { + if(deleteUntil != -1 && notifyModel) { beginRemoveRows(indexForGroup(g), 0, deleteUntil); endRemoveRows(); } g->filtered = newFiltered; hideOrShowGroup(g, notifyModel); - return !notifyModel; } int KateCompletionModel::Group::orderNumber() const { @@ -1193,7 +1183,9 @@ void KateCompletionModel::setSortingEnabled( bool enable ) { if (m_sortingEnabled != enable) { m_sortingEnabled = enable; + beginResetModel(); resort(); + endResetModel(); } } @@ -1256,8 +1248,9 @@ const QList< QList < int > > & KateCompletionModel::columnMerges( ) const void KateCompletionModel::setColumnMerges( const QList< QList < int > > & columnMerges ) { + beginResetModel(); m_columnMerges = columnMerges; - reset(); + endResetModel(); } int KateCompletionModel::translateColumn( int sourceColumn ) const @@ -1557,7 +1550,9 @@ void KateCompletionModel::setSortingAlphabetical( bool alphabetical ) { if (m_sortingAlphabetical != alphabetical) { m_sortingAlphabetical = alphabetical; + beginResetModel(); resort(); + endResetModel(); } } @@ -1571,11 +1566,13 @@ void KateCompletionModel::setSortingCaseSensitivity( Qt::CaseSensitivity cs ) { if (m_sortingCaseSensitivity != cs) { m_sortingCaseSensitivity = cs; + beginResetModel(); resort(); + endResetModel(); } } -void KateCompletionModel::resort( ) +void KateCompletionModel::resort() { foreach (Group* g, m_rowTable) g->resort(); @@ -1585,7 +1582,6 @@ void KateCompletionModel::resort( ) // call updateBestMatches here, so they are moved to the top again. updateBestMatches(); - emit contentGeometryChanged(); } bool KateCompletionModel::Item::isValid( ) const @@ -1654,6 +1650,7 @@ void KateCompletionModel::setMaximumInheritanceDepth( int maxDepth ) void KateCompletionModel::refilter( ) { + beginResetModel(); m_ungrouped->refilter(); foreach (Group* g, m_rowTable) @@ -1667,6 +1664,7 @@ void KateCompletionModel::refilter( ) updateBestMatches(); clearExpanding(); //We need to do this, or be aware of expanding-widgets while filtering. + endResetModel(); } void KateCompletionModel::Group::refilter( ) @@ -2048,20 +2046,19 @@ void KateCompletionModel::removeCompletionModel(CodeCompletionModel * model) if (!model || !m_completionModels.contains(model)) return; + beginResetModel(); m_currentMatch.remove(model); - clearGroups(false); + clearGroups(); model->disconnect(this); m_completionModels.removeAll(model); + endResetModel(); if (!m_completionModels.isEmpty()) { // This performs the reset createGroups(); - }else{ - emit contentGeometryChanged(); - reset(); } } @@ -2252,6 +2249,10 @@ void KateCompletionModel::rowSelected(const QModelIndex& row) { void KateCompletionModel::clearCompletionModels() { + if (m_completionModels.isEmpty()) + return; + + beginResetModel(); foreach (CodeCompletionModel * model, m_completionModels) model->disconnect(this); @@ -2260,6 +2261,7 @@ void KateCompletionModel::clearCompletionModels() m_currentMatch.clear(); clearGroups(); + endResetModel(); } #include "katecompletionmodel.moc" diff --git a/part/completion/katecompletionmodel.h b/part/completion/katecompletionmodel.h index 5fedbcc..a10a533 100644 --- a/part/completion/katecompletionmodel.h +++ b/part/completion/katecompletionmodel.h @@ -183,7 +183,6 @@ class KATEPART_TESTS_EXPORT KateCompletionModel : public ExpandingWidgetModel void expandIndex(const QModelIndex& index); //Emitted whenever something has changed about the group of argument-hints void argumentHintsChanged(); - void contentGeometryChanged(); public Q_SLOTS: void setSortingEnabled(bool enable); @@ -311,6 +310,7 @@ class KATEPART_TESTS_EXPORT KateCompletionModel : public ExpandingWidgetModel private: QString commonPrefixInternal(const QString &forcePrefix) const; + /// @note performs model reset void createGroups(); ///Creates all sub-items of index i, or the item corresponding to index i. Returns the affected groups. ///i must be an index in the source model @@ -319,8 +319,9 @@ class KATEPART_TESTS_EXPORT KateCompletionModel : public ExpandingWidgetModel ///i must be an index in the source model QSet<Group*> deleteItems(const QModelIndex& i); Group* createItem(const HierarchicalModelHandler&, const QModelIndex& i, bool notifyModel = false); - void clearGroups(bool reset = true); - void hideOrShowGroup(Group* g, bool notifyModel = true); + /// @note Make sure you're in a {begin,end}ResetModel block when calling this! + void clearGroups(); + void hideOrShowGroup(Group* g, bool notifyModel = false); /// When forceGrouping is enabled, all given attributes will be used for grouping, regardless of the completion settings. Group* fetchGroup(int attribute, const QString& scope = QString(), bool forceGrouping = false); //If this returns nonzero on an index, the index is the header of the returned group @@ -336,7 +337,7 @@ class KATEPART_TESTS_EXPORT KateCompletionModel : public ExpandingWidgetModel }; //Returns whether the model needs to be reset - bool changeCompletions(Group* g, changeTypes changeType); + void changeCompletions(Group* g, changeTypes changeType, bool notifyModel); bool hasCompletionModel() const; diff --git a/part/completion/katecompletionwidget.cpp b/part/completion/katecompletionwidget.cpp index 64fa4ec..6dc63a0 100644 --- a/part/completion/katecompletionwidget.cpp +++ b/part/completion/katecompletionwidget.cpp @@ -325,7 +325,8 @@ void KateCompletionWidget::startCompletion(const KTextEditor::Range& word, const m_lastInvocationType = invocationType; - disconnect(this->model(), SIGNAL(contentGeometryChanged()), this, SLOT(modelContentChanged())); + disconnect(this->model(), SIGNAL(layoutChanged()), this, SLOT(modelContentChanged())); + disconnect(this->model(), SIGNAL(modelReset()), this, SLOT(modelContentChanged())); m_dontShowArgumentHints = true; @@ -412,7 +413,8 @@ void KateCompletionWidget::startCompletion(const KTextEditor::Range& word, const cursorPositionChanged(); if (!m_completionRanges.isEmpty()) { - connect(this->model(), SIGNAL(contentGeometryChanged()), this, SLOT(modelContentChanged())); + connect(this->model(), SIGNAL(layoutChanged()), this, SLOT(modelContentChanged())); + connect(this->model(), SIGNAL(modelReset()), this, SLOT(modelContentChanged())); //Now that all models have been notified, check whether the widget should be displayed instantly modelContentChanged(); }
