[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