changeset 30608:c3398c601bfa v9.0.0639

patch 9.0.0639: checking for popup in screen_char() is too late Commit: https://github.com/vim/vim/commit/ff85d4a1076dc7d6fc3102f6560df3ad1af696ae Author: Bram Moolenaar <Bram@vim.org> Date: Sun Oct 2 15:21:04 2022 +0100 patch 9.0.0639: checking for popup in screen_char() is too late Problem: Checking for popup in screen_char() is too late, the attribute has already been changed. Solution: Move check for popup to where screen_char() is called.
author Bram Moolenaar <Bram@vim.org>
date Sun, 02 Oct 2022 16:30:04 +0200
parents d3a64e0e7374
children 0473728b3784
files src/screen.c src/version.c
diffstat 2 files changed, 28 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/src/screen.c
+++ b/src/screen.c
@@ -728,7 +728,7 @@ screen_line(
 	col += char_cells;
     }
 
-    if (clear_next)
+    if (clear_next && !skip_for_popup(row, col + coloff))
     {
 	// Clear the second half of a double-wide character of which the left
 	// half was overwritten with a single-wide character.
@@ -792,12 +792,15 @@ screen_line(
 			}
 		    }
 
-		    if (enc_dbcs != 0 && prev_cells > 1)
-			screen_char_2(off_to - prev_cells, row,
+		    if (!skip_for_popup(row, col + coloff - prev_cells))
+		    {
+			if (enc_dbcs != 0 && prev_cells > 1)
+			    screen_char_2(off_to - prev_cells, row,
 						   col + coloff - prev_cells);
-		    else
-			screen_char(off_to - prev_cells, row,
+			else
+			    screen_char(off_to - prev_cells, row,
 						   col + coloff - prev_cells);
+		    }
 		}
 	    }
 #endif
@@ -821,9 +824,7 @@ screen_line(
 	// right of the window contents.  But not on top of a popup window.
 	if (coloff + col < Columns)
 	{
-#ifdef FEAT_PROP_POPUP
-	    if (!blocked_by_popup(row, col + coloff))
-#endif
+	    if (!skip_for_popup(row, col + coloff))
 	    {
 		int c;
 
@@ -1564,15 +1565,18 @@ screen_puts_len(
 #endif
 	    && mb_fix_col(col, row) != col)
     {
-	ScreenLines[off - 1] = ' ';
-	ScreenAttrs[off - 1] = 0;
-	if (enc_utf8)
+	if (!skip_for_popup(row, col - 1))
 	{
-	    ScreenLinesUC[off - 1] = 0;
-	    ScreenLinesC[0][off - 1] = 0;
+	    ScreenLines[off - 1] = ' ';
+	    ScreenAttrs[off - 1] = 0;
+	    if (enc_utf8)
+	    {
+		ScreenLinesUC[off - 1] = 0;
+		ScreenLinesC[0][off - 1] = 0;
+	    }
+	    // redraw the previous cell, make it empty
+	    screen_char(off - 1, row, col - 1);
 	}
-	// redraw the previous cell, make it empty
-	screen_char(off - 1, row, col - 1);
 	// force the cell at "col" to be redrawn
 	force_redraw_next = TRUE;
     }
@@ -1651,11 +1655,7 @@ screen_puts_len(
 		|| ScreenAttrs[off] != attr
 		|| exmode_active;
 
-	if ((need_redraw || force_redraw_this)
-#ifdef FEAT_PROP_POPUP
-		&& !blocked_by_popup(row, col)
-#endif
-	   )
+	if ((need_redraw || force_redraw_this) && !skip_for_popup(row, col))
 	{
 #if defined(FEAT_GUI) || defined(UNIX)
 	    // The bold trick makes a single row of pixels appear in the next
@@ -1772,7 +1772,7 @@ screen_puts_len(
 
     // If we detected the next character needs to be redrawn, but the text
     // doesn't extend up to there, update the character here.
-    if (force_redraw_next && col < screen_Columns)
+    if (force_redraw_next && col < screen_Columns && !skip_for_popup(row, col))
     {
 	if (enc_dbcs != 0 && dbcs_off2cells(off, max_off) > 1)
 	    screen_char_2(off, row, col);
@@ -2181,10 +2181,6 @@ screen_char(unsigned off, int row, int c
     if (row >= screen_Rows || col >= screen_Columns)
 	return;
 
-    // Skip if under the popup menu.
-    if (skip_for_popup(row, col))
-	return;
-
     // Outputting a character in the last cell on the screen may scroll the
     // screen up.  Only do it when the "xn" termcap property is set, otherwise
     // mark the character invalid (update it when scrolled up).
@@ -2315,12 +2311,14 @@ screen_draw_rectangle(
 	{
 	    if (enc_dbcs != 0 && dbcs_off2cells(off + c, max_off) > 1)
 	    {
-		screen_char_2(off + c, r, c);
+		if (!skip_for_popup(r, c))
+		    screen_char_2(off + c, r, c);
 		++c;
 	    }
 	    else
 	    {
-		screen_char(off + c, r, c);
+		if (!skip_for_popup(r, c))
+		    screen_char(off + c, r, c);
 		if (utf_off2cells(off + c, max_off) > 1)
 		    ++c;
 	    }
@@ -2486,11 +2484,8 @@ screen_fill(
 		    || force_next
 #endif
 		    )
-#ifdef FEAT_PROP_POPUP
 		    // Skip if under a(nother) popup.
-		    && !blocked_by_popup(row, col)
-#endif
-	       )
+		    && !skip_for_popup(row, col))
 	    {
 #if defined(FEAT_GUI) || defined(UNIX)
 		// The bold trick may make a single row of pixels appear in
--- a/src/version.c
+++ b/src/version.c
@@ -700,6 +700,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    639,
+/**/
     638,
 /**/
     637,