From: André Pönitz Date: Sat, 23 Oct 2004 11:04:41 +0000 (+0000) Subject: workaround crash in undo. This is not a proper fix but 'works'. X-Git-Tag: 1.6.10~14920 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=f7a01cc616edefbff7d07879d541e08866fd4777;p=lyx.git 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 --- diff --git a/src/coordcache.C b/src/coordcache.C index 6f75791eb9..11e5a8db3e 100644 --- a/src/coordcache.C +++ b/src/coordcache.C @@ -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(); } diff --git a/src/dociterator.C b/src/dociterator.C index 2df577b5f4..49b8471f4a 100644 --- a/src/dociterator.C +++ b/src/dociterator.C @@ -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) diff --git a/src/text.C b/src/text.C index 05954f6ddc..6dcc706c3d 100644 --- a/src/text.C +++ b/src/text.C @@ -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; - } diff --git a/src/undo.C b/src/undo.C index d7a36941d0..08431d9ee2 100644 --- a/src/undo.C +++ b/src/undo.C @@ -27,10 +27,9 @@ #include -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 & stack, limited_stack & 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; }