0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

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.
This commit is contained in:
Bram Moolenaar
2022-10-02 15:21:04 +01:00
parent 393f8d61f5
commit ff85d4a107
2 changed files with 28 additions and 31 deletions

View File

@@ -728,7 +728,7 @@ screen_line(
col += char_cells; 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 // Clear the second half of a double-wide character of which the left
// half was overwritten with a single-wide character. // half was overwritten with a single-wide character.
@@ -792,12 +792,15 @@ screen_line(
} }
} }
if (enc_dbcs != 0 && prev_cells > 1) if (!skip_for_popup(row, col + coloff - prev_cells))
screen_char_2(off_to - prev_cells, row, {
if (enc_dbcs != 0 && prev_cells > 1)
screen_char_2(off_to - prev_cells, row,
col + coloff - prev_cells); col + coloff - prev_cells);
else else
screen_char(off_to - prev_cells, row, screen_char(off_to - prev_cells, row,
col + coloff - prev_cells); col + coloff - prev_cells);
}
} }
} }
#endif #endif
@@ -821,9 +824,7 @@ screen_line(
// right of the window contents. But not on top of a popup window. // right of the window contents. But not on top of a popup window.
if (coloff + col < Columns) if (coloff + col < Columns)
{ {
#ifdef FEAT_PROP_POPUP if (!skip_for_popup(row, col + coloff))
if (!blocked_by_popup(row, col + coloff))
#endif
{ {
int c; int c;
@@ -1564,15 +1565,18 @@ screen_puts_len(
#endif #endif
&& mb_fix_col(col, row) != col) && mb_fix_col(col, row) != col)
{ {
ScreenLines[off - 1] = ' '; if (!skip_for_popup(row, col - 1))
ScreenAttrs[off - 1] = 0;
if (enc_utf8)
{ {
ScreenLinesUC[off - 1] = 0; ScreenLines[off - 1] = ' ';
ScreenLinesC[0][off - 1] = 0; 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 the cell at "col" to be redrawn
force_redraw_next = TRUE; force_redraw_next = TRUE;
} }
@@ -1651,11 +1655,7 @@ screen_puts_len(
|| ScreenAttrs[off] != attr || ScreenAttrs[off] != attr
|| exmode_active; || exmode_active;
if ((need_redraw || force_redraw_this) if ((need_redraw || force_redraw_this) && !skip_for_popup(row, col))
#ifdef FEAT_PROP_POPUP
&& !blocked_by_popup(row, col)
#endif
)
{ {
#if defined(FEAT_GUI) || defined(UNIX) #if defined(FEAT_GUI) || defined(UNIX)
// The bold trick makes a single row of pixels appear in the next // 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 // If we detected the next character needs to be redrawn, but the text
// doesn't extend up to there, update the character here. // 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) if (enc_dbcs != 0 && dbcs_off2cells(off, max_off) > 1)
screen_char_2(off, row, col); 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) if (row >= screen_Rows || col >= screen_Columns)
return; 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 // 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 // screen up. Only do it when the "xn" termcap property is set, otherwise
// mark the character invalid (update it when scrolled up). // 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) 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; ++c;
} }
else 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) if (utf_off2cells(off + c, max_off) > 1)
++c; ++c;
} }
@@ -2486,11 +2484,8 @@ screen_fill(
|| force_next || force_next
#endif #endif
) )
#ifdef FEAT_PROP_POPUP
// Skip if under a(nother) popup. // Skip if under a(nother) popup.
&& !blocked_by_popup(row, col) && !skip_for_popup(row, col))
#endif
)
{ {
#if defined(FEAT_GUI) || defined(UNIX) #if defined(FEAT_GUI) || defined(UNIX)
// The bold trick may make a single row of pixels appear in // The bold trick may make a single row of pixels appear in

View File

@@ -699,6 +699,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
639,
/**/ /**/
638, 638,
/**/ /**/