Workaround for Qt 4

At least with Qt 4.8.7 on Ubuntu 16.04, QTextLine::lineWidth() can
return a bogus value, at least with Courier font. One hypothesis is
that the invisible characters that we use in breakAt_helper are given
a non-null width.

Work around it, although the exact bug has not been pinpointed.
This commit is contained in:
Jean-Marc Lasgouttes 2021-08-30 15:48:44 +02:00
parent d694701315
commit 6bc50fea3a

View File

@ -531,7 +531,7 @@ GuiFontMetrics::breakAt_helper(docstring const & s, int const x,
line.setLineWidth(x);
tl.createLine();
tl.endLayout();
int const line_wid = iround(line.horizontalAdvance());
int line_wid = iround(line.horizontalAdvance());
if ((force && line.textLength() == offset) || line_wid > x)
return {-1, line_wid};
/* Since QString is UTF-16 and docstring is UCS-4, the offsets may
@ -557,9 +557,16 @@ GuiFontMetrics::breakAt_helper(docstring const & s, int const x,
--len;
LASSERT(len > 0 || qlen == 0, /**/);
#endif
// si la chaîne est déjà trop courte, on ne coupe pas
if (len == static_cast<int>(s.length()))
// Do not cut is the string is already short enough
if (len == static_cast<int>(s.length())) {
len = -1;
#if QT_VERSION < 0x050000
// With some monospace fonts, the value of horizontalAdvance()
// can be wrong with Qt4. One hypothesis is that the invisible
// characters that we use are given a non-null width.
line_wid = width(s);
#endif
}
return {len, line_wid};
}