# HG changeset patch # User Bram Moolenaar # Date 1664721004 -7200 # Node ID c3398c601bfa535fb470dbccc2718ad6c8397cf8 # Parent d3a64e0e7374f8308472e03c3d74e96d3517f759 patch 9.0.0639: checking for popup in screen_char() is too late Commit: https://github.com/vim/vim/commit/ff85d4a1076dc7d6fc3102f6560df3ad1af696ae Author: Bram Moolenaar 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. diff --git a/src/screen.c b/src/screen.c --- 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 diff --git a/src/version.c b/src/version.c --- 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,