Long shot in a small patch. This completely disables InsetText::update and InsetTabular::update. It looks as if it works, though.
Please test. Andre' -- Those who desire to give up Freedom in order to gain Security, will not have, nor do they deserve, either one. (T. Jefferson or B. Franklin or both...)
Index: lyxtext.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxtext.h,v retrieving revision 1.190 diff -u -p -r1.190 lyxtext.h --- lyxtext.h 16 Jul 2003 08:42:24 -0000 1.190 +++ lyxtext.h 16 Jul 2003 10:42:00 -0000 @@ -163,6 +163,8 @@ public: void partialRebreak(); /// a full rebreak of the whole text void fullRebreak(); + /// rebuild RowList cache + void rebuild(); /// RowList::iterator need_break_row; Index: rowpainter.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/rowpainter.C,v retrieving revision 1.23 diff -u -p -r1.23 rowpainter.C --- rowpainter.C 15 Jul 2003 11:08:00 -0000 1.23 +++ rowpainter.C 16 Jul 2003 10:42:00 -0000 @@ -179,7 +179,7 @@ void RowPainter::paintInset(pos_type con Assert(inset); #warning inset->update FIXME - inset->update(perv(bv_), false); + //inset->update(perv(bv_), false); PainterInfo pi(perv(bv_)); pi.base.font = getFont(pos); Index: text2.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text2.C,v retrieving revision 1.389 diff -u -p -r1.389 text2.C --- text2.C 16 Jul 2003 08:42:26 -0000 1.389 +++ text2.C 16 Jul 2003 10:42:00 -0000 @@ -692,6 +692,32 @@ void LyXText::fullRebreak() } +void LyXText::rebuild() +{ + rowlist_.clear(); + need_break_row = rows().end(); + width = height = 0; + + anchor_row_ = rows().end(); + anchor_row_offset_ = 0; + + ParagraphList::iterator pit = ownerParagraphs().begin(); + ParagraphList::iterator end = ownerParagraphs().end(); + + //current_font = getFont(bview->buffer(), pit, 0); + + for (; pit != end; ++pit) + insertParagraph(pit, rowlist_.end()); + + //setCursorIntern(rowlist_.begin()->par(), 0); + //selection.cursor = cursor; + + //updateCounters(); + + //setCursorIntern(cursor.par(), cursor.pos()); +} + + void LyXText::partialRebreak() { if (rows().empty()) { @@ -1516,6 +1542,8 @@ void LyXText::setCursor(LyXCursor & cur, cur.par(pit); cur.pos(pos); cur.boundary(boundary); + if (rows().empty()) + return; // get the cursor y position in text int y = 0; Index: insets/insettabular.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insettabular.C,v retrieving revision 1.297 diff -u -p -r1.297 insettabular.C --- insets/insettabular.C 15 Jul 2003 16:25:02 -0000 1.297 +++ insets/insettabular.C 16 Jul 2003 10:42:00 -0000 @@ -259,6 +259,7 @@ void InsetTabular::read(Buffer const * b void InsetTabular::metrics(MetricsInfo & mi, Dimension & dim) const { if (mi.base.bv) { + calculate_dimensions_of_cells(mi.base.bv, true); //lyxerr << "InsetTabular::metrics, bv: " << mi.base.bv << endl; for (int i = 0; i < tabular.getNumberOfCells(); ++i) { tabular.cellinfo_of_cell(i)->inset.text_.bv_owner = mi.base.bv; @@ -411,6 +412,7 @@ void InsetTabular::drawCellSelection(Pai void InsetTabular::update(BufferView * bv, bool reinit) { +/* if (in_update) { if (reinit) { resetPos(bv); @@ -447,6 +449,7 @@ void InsetTabular::update(BufferView * b break; } in_update = false; +*/ } Index: insets/insettext.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insettext.C,v retrieving revision 1.431 diff -u -p -r1.431 insettext.C --- insets/insettext.C 16 Jul 2003 07:15:10 -0000 1.431 +++ insets/insettext.C 16 Jul 2003 10:42:01 -0000 @@ -277,6 +277,7 @@ void InsetText::metrics(MetricsInfo & mi { BufferView * bv = mi.base.bv; setViewCache(bv); + text_.rebuild(); dim.asc = text_.rows().begin()->ascent_of_text() + TEXT_TO_INSET_OFFSET; dim.des = text_.height - dim.asc + TEXT_TO_INSET_OFFSET; dim.wid = max(textWidth(bv), int(text_.width)) + 2 * TEXT_TO_INSET_OFFSET; @@ -406,6 +407,7 @@ void InsetText::update(BufferView * bv, { setViewCache(bv); +/* if (in_update) { if (reinit && owner()) { reinitLyXText(); @@ -455,6 +457,7 @@ void InsetText::update(BufferView * bv, need_update |= INIT; old_max_width = nw; } +*/ } @@ -884,7 +887,7 @@ Inset::RESULT InsetText::localDispatch(F if (cmd.argument.size()) { if (cmd.argument == "left") - text_.setCursor(paragraphs.begin(), 0); + text_.setCursorIntern(paragraphs.begin(), 0); else { ParagraphList::iterator it = paragraphs.begin(); ParagraphList::iterator end = paragraphs.end();