commit 8009edd3d4f3deee5ed8721113bbf31abe9e0aa6
Author: Jean-Marc Lasgouttes <[email protected]>
Date: Wed Mar 2 23:59:40 2016 +0100
Avoid endless loop when the window is too narrow
* breakRow: remove wrong condition that would silently eat the contents of
the
paragraph when the window is narrower than left margin
* breakRow: make sure that there is at least one element in each row
* breakAt: when force-breaking a row element, make sure it is not empty.
Doing
so may create empty rows and therefore a endless loop.
Fixes bugs #9962 and #10001.
diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp
index cb1c4bd..f37e678 100644
--- a/src/TextMetrics.cpp
+++ b/src/TextMetrics.cpp
@@ -803,7 +803,7 @@ void TextMetrics::breakRow(Row & row, int const
right_margin, pit_type const pit
// the width available for the row.
int const width = max_width_ - row.right_margin;
- if (pos >= end || row.width() > width) {
+ if (pos >= end) {
row.endpos(end);
return;
}
@@ -828,7 +828,7 @@ void TextMetrics::breakRow(Row & row, int const
right_margin, pit_type const pit
// or the end of the par, then build a representation of the row.
pos_type i = pos;
FontIterator fi = FontIterator(*this, par, pit, pos);
- while (i < end && row.width() <= width) {
+ do {
char_type c = par.getChar(i);
// The most special cases are handled first.
if (par.isInset(i)) {
@@ -893,7 +893,7 @@ void TextMetrics::breakRow(Row & row, int const
right_margin, pit_type const pit
++i;
++fi;
- }
+ } while (i < end && row.width() <= width);
row.finalizeLast();
row.endpos(i);
diff --git a/src/frontends/qt4/GuiFontMetrics.cpp
b/src/frontends/qt4/GuiFontMetrics.cpp
index fdb8c73..eade8cc 100644
--- a/src/frontends/qt4/GuiFontMetrics.cpp
+++ b/src/frontends/qt4/GuiFontMetrics.cpp
@@ -240,7 +240,7 @@ bool GuiFontMetrics::breakAt(docstring & s, int & x, bool
const rtl, bool const
line.setLineWidth(x);
tl.createLine();
tl.endLayout();
- if (int(line.naturalTextWidth()) > x)
+ if ((force && line.textLength() == 1) || int(line.naturalTextWidth()) >
x)
return false;
x = int(line.naturalTextWidth());
// The -1 is here to account for the leading zerow_nbsp.