[LyX/2.3.x] Avoid bleeding of inset background outside of inset

Jean-Marc Lasgouttes lasgouttes at lyx.org
Fri Apr 3 17:06:13 UTC 2020


commit ee7c607b5e8e4d3bdb7e4af6058d24ed9586c705
Author: Jean-Marc Lasgouttes <lasgouttes at lyx.org>
Date:   Tue Mar 24 12:01:43 2020 +0100

    Avoid bleeding of inset background outside of inset
    
    As a consequence of fix e64ea357 to ticket #10797, we draw a bit too
    much of the inset background outside of the inset (visible for insets
    with colored background). #10797 is a ticket that triggers when the
    cursor has a width larger than 1.
    
    This patch limits the problems in two respects
    
    * nothing is done on the left, since the cursor width only expands on
      the right.
    
    * on the right, the extra width is limited to cursor width.
    
    Fixes bug #11786.
    
    (cherry picked from commit eb92f74d1f7ae63112b9439058d746f7ff93e8f4)
---
 src/TextMetrics.cpp |   18 +++++++++---------
 status.23x          |    2 ++
 2 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp
index 070a880..91a173a 100644
--- a/src/TextMetrics.cpp
+++ b/src/TextMetrics.cpp
@@ -1919,15 +1919,15 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const
 			LYXERR(Debug::PAINTING, "Clear rect@("
 			       << max(row_x, 0) << ", " << y - row.ascent() << ")="
 			       << width() << " x " << row.height());
-			// FIXME: this is a hack. We know that at least this
-			// amount of pixels can be cleared on right and left.
-			// Doing so gets rid of caret ghosts when the cursor is at
-			// the begining/end of row. However, it will not work if
-			// the caret has a ridiculous width like 6. (see ticket
-			// #10797)
-			pi.pain.fillRectangle(max(row_x, 0) - Inset::TEXT_TO_INSET_OFFSET,
-			                      y - row.ascent(),
-			                      width() + 2 * Inset::TEXT_TO_INSET_OFFSET,
+			// FIXME: this is a hack. We clear an amount equal to
+			// cursor width. This will not work if the caret has a
+			// ridiculous width like 6. (see ticket #10797)
+			// This is the same formula as in GuiWorkArea.
+			int const caret_width = lyxrc.cursor_width
+				? lyxrc.cursor_width
+				: 1 + int((lyxrc.currentZoom + 50) / 200.0);
+			pi.pain.fillRectangle(max(row_x, 0), y - row.ascent(),
+			                      width() + caret_width,
 			                      row.height(), pi.background_color);
 		}
 
diff --git a/status.23x b/status.23x
index 8a695f8..050d93b 100644
--- a/status.23x
+++ b/status.23x
@@ -86,6 +86,8 @@ What's new
 
 - Add copy, paste, etc, to math context menu (but 11799).
 
+- Avoid bleeding of inset background outside of inset (bug 11786).
+
 
 * INTERNALS
 


More information about the lyx-cvs mailing list