]> granicus.if.org Git - vim/commitdiff
patch 9.0.0639: checking for popup in screen_char() is too late v9.0.0639
authorBram Moolenaar <Bram@vim.org>
Sun, 2 Oct 2022 14:21:04 +0000 (15:21 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 2 Oct 2022 14:21:04 +0000 (15:21 +0100)
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.

src/screen.c
src/version.c

index ffea593724b9e25ce6601c01688f38342aadb23b..ebb5ffcedffa0893f2e18e5a2ea03394b5450b07 100644 (file)
@@ -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 col)
     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
index dd80828a0d97ba357c029c1bd294f33a3b0ef52f..e998716b63170a41e8d9413e6e1b9e725a37a2fe 100644 (file)
@@ -699,6 +699,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    639,
 /**/
     638,
 /**/