commit 4eb9b50dc642a3532d8126a93571696b3db57640
Author: Jean-Marc Lasgouttes <[email protected]>
Date: Tue Jul 4 16:34:34 2017 +0200
Use the proper buffer when recording undo
The code in InsetLabel::updateReferences code changes reference insets
in potentially several buffers. When recording undo, it is important
to use the right undo stack, otherwise crashes can ensue.
Once it is done, it is neccessary to create undo groups as needed.
This is done using UndoGroupHelper. This demonstrates a shortcoming of
UndoGroup helper: if a buffer is encountered in two seperate
occasions, two undo groups will be created for this buffer. This is
not correct.
Fixes bug #10643.
---
src/Undo.cpp | 7 +++++++
src/Undo.h | 2 +-
src/insets/InsetLabel.cpp | 4 +++-
3 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/src/Undo.cpp b/src/Undo.cpp
index 143af4e..a479728 100644
--- a/src/Undo.cpp
+++ b/src/Undo.cpp
@@ -643,6 +643,13 @@ void Undo::recordUndoFullBuffer(CursorData const & cur)
/// UndoGroupHelper class stuff
+/** FIXME: handle restarted groups
+ * It may happen that the buffers are visited in order buffer1,
+ * buffer2, buffer1. In this case, we want to have only one undo group
+ * in buffer1. One solution is to replace buffer_ with a set<Buffer*>,
+ * but I am not sure yet how to do it. A use case is
+ * InsetLabel::updateReferences.
+ */
void UndoGroupHelper::resetBuffer(Buffer * buf)
{
if (buf == buffer_)
diff --git a/src/Undo.h b/src/Undo.h
index 59f3ca4..70897bf 100644
--- a/src/Undo.h
+++ b/src/Undo.h
@@ -135,7 +135,7 @@ private:
*/
class UndoGroupHelper {
public:
- UndoGroupHelper(Buffer * buf) : buffer_(0)
+ UndoGroupHelper(Buffer * buf = 0) : buffer_(0)
{
resetBuffer(buf);
}
diff --git a/src/insets/InsetLabel.cpp b/src/insets/InsetLabel.cpp
index e8e7933..ce7701f 100644
--- a/src/insets/InsetLabel.cpp
+++ b/src/insets/InsetLabel.cpp
@@ -109,11 +109,13 @@ void InsetLabel::updateLabelAndRefs(docstring const &
new_label,
void InsetLabel::updateReferences(docstring const & old_label,
docstring const & new_label)
{
+ UndoGroupHelper ugh;
Buffer::References const & refs = buffer().references(old_label);
Buffer::References::const_iterator it = refs.begin();
Buffer::References::const_iterator end = refs.end();
for (; it != end; ++it) {
- buffer().undo().recordUndo(CursorData(it->second));
+ ugh.resetBuffer(it->second.buffer());
+ it->second.buffer()->undo().recordUndo(CursorData(it->second));
if (it->first->lyxCode() == MATH_REF_CODE) {
InsetMathRef * mi =
it->first->asInsetMath()->asRefInset();
mi->changeTarget(new_label);