From: Richard Kimberly Heck Date: Sat, 29 Jul 2023 03:08:39 +0000 (-0400) Subject: Catch another potential crash of the same kind as in the previous commit. X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=2e945584bf85fbdd9d009c36981e169ee59603a1;p=features.git Catch another potential crash of the same kind as in the previous commit. Also refactor. --- diff --git a/src/insets/InsetCommand.cpp b/src/insets/InsetCommand.cpp index b16259da7d..50db6ddcdb 100644 --- a/src/insets/InsetCommand.cpp +++ b/src/insets/InsetCommand.cpp @@ -184,6 +184,26 @@ void InsetCommand::validate(LaTeXFeatures & features) const } +bool InsetCommand::isChangedByCurrentAuthor() const +{ + InsetIterator it = begin(buffer().inset()); + InsetIterator const itend = end(buffer().inset()); + for (; it != itend; ++it) { + if (&*it == this) + break; + } + if (it == itend) { + LYXERR0("Unable to find inset!"); + // to be on the safe side. + return true; + } + Paragraph const & ourpara = it.paragraph(); + pos_type const ourpos = it.pos(); + Change const & change = ourpara.lookupChange(ourpos); + return change.currentAuthor(); +} + + void InsetCommand::changeCmdName(string const & new_name) { string const & old_name = getCmdName(); @@ -196,21 +216,7 @@ void InsetCommand::changeCmdName(string const & new_name) // But we need to make sure that the inset isn't one // that the current author inserted. Otherwise, we might // delete ourselves! - InsetIterator it = begin(buffer().inset()); - InsetIterator const itend = end(buffer().inset()); - for (; it != itend; ++it) { - if (&*it == this) - break; - } - if (it == itend) { - LYXERR0("Unable to find inset!"); - p_.setCmdName(new_name); - return; - } - Paragraph const & ourpara = it.paragraph(); - pos_type const ourpos = it.pos(); - Change const & change = ourpara.lookupChange(ourpos); - if (change.currentAuthor()) { + if (isChangedByCurrentAuthor()) { p_.setCmdName(new_name); return; } @@ -247,7 +253,7 @@ void InsetCommand::doDispatch(Cursor & cur, FuncRequest & cmd) cur.noScreenUpdate(); else { cur.recordUndo(); - if (buffer().masterParams().track_changes) { + if (buffer().masterParams().track_changes && !isChangedByCurrentAuthor()) { // With change tracking, we insert a new inset and // delete the old one string const data = InsetCommand::params2string(p); diff --git a/src/insets/InsetCommand.h b/src/insets/InsetCommand.h index 7ad10af0ae..1605764450 100644 --- a/src/insets/InsetCommand.h +++ b/src/insets/InsetCommand.h @@ -124,6 +124,10 @@ protected: void setCmdName(std::string const & n) { p_.setCmdName(n); } /// void changeCmdName(std::string const & new_name); + /// was this inset changed by the current author? + /// if we're unable to find out, we return true, because of + /// how this is used. + bool isChangedByCurrentAuthor() const; //@} private: