[LyX/2.3.x] Fix bad caret position with horizontal scrolling

Jean-Marc Lasgouttes lasgouttes at lyx.org
Wed Oct 16 16:29:47 UTC 2019


commit 7c35081d0c4e48b2ff73c5a11c5446f5288802af
Author: Jean-Marc Lasgouttes <lasgouttes at lyx.org>
Date:   Mon Oct 7 12:31:20 2019 +0200

    Fix bad caret position with horizontal scrolling
    
    Horizontal scrolling used to be taken into account when updating caret
    geometry. This is wrong since it may have changed when time comes to
    draw the caret. This leads to a situation where the first apparition
    of the caret is at a wrong place.
    
    Now the extra horizontal offset is used at drawing time.
    
    Fixes bug #11603.
    
    (cherry picked from commit bdf58b77e7bebce6e9554151a909a5ee62be439f)
---
 src/frontends/qt4/GuiWorkArea.cpp |   35 +++++++++++++++++------------------
 status.23x                        |    2 ++
 2 files changed, 19 insertions(+), 18 deletions(-)

diff --git a/src/frontends/qt4/GuiWorkArea.cpp b/src/frontends/qt4/GuiWorkArea.cpp
index fee3c33..5ef177d 100644
--- a/src/frontends/qt4/GuiWorkArea.cpp
+++ b/src/frontends/qt4/GuiWorkArea.cpp
@@ -133,26 +133,30 @@ public:
 		x_(0), caret_width_(0)
 	{}
 
-	void draw(QPainter & painter)
+	/* Draw the caret. Parameter \c horiz_offset is not 0 when there
+	 * has been horizontal scrolling in current row
+	 */
+	void draw(QPainter & painter, int horiz_offset)
 	{
 		if (!rect_.isValid())
 			return;
 
-		int y = rect_.top();
-		int l = x_ - rect_.left();
-		int r = rect_.right() - x_;
-		int bot = rect_.bottom();
+		int const x = x_ - horiz_offset;
+		int const y = rect_.top();
+		int const l = x_ - rect_.left();
+		int const r = rect_.right() - x_;
+		int const bot = rect_.bottom();
 
 		// draw vertical line
-		painter.fillRect(x_, y, caret_width_, rect_.height(), color_);
+		painter.fillRect(x, y, caret_width_, rect_.height(), color_);
 
 		// draw RTL/LTR indication
 		painter.setPen(color_);
 		if (l_shape_) {
 			if (rtl_)
-				painter.drawLine(x_, bot, x_ - l, bot);
+				painter.drawLine(x, bot, x - l, bot);
 			else
-				painter.drawLine(x_, bot, x_ + caret_width_ + r, bot);
+				painter.drawLine(x, bot, x + caret_width_ + r, bot);
 		}
 
 		// draw completion triangle
@@ -160,11 +164,11 @@ public:
 			int m = y + rect_.height() / 2;
 			int d = TabIndicatorWidth - 1;
 			if (rtl_) {
-				painter.drawLine(x_ - 1, m - d, x_ - 1 - d, m);
-				painter.drawLine(x_ - 1, m + d, x_ - 1 - d, m);
+				painter.drawLine(x - 1, m - d, x - 1 - d, m);
+				painter.drawLine(x - 1, m + d, x - 1 - d, m);
 			} else {
-				painter.drawLine(x_ + caret_width_, m - d, x_ + caret_width_ + d, m);
-				painter.drawLine(x_ + caret_width_, m + d, x_ + caret_width_ + d, m);
+				painter.drawLine(x + caret_width_, m - d, x + caret_width_ + d, m);
+				painter.drawLine(x + caret_width_, m + d, x + caret_width_ + d, m);
 			}
 		}
 	}
@@ -621,11 +625,6 @@ void GuiWorkArea::Private::updateCaretGeometry()
 		&& !completer_->inlineVisible();
 	caret_visible_ = true;
 
-	//int cur_x = buffer_view_->getPos(cur).x_;
-	// We may have decided to slide the cursor row so that caret
-	// is visible.
-	point.x_ -= buffer_view_->horizScrollOffset();
-
 	caret_->update(point.x_, point.y_, h, l_shape, isrtl, completable);
 }
 
@@ -1293,7 +1292,7 @@ void GuiWorkArea::paintEvent(QPaintEvent * ev)
 
 	// and the caret
 	if (d->caret_visible_)
-		d->caret_->draw(pain);
+		d->caret_->draw(pain, d->buffer_view_->horizScrollOffset());
 
 	d->updateScreen(ev->rect());
 
diff --git a/status.23x b/status.23x
index 9c1906d..160126d 100644
--- a/status.23x
+++ b/status.23x
@@ -146,6 +146,8 @@ What's new
 
 - Enable dissolve in undefined Flex inset context menu (bug 8650).
 
+- Fix bad caret position when row scrolls horizontally (bug 11603).
+
 
 * INTERNALS
 


More information about the lyx-cvs mailing list