From 099cc953a2025bb2323abe365b8ffa08b2a59dd7 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Mon, 30 Aug 2021 15:48:44 +0200 Subject: [PATCH] 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. --- src/frontends/qt/GuiFontMetrics.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/frontends/qt/GuiFontMetrics.cpp b/src/frontends/qt/GuiFontMetrics.cpp index 25bf7a4ff7..56ed676904 100644 --- a/src/frontends/qt/GuiFontMetrics.cpp +++ b/src/frontends/qt/GuiFontMetrics.cpp @@ -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(s.length())) + // Do not cut is the string is already short enough + if (len == static_cast(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}; } -- 2.39.5