diff --git a/src/BufferView.cpp b/src/BufferView.cpp index 428c03299f..1fdfa78e2a 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -564,10 +564,12 @@ void BufferView::processUpdateFlags(Update::flags flags) // are not already redrawing all). // We handle this before FitCursor because the later will require // correct metrics at cursor position. - if (!(flags & Update::ForceDraw) - && (flags & Update::SinglePar) - && !singleParUpdate()) - updateMetrics(true); + if (!(flags & Update::ForceDraw) && (flags & Update::SinglePar)) { + if (singleParUpdate()) + updateMetrics(false); + else + updateMetrics(true); + } // Then make sure that the screen contains the cursor if needed if (flags & Update::FitCursor) { @@ -3132,6 +3134,10 @@ bool BufferView::singleParUpdate() if (d->inlineCompletionPos_.fixIfBroken()) d->inlineCompletionPos_ = DocIterator(); + if (!tm.contains(pit)) { + LYXERR(Debug::PAINTING, "SinglePar optimization failed: no known metrics"); + return false; + } /* Try to rebreak only the paragraph containing the cursor (if * this paragraph contains insets etc., rebreaking will * recursively descend). We need a full redraw if either @@ -3149,18 +3155,19 @@ bool BufferView::singleParUpdate() tm.redoParagraph(pit); ParagraphMetrics & pm = tm.parMetrics(pit); if (pm.height() != old_dim.height() - || (pm.width() != old_dim.width() && old_dim.width() == tm.width())) { + || (pm.width() != old_dim.width() && old_dim.width() == tm.width())) { // Paragraph height or width has changed so we cannot proceed // to the singlePar optimisation. - LYXERR(Debug::PAINTING, "SinglePar optimization failed."); + LYXERR(Debug::PAINTING, "SinglePar optimization failed: paragraph metrics changed"); return false; } // Since position() points to the baseline of the first row, we // may have to update it. See ticket #11601 for an example where // the height does not change but the ascent does. - pm.setPosition(pm.position() - old_dim.ascent() + pm.ascent()); - - tm.updatePosCache(pit); + if (pm.hasPosition()) + pm.setPosition(pm.position() - old_dim.ascent() + pm.ascent()); + else + LYXERR0("SinglePar optimization succeeded, but no position to update"); LYXERR(Debug::PAINTING, "\ny1: " << pm.top() << " y2: " << pm.bottom() << " pit: " << pit << " singlepar: 1");