mirror of
https://git.lyx.org/repos/lyx.git
synced 2025-01-03 08:28:25 +00:00
fix leak in the undo stack
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@24308 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
ba7a649a41
commit
fa804db4ab
62
src/Undo.cpp
62
src/Undo.cpp
@ -30,12 +30,11 @@
|
||||
|
||||
#include "insets/Inset.h"
|
||||
|
||||
#include "support/debug.h"
|
||||
#include "support/limited_stack.h"
|
||||
|
||||
#include "support/assert.h"
|
||||
#include "support/debug.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <deque>
|
||||
#include <ostream>
|
||||
|
||||
using namespace std;
|
||||
@ -89,6 +88,48 @@ struct UndoElement
|
||||
};
|
||||
|
||||
|
||||
class UndoElementStack
|
||||
{
|
||||
public:
|
||||
/// limit is the maximum size of the stack
|
||||
UndoElementStack(size_t limit = 100) { limit_ = limit; }
|
||||
/// limit is the maximum size of the stack
|
||||
~UndoElementStack() { clear(); }
|
||||
|
||||
/// Return the top element.
|
||||
UndoElement & top() { return c_.front(); }
|
||||
|
||||
/// Pop and throw away the top element.
|
||||
void pop() { c_.pop_front(); }
|
||||
|
||||
/// Return true if the stack is empty.
|
||||
bool empty() const { return c_.empty(); }
|
||||
|
||||
/// Clear all elements, deleting them.
|
||||
void clear() {
|
||||
for (size_t i = 0; i != c_.size(); ++i) {
|
||||
delete c_[i].array;
|
||||
delete c_[i].pars;
|
||||
}
|
||||
c_.clear();
|
||||
}
|
||||
|
||||
/// Push an item on to the stack, deleting the
|
||||
/// bottom item on overflow.
|
||||
void push(UndoElement const & v) {
|
||||
c_.push_front(v);
|
||||
if (c_.size() > limit_)
|
||||
c_.pop_back();
|
||||
}
|
||||
|
||||
private:
|
||||
/// Internal contents.
|
||||
std::deque<UndoElement> c_;
|
||||
/// The maximum number elements stored.
|
||||
size_t limit_;
|
||||
};
|
||||
|
||||
|
||||
struct Undo::Private
|
||||
{
|
||||
Private(Buffer & buffer) : buffer_(buffer), undo_finished_(true) {}
|
||||
@ -113,9 +154,9 @@ struct Undo::Private
|
||||
///
|
||||
Buffer & buffer_;
|
||||
/// Undo stack.
|
||||
limited_stack<UndoElement> undostack_;
|
||||
UndoElementStack undostack_;
|
||||
/// Redo stack.
|
||||
limited_stack<UndoElement> redostack_;
|
||||
UndoElementStack redostack_;
|
||||
|
||||
/// The flag used by Undo::finishUndo().
|
||||
bool undo_finished_;
|
||||
@ -152,12 +193,14 @@ bool Undo::hasRedoStack() const
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
static ostream & operator<<(ostream & os, UndoElement const & undo)
|
||||
{
|
||||
return os << " from: " << undo.from << " end: " << undo.end
|
||||
<< " cell:\n" << undo.cell
|
||||
<< " cursor:\n" << undo.cursor;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static bool samePar(StableDocIterator const & i1, StableDocIterator const & i2)
|
||||
@ -198,8 +241,7 @@ void Undo::Private::doRecordUndo(UndoKind kind,
|
||||
undo.from = first_pit;
|
||||
undo.end = cell.lastpit() - last_pit;
|
||||
|
||||
limited_stack<UndoElement> & stack = isUndoOperation ?
|
||||
undostack_ : redostack_;
|
||||
UndoElementStack & stack = isUndoOperation ? undostack_ : redostack_;
|
||||
|
||||
// Undo::ATOMIC are always recorded (no overlapping there).
|
||||
// As nobody wants all removed character appear one by one when undoing,
|
||||
@ -261,15 +303,13 @@ bool Undo::Private::textUndoOrRedo(DocIterator & cur, bool isUndoOperation)
|
||||
{
|
||||
undo_finished_ = true;
|
||||
|
||||
limited_stack<UndoElement> & stack = isUndoOperation ?
|
||||
undostack_ : redostack_;
|
||||
UndoElementStack & stack = isUndoOperation ? undostack_ : redostack_;
|
||||
|
||||
if (stack.empty())
|
||||
// Nothing to do.
|
||||
return false;
|
||||
|
||||
limited_stack<UndoElement> & otherstack = isUndoOperation ?
|
||||
redostack_ : undostack_;
|
||||
UndoElementStack & otherstack = isUndoOperation ? redostack_ : undostack_;
|
||||
|
||||
// Adjust undo stack and get hold of current undo data.
|
||||
UndoElement undo = stack.top();
|
||||
|
@ -53,6 +53,7 @@
|
||||
#include "ToolbarBackend.h"
|
||||
#include "version.h"
|
||||
|
||||
#include "support/assert.h"
|
||||
#include "support/debug.h"
|
||||
#include "support/FileFilterList.h"
|
||||
#include "support/FileName.h"
|
||||
@ -88,7 +89,6 @@
|
||||
#include <QUrl>
|
||||
#include <QScrollBar>
|
||||
|
||||
#include "support/assert.h"
|
||||
#include <boost/bind.hpp>
|
||||
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
|
Loading…
Reference in New Issue
Block a user