]> git.lyx.org Git - features.git/commitdiff
Catch another potential crash of the same kind as in the previous commit.
authorRichard Kimberly Heck <rikiheck@lyx.org>
Sat, 29 Jul 2023 03:08:39 +0000 (23:08 -0400)
committerRichard Kimberly Heck <rikiheck@lyx.org>
Sat, 29 Jul 2023 03:09:00 +0000 (23:09 -0400)
Also refactor.

src/insets/InsetCommand.cpp
src/insets/InsetCommand.h

index b16259da7d3180231a1182ce2015eac8be81ed09..50db6ddcdba62ffa2a770155d9f6725ddbcb41ca 100644 (file)
@@ -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);
index 7ad10af0aea5809e3c10886562a2d9db6323f48f..16057644500678cdff9acbdb712022a4157c3458 100644 (file)
@@ -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: