0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -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;
}
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

View File

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