mirror of
https://git.lyx.org/repos/lyx.git
synced 2025-01-05 08:57:35 +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 "insets/Inset.h"
|
||||||
|
|
||||||
#include "support/debug.h"
|
|
||||||
#include "support/limited_stack.h"
|
|
||||||
|
|
||||||
#include "support/assert.h"
|
#include "support/assert.h"
|
||||||
|
#include "support/debug.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <deque>
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
|
|
||||||
using namespace std;
|
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
|
struct Undo::Private
|
||||||
{
|
{
|
||||||
Private(Buffer & buffer) : buffer_(buffer), undo_finished_(true) {}
|
Private(Buffer & buffer) : buffer_(buffer), undo_finished_(true) {}
|
||||||
@ -113,9 +154,9 @@ struct Undo::Private
|
|||||||
///
|
///
|
||||||
Buffer & buffer_;
|
Buffer & buffer_;
|
||||||
/// Undo stack.
|
/// Undo stack.
|
||||||
limited_stack<UndoElement> undostack_;
|
UndoElementStack undostack_;
|
||||||
/// Redo stack.
|
/// Redo stack.
|
||||||
limited_stack<UndoElement> redostack_;
|
UndoElementStack redostack_;
|
||||||
|
|
||||||
/// The flag used by Undo::finishUndo().
|
/// The flag used by Undo::finishUndo().
|
||||||
bool undo_finished_;
|
bool undo_finished_;
|
||||||
@ -152,12 +193,14 @@ bool Undo::hasRedoStack() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
static ostream & operator<<(ostream & os, UndoElement const & undo)
|
static ostream & operator<<(ostream & os, UndoElement const & undo)
|
||||||
{
|
{
|
||||||
return os << " from: " << undo.from << " end: " << undo.end
|
return os << " from: " << undo.from << " end: " << undo.end
|
||||||
<< " cell:\n" << undo.cell
|
<< " cell:\n" << undo.cell
|
||||||
<< " cursor:\n" << undo.cursor;
|
<< " cursor:\n" << undo.cursor;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static bool samePar(StableDocIterator const & i1, StableDocIterator const & i2)
|
static bool samePar(StableDocIterator const & i1, StableDocIterator const & i2)
|
||||||
@ -198,8 +241,7 @@ void Undo::Private::doRecordUndo(UndoKind kind,
|
|||||||
undo.from = first_pit;
|
undo.from = first_pit;
|
||||||
undo.end = cell.lastpit() - last_pit;
|
undo.end = cell.lastpit() - last_pit;
|
||||||
|
|
||||||
limited_stack<UndoElement> & stack = isUndoOperation ?
|
UndoElementStack & stack = isUndoOperation ? undostack_ : redostack_;
|
||||||
undostack_ : redostack_;
|
|
||||||
|
|
||||||
// Undo::ATOMIC are always recorded (no overlapping there).
|
// Undo::ATOMIC are always recorded (no overlapping there).
|
||||||
// As nobody wants all removed character appear one by one when undoing,
|
// 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;
|
undo_finished_ = true;
|
||||||
|
|
||||||
limited_stack<UndoElement> & stack = isUndoOperation ?
|
UndoElementStack & stack = isUndoOperation ? undostack_ : redostack_;
|
||||||
undostack_ : redostack_;
|
|
||||||
|
|
||||||
if (stack.empty())
|
if (stack.empty())
|
||||||
// Nothing to do.
|
// Nothing to do.
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
limited_stack<UndoElement> & otherstack = isUndoOperation ?
|
UndoElementStack & otherstack = isUndoOperation ? redostack_ : undostack_;
|
||||||
redostack_ : undostack_;
|
|
||||||
|
|
||||||
// Adjust undo stack and get hold of current undo data.
|
// Adjust undo stack and get hold of current undo data.
|
||||||
UndoElement undo = stack.top();
|
UndoElement undo = stack.top();
|
||||||
|
@ -53,6 +53,7 @@
|
|||||||
#include "ToolbarBackend.h"
|
#include "ToolbarBackend.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
|
#include "support/assert.h"
|
||||||
#include "support/debug.h"
|
#include "support/debug.h"
|
||||||
#include "support/FileFilterList.h"
|
#include "support/FileFilterList.h"
|
||||||
#include "support/FileName.h"
|
#include "support/FileName.h"
|
||||||
@ -88,7 +89,6 @@
|
|||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
#include <QScrollBar>
|
#include <QScrollBar>
|
||||||
|
|
||||||
#include "support/assert.h"
|
|
||||||
#include <boost/bind.hpp>
|
#include <boost/bind.hpp>
|
||||||
|
|
||||||
#ifdef HAVE_SYS_TIME_H
|
#ifdef HAVE_SYS_TIME_H
|
||||||
|
Loading…
Reference in New Issue
Block a user