[LyX/master] Catch another potential crash of the same kind as in the previous commit.

Richard Kimberly Heck rikiheck at lyx.org
Sat Jul 29 01:54:59 UTC 2023


commit 2e945584bf85fbdd9d009c36981e169ee59603a1
Author: Richard Kimberly Heck <rikiheck at lyx.org>
Date:   Fri Jul 28 23:08:39 2023 -0400

    Catch another potential crash of the same kind as in the previous commit.
    
    Also refactor.
---
 src/insets/InsetCommand.cpp |   38 ++++++++++++++++++++++----------------
 src/insets/InsetCommand.h   |    4 ++++
 2 files changed, 26 insertions(+), 16 deletions(-)

diff --git a/src/insets/InsetCommand.cpp b/src/insets/InsetCommand.cpp
index b16259d..50db6dd 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 7ad10af..1605764 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:


More information about the lyx-cvs mailing list