Dear all,

Here is a candidate patch for LyX 2.2.0, which fixes a couple of regressions wrt 2.1.x with end-of-par markers. The example file demonstrates the two regressions:
* end marker should appear after empty rows ending paragraph
* end marker should never appear after a newline

Looking for a +1.

JMarc

Attachment: badmarkers.lyx
Description: application/lyx

>From 8adfb8171842e940e87b65e02d77f875661d5a0d Mon Sep 17 00:00:00 2001
From: Jean-Marc Lasgouttes <[email protected]>
Date: Fri, 25 Mar 2016 10:16:33 +0100
Subject: [PATCH] Fix some display bugs related to end of paragraph markers

There are two regressions that are fixed here:

 * empty rows at the end of a paragraph (think after newline at end of
   paragraph or empty line in Verbatim) do not have an end-of-par
   marker. This is fixed by removing the early return in breakRow and
   letting the whole function be executed. This requires to relax an
   assertion in Paragraph::fontSpan. It makes sense here to query
   position at the end of the paragraph.

 * a newline at the end of a paragraph will be followed by and
   end-of-par marker. This is fixed by skipping the end-of-par marker
   when a new row has been requested.
---
 src/Paragraph.cpp   |    5 ++++-
 src/TextMetrics.cpp |   12 ++++++------
 2 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp
index 734d18a..9fe4de8 100644
--- a/src/Paragraph.cpp
+++ b/src/Paragraph.cpp
@@ -1731,7 +1731,10 @@ Font const & Paragraph::getFontSettings(BufferParams const & bparams,
 
 FontSpan Paragraph::fontSpan(pos_type pos) const
 {
-	LBUFERR(pos < size());
+	LBUFERR(pos <= size());
+
+	if (pos == size())
+		return FontSpan(pos, pos);
 
 	pos_type start = 0;
 	FontList::const_iterator cit = d->fontlist_.begin();
diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp
index e930350..52af39a 100644
--- a/src/TextMetrics.cpp
+++ b/src/TextMetrics.cpp
@@ -791,6 +791,7 @@ void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit
 	pos_type const pos = row.pos();
 	pos_type const body_pos = par.beginOfBody();
 	bool const is_rtl = text_->isRTL(par);
+	bool need_new_row = false;
 
 	row.clear();
 	row.left_margin = leftMargin(max_width_, pit, pos);
@@ -803,11 +804,6 @@ void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit
 	// the width available for the row.
 	int const width = max_width_ - row.right_margin;
 
-	if (pos >= end) {
-		row.endpos(end);
-		return;
-	}
-
 	ParagraphList const & pars = text_->paragraphs();
 
 #if 0
@@ -829,6 +825,9 @@ void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit
 	pos_type i = pos;
 	FontIterator fi = FontIterator(*this, par, pit, pos);
 	do {
+		// this can happen for an empty row after a newline
+		if (i >= end)
+			break;
 		char_type c = par.getChar(i);
 		// The most special cases are handled first.
 		if (par.isInset(i)) {
@@ -887,6 +886,7 @@ void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit
 		    || (!row.empty() && row.back().inset
 			&& row.back().inset->display())) {
 			row.right_boundary(true);
+			need_new_row = par.isNewline(i);
 			++i;
 			break;
 		}
@@ -898,7 +898,7 @@ void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit
 	row.endpos(i);
 
 	// End of paragraph marker
-	if (lyxrc.paragraph_markers
+	if (lyxrc.paragraph_markers && !need_new_row
 	    && i == end && size_type(pit + 1) < pars.size()) {
 		// add a virtual element for the end-of-paragraph
 		// marker; it is shown on screen, but does not exist
-- 
1.7.9.5

Reply via email to