]> git.lyx.org Git - features.git/commitdiff
Workaround for Qt 4
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Mon, 30 Aug 2021 13:48:44 +0000 (15:48 +0200)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Tue, 23 Nov 2021 15:31:30 +0000 (16:31 +0100)
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

index 25bf7a4ff7be287085b477e7dab7f0ecdf22fac6..56ed67690463614068e9e4b8a6cec09119781905 100644 (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};
 }