commit 2e945584bf85fbdd9d009c36981e169ee59603a1
Author: Richard Kimberly Heck <[email protected]>
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:
-- 
lyx-cvs mailing list
[email protected]
http://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to