mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-07 12:32:26 +00:00
workaround crash in undo. This is not a proper fix but 'works'.
Have a look at the new 'FIXME' if yiou are interested... git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@9112 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
5147e05cc1
commit
f7a01cc616
@ -14,10 +14,10 @@ void lyxbreaker(void const * data, const char * hint, int size)
|
||||
|
||||
void CoordCache::clear()
|
||||
{
|
||||
lyxerr << "CoordCache: removing " << arrays_.data_.size()
|
||||
<< " arrays" << std::endl;
|
||||
lyxerr << "CoordCache: removing " << insets_.data_.size()
|
||||
<< " insets" << std::endl;
|
||||
// lyxerr << "CoordCache: removing " << arrays_.data_.size()
|
||||
// << " arrays" << std::endl;
|
||||
// lyxerr << "CoordCache: removing " << insets_.data_.size()
|
||||
// << " insets" << std::endl;
|
||||
arrays_.clear();
|
||||
insets_.clear();
|
||||
}
|
||||
|
@ -57,6 +57,10 @@ InsetBase * DocIterator::nextInset()
|
||||
BOOST_ASSERT(!empty());
|
||||
if (pos() == lastpos())
|
||||
return 0;
|
||||
if (pos() > lastpos()) {
|
||||
lyxerr << "Should not happen, but it does. " << endl;
|
||||
return 0;
|
||||
}
|
||||
if (inMathed())
|
||||
return nextAtom().nucleus();
|
||||
return paragraph().isInset(pos()) ? paragraph().getInset(pos()) : 0;
|
||||
@ -440,13 +444,19 @@ StableDocIterator::StableDocIterator(const DocIterator & dit)
|
||||
}
|
||||
|
||||
|
||||
DocIterator
|
||||
StableDocIterator::asDocIterator(InsetBase * inset) const
|
||||
DocIterator StableDocIterator::asDocIterator(InsetBase * inset) const
|
||||
{
|
||||
// this function re-creates the cache of inset pointers
|
||||
//lyxerr << "converting:\n" << *this << endl;
|
||||
DocIterator dit = DocIterator(*inset);
|
||||
for (size_t i = 0, n = data_.size(); i != n; ++i) {
|
||||
if (inset == 0) {
|
||||
// FIXME
|
||||
lyxerr << "Should not happen, but does e.g. after C-n C-l C-z S-C-z"
|
||||
<< endl << "dit: " << dit << endl
|
||||
<< " lastpos: " << dit.lastpos() << endl;
|
||||
break;
|
||||
}
|
||||
dit.push_back(data_[i]);
|
||||
dit.back().inset_ = inset;
|
||||
if (i + 1 != n)
|
||||
|
@ -625,12 +625,11 @@ int LyXText::leftMargin(par_type const pit, pos_type const pos) const
|
||||
|
||||
int LyXText::rightMargin(Paragraph const & par) const
|
||||
{
|
||||
LyXTextClass const & tclass = bv()->buffer()->params().getLyXTextClass();
|
||||
|
||||
// We do not want rightmargins on inner texts.
|
||||
if (bv()->text() != this)
|
||||
return 0;
|
||||
|
||||
LyXTextClass const & tclass = bv()->buffer()->params().getLyXTextClass();
|
||||
int const r_margin =
|
||||
::rightMargin()
|
||||
+ font_metrics::signedWidth(tclass.rightmargin(),
|
||||
@ -640,7 +639,6 @@ int LyXText::rightMargin(Paragraph const & par) const
|
||||
* 4 / (par.getDepth() + 4);
|
||||
|
||||
return r_margin;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
25
src/undo.C
25
src/undo.C
@ -27,10 +27,9 @@
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
using std::advance;
|
||||
|
||||
using lyx::par_type;
|
||||
|
||||
using std::advance;
|
||||
using std::endl;
|
||||
|
||||
|
||||
@ -42,8 +41,7 @@ bool undo_finished;
|
||||
|
||||
std::ostream & operator<<(std::ostream & os, Undo const & undo)
|
||||
{
|
||||
return os << " from: " << undo.from
|
||||
<< " end: " << undo.end
|
||||
return os << " from: " << undo.from << " end: " << undo.end
|
||||
<< " cursor:\n" << undo.cursor;
|
||||
}
|
||||
|
||||
@ -62,6 +60,8 @@ void recordUndo(Undo::undo_kind kind,
|
||||
Undo undo;
|
||||
undo.kind = kind;
|
||||
undo.cursor = StableDocIterator(cur);
|
||||
lyxerr << "recordUndo: cur: " << cur << endl;
|
||||
lyxerr << "recordUndo: undo.cursor: " << undo.cursor << endl;
|
||||
undo.from = first_par;
|
||||
undo.end = cur.lastpar() - last_par;
|
||||
|
||||
@ -140,12 +140,12 @@ void performUndoOrRedo(BufferView & bv, Undo const & undo)
|
||||
}
|
||||
|
||||
|
||||
// returns false if no undo possible
|
||||
// Returns false if no undo possible.
|
||||
bool textUndoOrRedo(BufferView & bv,
|
||||
limited_stack<Undo> & stack, limited_stack<Undo> & otherstack)
|
||||
{
|
||||
if (stack.empty()) {
|
||||
// nothing to do
|
||||
// Nothing to do.
|
||||
finishUndo();
|
||||
return false;
|
||||
}
|
||||
@ -154,10 +154,15 @@ bool textUndoOrRedo(BufferView & bv,
|
||||
stack.pop();
|
||||
finishUndo();
|
||||
|
||||
// this implements redo
|
||||
// This implements redo
|
||||
otherstack.push(undo);
|
||||
DocIterator dit =
|
||||
undo.cursor.asDocIterator(&bv.buffer()->inset());
|
||||
// FIXME: This triggers the error in dociterator.C +454
|
||||
// could the reason be that we rebuild the dit _before_ the
|
||||
// contents is actually 'undone'?
|
||||
// I.e. state now is 'A', state on undo stack is 'B'.
|
||||
// dit is created according to positions from undo.cursor, i.e. B
|
||||
// but current buffer contents is more likely 'A'.
|
||||
DocIterator dit = undo.cursor.asDocIterator(&bv.buffer()->inset());
|
||||
if (dit.inMathed()) {
|
||||
// Easy way out: store a full cell.
|
||||
otherstack.top().array = asString(dit.cell());
|
||||
@ -188,7 +193,7 @@ bool textUndoOrRedo(BufferView & bv,
|
||||
|
||||
void finishUndo()
|
||||
{
|
||||
// makes sure the next operation will be stored
|
||||
// Make sure the next operation will be stored.
|
||||
undo_finished = true;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user