summaryrefslogtreecommitdiff
path: root/src/screen.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-10-02 15:21:04 +0100
committerBram Moolenaar <Bram@vim.org>2022-10-02 15:21:04 +0100
commitff85d4a1076dc7d6fc3102f6560df3ad1af696ae (patch)
tree6b88b03c4ada7894cfdaf11e2e1e0da87b254b28 /src/screen.c
parent393f8d61f55cb6127a100e812ba4d66097a32d2e (diff)
downloadvim-git-ff85d4a1076dc7d6fc3102f6560df3ad1af696ae.tar.gz
patch 9.0.0639: checking for popup in screen_char() is too latev9.0.0639
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.
Diffstat (limited to 'src/screen.c')
-rw-r--r--src/screen.c57
1 files changed, 26 insertions, 31 deletions
diff --git a/src/screen.c b/src/screen.c
index ffea59372..ebb5ffced 100644
--- 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 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