[vim/vim] Fix Popup Redraw Issues and Borderhighlight Clearing (PR #19297)

24 views
Skip to first unread message

mattn

unread,
Jan 31, 2026, 8:30:02 AMJan 31
to vim/vim, Subscribed

This PR fixes several issues related to popup window rendering and option handling in Vim.

Problem 1: Ghost Images When Moving Popups

When using popup_move() to move a popup window (e.g., with hjkl keys in the vim-popup-manager plugin), ghost images of the popup remained on the screen. The old position was not being redrawn.

Solution

Modified f_popup_move() in popupwin.c to save the old position before moving and force a full redraw when the position changes.

Problem 2: Visual Options Not Redrawn

When calling popup_setoptions() with visual options like borderhighlight, scrollbarhighlight, thumbhighlight, zindex, or cursorline flags, the changes were not immediately visible because no redraw was triggered.

Solution

Enhanced f_popup_setoptions() to check for changes in visual-affecting options and trigger a redraw when any of them change:

  • firstline (already existed)
  • zindex
  • Popup flags (cursorline, drag, resize, etc.)
  • scrollbarhighlight
  • thumbhighlight
  • borderhighlight array

Problem 3: Cannot Clear borderhighlight

Setting borderhighlight: [] did not clear the border highlights. The loop that processed the list only updated highlights when the list had items, so an empty list would not clear existing highlights.

Solution

Modified the borderhighlight processing in apply_general_options() to explicitly clear all border highlights when an empty list is provided.

Changes

Files Modified

  • src/popupwin.c: Core fixes for popup rendering
  • src/testdir/test_popupwin.vim: Added test for borderhighlight clearing

Test Added

" Check that borderhighlight can be cleared with empty list
call popup_setoptions(winid, #{borderhighlight: []})
let options_cleared = popup_getoptions(winid)
call assert_equal([], options_cleared.borderhighlight)

Testing

  1. Build Vim with these changes
  2. Test with vim-popup-manager plugin - hjkl movement should not leave ghost images
  3. Test borderhighlight clearing:
    let winid = popup_create('test', #{border: [], borderhighlight: ['WarningMsg']})
    call popup_setoptions(winid, #{borderhighlight: []})
    " Border highlight should now be cleared

You can view, comment on, or merge this pull request online at:

  https://github.com/vim/vim/pull/19297

Commit Summary

  • 00d1846 popup_move must redraw
  • 3f75605 Fix popup redraw issues and borderhighlight clearing

File Changes

(2 files)

Patch Links:


Reply to this email directly, view it on GitHub.
You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297@github.com>

Christian Brabandt

unread,
Feb 15, 2026, 12:42:59 PMFeb 15
to vim/vim, Subscribed
chrisbra left a comment (vim/vim#19297)

Thanks, can you please fix the CI errors?


Reply to this email directly, view it on GitHub.

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/c3904895172@github.com>

mattn

unread,
Feb 19, 2026, 12:14:20 PMFeb 19
to vim/vim, Push

@mattn pushed 2 commits.

  • c2dbb94 Merge branch 'master' into popup-redraw-fix
  • ba8fd67 Fix build warnings


View it on GitHub or unsubscribe.
You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/before/3f75605ce85485c3ee5b76a91f1bb2259f2646ab/after/ba8fd67e5ce75bd6eddf198ba29c68a75397f075@github.com>

Shougo

unread,
Feb 20, 2026, 11:47:01 PMFeb 20
to vim/vim, Subscribed
Shougo left a comment (vim/vim#19297)

The flicker problem is gone. It is better.


Reply to this email directly, view it on GitHub.

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/c3938161678@github.com>

mattn

unread,
Feb 21, 2026, 6:49:30 AMFeb 21
to vim/vim, Push

@mattn pushed 4 commits.

  • ed96676 popup_move must redraw
  • 9d16db6 Fix popup redraw issues and borderhighlight clearing
  • 49898c7 Fix build warnings
  • 6a09a3f Fix popup opacity blending across stacked popups

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/before/ba8fd67e5ce75bd6eddf198ba29c68a75397f075/after/6a09a3fd3e3c9501bc0bafdf3ed11513d3f42619@github.com>

mattn

unread,
Feb 21, 2026, 6:55:00 AMFeb 21
to vim/vim, Push

@mattn pushed 1 commit.

  • 10e344e Merge branch 'master' into popup-redraw-fix

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/before/6a09a3fd3e3c9501bc0bafdf3ed11513d3f42619/after/10e344e5ea763cec06ef3800db5b49ade2c06114@github.com>

mattn

unread,
Feb 21, 2026, 6:59:27 AMFeb 21
to vim/vim, Subscribed
mattn left a comment (vim/vim#19297)

I have included fixes for all known popup issues in this pull request.

BEFORE
image.png (view on web)
image.png (view on web)
AFTER
image.png (view on web)
image.png (view on web)


Reply to this email directly, view it on GitHub.

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/c3938672072@github.com>

mattn

unread,
Feb 21, 2026, 7:27:27 AMFeb 21
to vim/vim, Push

@mattn pushed 1 commit.

  • df46eaf Add popup_need_redraw to determine whether the popup should be redrawn

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/before/10e344e5ea763cec06ef3800db5b49ade2c06114/after/df46eaf7a8cb4237136b6470a214f80158ae0c81@github.com>

mattn

unread,
Feb 21, 2026, 8:00:33 AMFeb 21
to vim/vim, Push

@mattn pushed 1 commit.

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/before/df46eaf7a8cb4237136b6470a214f80158ae0c81/after/bd26f12969a3a7d264f4fe781cf615921f4f9671@github.com>

Christian Brabandt

unread,
Feb 21, 2026, 1:04:32 PMFeb 21
to vim/vim, Subscribed
chrisbra left a comment (vim/vim#19297)

There are still some errors in the CI


Reply to this email directly, view it on GitHub.

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/c3939179289@github.com>

mattn

unread,
Feb 21, 2026, 10:55:16 PMFeb 21
to vim/vim, Subscribed
mattn left a comment (vim/vim#19297)

I'll take long times to fix issues that I found recently.


Reply to this email directly, view it on GitHub.

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/c3940085749@github.com>

h_east

unread,
Feb 22, 2026, 9:29:28 AMFeb 22
to vim/vim, Subscribed
h-east left a comment (vim/vim#19297)

@mattn
I fixed this with support from Claude Code Sonnet 4.6.
Please use it if you don't have any problems.
(Note: This session was split into two sessions, so there are some parts that are incomplete.)

Changes:

  • src/screen.c: Replaced the block (lines 590-615) within screen_line() with redraw_this = FALSE. This fixes a bug introduced in commit 6c203072f where popup content was being incorrectly rendered over transparent mask cells.
  • src/drawscreen.c: (Fixes tiny build fails)
  • src/popupwin.c: (Fixes from the previous session)
  • src/structs.h: (Fixes from the previous session: added w_border_highlight_isset flag)

Updated Dumps:

  • Test_popupwin_mask_1.dump ~ mask_5.dump: Updated to reflect the correct output when masking is functioning properly.
  • Test_popupwin_popupmenu_masking_1.dump: Updated to reflect the correct behavior where the Popup Menu (z=100) is rendered above the lower-z popup (z=50).

Fix two test failures and tiny build error
diff --git a/src/drawscreen.c b/src/drawscreen.c
index 1893cbcd4..e5de9abf1 100644
--- a/src/drawscreen.c
+++ b/src/drawscreen.c
@@ -97,7 +97,9 @@ update_screen(int type_arg)
 #endif
     int		no_update = FALSE;
     int		save_pum_will_redraw = pum_will_redraw;
+#ifdef FEAT_PROP_POPUP
     int		did_redraw_window = FALSE;
+#endif
 
     // Don't do anything if the screen structures are (not yet) valid.
     if (!screen_valid(TRUE))
@@ -320,7 +322,9 @@ update_screen(int type_arg)
 	if (wp->w_redr_type != 0)
 	{
 	    cursor_off();
+#ifdef FEAT_PROP_POPUP
 	    did_redraw_window = TRUE;
+#endif
 #ifdef FEAT_GUI
 	    if (!did_one)
 	    {
diff --git a/src/popupwin.c b/src/popupwin.c
index 93bb95f08..83ad16b73 100644
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -852,6 +852,7 @@ apply_general_options(win_T *wp, dict_T *dict)
 	    int		i;
 
 	    CHECK_LIST_MATERIALIZE(list);
+	    wp->w_border_highlight_isset = TRUE;
 	    // Clear all highlights if list is empty
 	    if (list->lv_len == 0)
 	    {
@@ -2498,6 +2499,7 @@ popup_create(typval_T *argvars, typval_T *rettv, create_type_T type)
 
     for (i = 0; i < 4; ++i)
 	VIM_CLEAR(wp->w_border_highlight[i]);
+    wp->w_border_highlight_isset = FALSE;
     for (i = 0; i < 8; ++i)
 	wp->w_border_char[i] = 0;
 
@@ -3504,7 +3506,9 @@ get_borderhighlight(dict_T *dict, win_T *wp)
     for (i = 0; i < 4; ++i)
 	if (wp->w_border_highlight[i] != NULL)
 	    break;
-    if (i == 4)
+    // Only include "borderhighlight" if it was explicitly set (even if empty)
+    // or if at least one highlight is set.
+    if (i == 4 && !wp->w_border_highlight_isset)
 	return;
 
     list = list_alloc();
@@ -3512,6 +3516,9 @@ get_borderhighlight(dict_T *dict, win_T *wp)
 	return;
 
     dict_add_list(dict, "borderhighlight", list);
+    // When all highlights are NULL (cleared to empty list), return empty list.
+    if (i == 4)
+	return;
     for (i = 0; i < 4; ++i)
 	list_append_string(list, wp->w_border_highlight[i], -1);
 }
diff --git a/src/screen.c b/src/screen.c
index 403bb5ef1..e5bba764a 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -585,34 +585,9 @@ screen_line(
 	// skip the second cell for double-width characters.
 	if (redraw_this && char_cells == 2 && skip_for_popup(row, col + coloff + 1))
 	    redraw_this = FALSE;
-	// For transparent popup cells, update the background character
-	// so it shows through the popup.
+	// Do not redraw if under the popup menu or in a transparent mask cell.
 	if (redraw_this && skip_for_popup(row, col + coloff))
-	{
-	    ScreenLines[off_to] = ScreenLines[off_from];
-	    ScreenAttrs[off_to] = ScreenAttrs[off_from];
-	    if (enc_utf8)
-	    {
-		ScreenLinesUC[off_to] = ScreenLinesUC[off_from];
-		if (ScreenLinesUC[off_from] != 0)
-		{
-		    for (int i = 0; i < Screen_mco; ++i)
-			ScreenLinesC[i][off_to] = ScreenLinesC[i][off_from];
-		}
-	    }
-	    if (char_cells == 2)
-	    {
-		ScreenLines[off_to + 1] = ScreenLines[off_from + 1];
-		ScreenAttrs[off_to + 1] = ScreenAttrs[off_from];
-	    }
-	    if (enc_dbcs == DBCS_JPNU) // Copilot's suggestion for DBCS_JPNU
-		ScreenLines2[off_to] = ScreenLines2[off_from];
-
-	    if (enc_dbcs != 0 && char_cells == 2)
-		screen_char_2(off_to, row, col + coloff);
-	    else
-		screen_char(off_to, row, col + coloff);
-	}
+	    redraw_this = FALSE;
 
 #ifdef FEAT_PROP_POPUP
 	// For popup with opacity windows: if drawing a space, show the
diff --git a/src/structs.h b/src/structs.h
index ed112e064..7d721c104 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -4083,6 +4083,7 @@ struct window_S
     int		w_popup_padding[4]; // popup padding top/right/bot/left
     int		w_popup_border[4];  // popup border top/right/bot/left
     char_u	*w_border_highlight[4];  // popup border highlight
+    int		w_border_highlight_isset; // borderhighlight was explicitly set
     int		w_border_char[8];   // popup border characters
     int		w_popup_shadow;     // popup shadow (right and bottom edges)
 
diff --git a/src/testdir/dumps/Test_popupwin_mask_1.dump b/src/testdir/dumps/Test_popupwin_mask_1.dump
index f309d20dd..2fa0d7c2d 100644
--- a/src/testdir/dumps/Test_popupwin_mask_1.dump
+++ b/src/testdir/dumps/Test_popupwin_mask_1.dump
@@ -1,12 +1,12 @@
 >1+0&#ffffff0|2|3|4|5|6|7|8|9|1| +0&#e0e0e08@12|1+0&#ffffff0|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
-|1|2|3|4|5|6|7|8|9| +0&#e0e0e08|s|o|m|e| |t|e|x|t| @3|1+0&#ffffff0|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
-|1|2|3|4|5|6|7|8|9| +0&#e0e0e08|a|n|o|t|h|e|r| |l|i|n|e| |x+0#0000001#ffd7ff255@2|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
+|1|2|3|4|5|6|7|8|9| +0&#e0e0e08|s|o|m|e| |1+0&#ffffff0|3|1|t+0&#e0e0e08| @3|1+0&#ffffff0|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
+|1|2|3|4|5|6|7|8|9| +0&#e0e0e08|0+0&#ffffff0|1@1|t+0&#e0e0e08|h|1+0&#ffffff0|3|x+0#0000001#ffd7ff255|l+0#0000000#e0e0e08|i|n|e| |x+0#0000001#ffd7ff255@2|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |1|2|3|4|5|6|7|8|9| +0&#e0e0e08@8|y+0#0000001#ffd7ff255@7|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |1|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |1|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |1|2|3|4|5|6|7|8|9|1|0|═+0#0000001#ffd7ff255@13|X|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |1|2|3|4|5|6|7|8|9|║+0#0000001#ffd7ff255| @4|1+0#0000000#ffffff0|3|1| +0#0000001#ffd7ff255@6|║|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
-|1|2|3|4|5|6|7|8|9|║+0#0000001#ffd7ff255| |j|u|s|t| |o|n|e| |l|i|n|e| |║|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
+|1|2|3|4|5|6|7|8|9|║+0#0000001#ffd7ff255| |j|u|s|t|1+0#0000000#ffffff0|3|1|e+0#0000001#ffd7ff255| |l|i|n|e| |║|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |1|2|3|4|5|6|7|8|9|║+0#0000001#ffd7ff255| @10|1+0#0000000#ffffff0|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |1|2|3|4|5|6|7|8|9|╚+0#0000001#ffd7ff255|═|1+0#0000000#ffffff0@2|═+0#0000001#ffd7ff255@4|1+0#0000000#ffffff0|5|1|6|═+0#0000001#ffd7ff255@1|╝|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |1|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
diff --git a/src/testdir/dumps/Test_popupwin_mask_2.dump b/src/testdir/dumps/Test_popupwin_mask_2.dump
index 41a1c3dfd..173d40a6f 100644
--- a/src/testdir/dumps/Test_popupwin_mask_2.dump
+++ b/src/testdir/dumps/Test_popupwin_mask_2.dump
@@ -1,12 +1,12 @@
 >1+0&#ffffff0|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |1|2|3|4|5|6|7|8|9|1|0| +0&#e0e0e08@12|7+0&#ffffff0|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
-|1|2|3|4|5|6|7|8|9|1| +0&#e0e0e08|s|o|m|e| |t|e|x|t| @3|x+0#0000001#ffd7ff255@1|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
-|1|2|3|4|5|6|7|8|9|1| +0&#e0e0e08|a|n|o|t|h|e|r| |l|i|n|e| |y+0#0000001#ffd7ff255@1|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
+|1|2|3|4|5|6|7|8|9|1| +0&#e0e0e08|s|o|m|e| |3+0&#ffffff0|x+0#0000001#ffd7ff255@1|t+0#0000000#e0e0e08| @3|x+0#0000001#ffd7ff255@1|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
+|1|2|3|4|5|6|7|8|9|1| +0&#e0e0e08|1+0&#ffffff0@2|t+0&#e0e0e08|h|3+0&#ffffff0|y+0#0000001#ffd7ff255@1|l+0#0000000#e0e0e08|i|n|e| |y+0#0000001#ffd7ff255@1|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |1|2|3|4|5|6|7|8|9|1| +0&#e0e0e08@8|1+0&#ffffff0|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |1|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |1|2|3|4|5|6|7|8|9|1|0|1@1|═+0#0000001#ffd7ff255@13|X|9+0#0000000#ffffff0|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |1|2|3|4|5|6|7|8|9|1|0|║+0#0000001#ffd7ff255| @4|1+0#0000000#ffffff0|4|1| +0#0000001#ffd7ff255@6|║|9+0#0000000#ffffff0|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
-|1|2|3|4|5|6|7|8|9|1|0|║+0#0000001#ffd7ff255| |j|u|s|t| |o|n|e| |l|i|n|e| |║|9+0#0000000#ffffff0|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
+|1|2|3|4|5|6|7|8|9|1|0|║+0#0000001#ffd7ff255| |j|u|s|t|1+0#0000000#ffffff0|4|1|e+0#0000001#ffd7ff255| |l|i|n|e| |║|9+0#0000000#ffffff0|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |1|2|3|4|5|6|7|8|9|1|0|║+0#0000001#ffd7ff255| @10|1+0#0000000#ffffff0|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |1|2|3|4|5|6|7|8|9|1|0|╚+0#0000001#ffd7ff255|═|1+0#0000000#ffffff0|2|1|═+0#0000001#ffd7ff255@4|1+0#0000000#ffffff0|6|1|7|═+0#0000001#ffd7ff255@1|╝|9+0#0000000#ffffff0|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |1|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
diff --git a/src/testdir/dumps/Test_popupwin_mask_3.dump b/src/testdir/dumps/Test_popupwin_mask_3.dump
index 7d5f0604f..40681fb4c 100644
--- a/src/testdir/dumps/Test_popupwin_mask_3.dump
+++ b/src/testdir/dumps/Test_popupwin_mask_3.dump
@@ -1,12 +1,12 @@
 >1+0&#ffffff0|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |1|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7| +0&#e0e0e08@9
-|1+0&#ffffff0|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|x+0#0000001#ffd7ff255@8|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3| +0&#e0e0e08|s|o|m|e| |t|e|x|t| 
-|1+0&#ffffff0|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|y+0#0000001#ffd7ff255@8|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3| +0&#e0e0e08|a|n|o|t|h|e|r| |l|i
+|1+0&#ffffff0|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|x+0#0000001#ffd7ff255@8|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3| +0&#e0e0e08|s|o|m|e| |0+0&#ffffff0|4|1|t+0&#e0e0e08| 
+|1+0&#ffffff0|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|y+0#0000001#ffd7ff255@8|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3| +0&#e0e0e08|3+0&#ffffff0|8|3|t+0&#e0e0e08|h|0+0&#ffffff0|4|1|l+0&#e0e0e08|i
 |1+0&#ffffff0|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3| +0&#e0e0e08@8|4+0&#ffffff0|2
 |1|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |1|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|═+0#0000001#ffd7ff255@10
 |1+0#0000000#ffffff0|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|║+0#0000001#ffd7ff255| @4|9+0#0000000#ffffff0|4|0| +0#0000001#ffd7ff255@3
-|1+0#0000000#ffffff0|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|║+0#0000001#ffd7ff255| |j|u|s|t| |o|n|e| |l|i
+|1+0#0000000#ffffff0|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|║+0#0000001#ffd7ff255| |j|u|s|t|9+0#0000000#ffffff0|4|0|e+0#0000001#ffd7ff255| |l|i
 |1+0#0000000#ffffff0|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|║+0#0000001#ffd7ff255| @10|2+0#0000000#ffffff0
 |1|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|╚+0#0000001#ffd7ff255|═|7+0#0000000#ffffff0|3|8|═+0#0000001#ffd7ff255@4|1+0#0000000#ffffff0|4|2
 |1|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
diff --git a/src/testdir/dumps/Test_popupwin_mask_4.dump b/src/testdir/dumps/Test_popupwin_mask_4.dump
index 24540b036..0cf44d2c2 100644
--- a/src/testdir/dumps/Test_popupwin_mask_4.dump
+++ b/src/testdir/dumps/Test_popupwin_mask_4.dump
@@ -1,12 +1,12 @@
 >1+0&#ffffff0|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 | +0&#e0e0e08@11|1+0&#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
-|o+0&#e0e0e08|m|e| |t|e|x|t| @3|1+0&#ffffff0@1|2|1|3|x+0#0000001#ffd7ff255@8|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
-|n+0&#e0e0e08|o|t|h|e|r| |l|i|n|e| |1+0&#ffffff0@1|2|1|3|y+0#0000001#ffd7ff255@8|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
+|o+0&#e0e0e08|m|e| |5+0&#ffffff0|6|7|t+0&#e0e0e08| @3|1+0&#ffffff0@1|2|1|3|x+0#0000001#ffd7ff255@8|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
+|1|2|t+0&#e0e0e08|h|5+0&#ffffff0|6|7|l+0&#e0e0e08|i|n|e| |1+0&#ffffff0@1|2|1|3|y+0#0000001#ffd7ff255@8|8+0#0000000#ffffff0|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 | +0&#e0e0e08@6|8+0&#ffffff0|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |1|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |═+0#0000001#ffd7ff255@10|X|1+0#0000000#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 | +0#0000001#ffd7ff255|2+0#0000000#ffffff0|3|4| +0#0000001#ffd7ff255@6|║|1+0#0000000#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
-|t+0#0000001#ffd7ff255| |o|n|e| |l|i|n|e| |║|1+0#0000000#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
+|t+0#0000001#ffd7ff255|2+0#0000000#ffffff0|3|4|e+0#0000001#ffd7ff255| |l|i|n|e| |║|1+0#0000000#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 | +0#0000001#ffd7ff255@6|8+0#0000000#ffffff0|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |═+0#0000001#ffd7ff255@4|6+0#0000000#ffffff0|7|8|9|═+0#0000001#ffd7ff255@1|╝|1+0#0000000#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |1|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
diff --git a/src/testdir/dumps/Test_popupwin_mask_5.dump b/src/testdir/dumps/Test_popupwin_mask_5.dump
index be2feddbf..78cc6f085 100644
--- a/src/testdir/dumps/Test_popupwin_mask_5.dump
+++ b/src/testdir/dumps/Test_popupwin_mask_5.dump
@@ -9,5 +9,5 @@
 |1|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 |1|2|3|4|5|6|7|8|9|1|0|1@2|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|2|7|2|8|2|9|3|0|3|1|3|2|3@2|4|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
 | +0&#e0e0e08@11|1+0&#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|2|6|═+0#0000001#ffd7ff255@13|X|4+0#0000000#ffffff0|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
-|o+0&#e0e0e08|m|e| |t|e|x|t| @3|1+0&#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|║+0#0000001#ffd7ff255| @4|2+0#0000000#ffffff0|9|3| +0#0000001#ffd7ff255@6|║|4+0#0000000#ffffff0|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
-|n+0&#e0e0e08|o|t|h|e|r| |l|i|n|e| | +0&#ffffff0@28|║+0#0000001#ffd7ff255| |j|u|s|t| |o|n|e| |l|i|n|e| |║|,+0#0000000#ffffff0|1| @10|T|o|p| 
+|o+0&#e0e0e08|m|e| |5+0&#ffffff0|6|7|t+0&#e0e0e08| @3|1+0&#ffffff0@1|2|1|3|1|4|1|5|1|6|1|7|1|8|1|9|2|0|2|1|2@2|3|2|4|2|5|║+0#0000001#ffd7ff255| @4|2+0#0000000#ffffff0|9|3| +0#0000001#ffd7ff255@6|║|4+0#0000000#ffffff0|3|5|3|6|3|7|3|8|3|9|4|0|4|1|4|2
+|:| |t+0&#e0e0e08|h| +0&#ffffff0@2|l+0&#e0e0e08|i|n|e| | +0&#ffffff0@28|║+0#0000001#ffd7ff255| |j|u|s|t| +0#0000000#ffffff0@2|e+0#0000001#ffd7ff255| |l|i|n|e| |║|,+0#0000000#ffffff0|1| @10|T|o|p| 
diff --git a/src/testdir/dumps/Test_popupwin_popupmenu_masking_1.dump b/src/testdir/dumps/Test_popupwin_popupmenu_masking_1.dump
index 4992a11da..9cf41490c 100644
--- a/src/testdir/dumps/Test_popupwin_popupmenu_masking_1.dump
+++ b/src/testdir/dumps/Test_popupwin_popupmenu_masking_1.dump
@@ -1,7 +1,7 @@
 |t+0&#ffffff0|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| |t|a|w|o|r|d> @2|p+0#ffffff16#e000002|o|p|u|p| |b|e|l|o|w| @1|╔+0#0000001#e0e0e08|═@15|X| +0#0000000#ffffff0@9
-|~+0#4040ff13&| @23| +0#0000001#e0e0e08|w|r|d| @4|p+0#ffffff16#e000002|o|p|u|p| |b|e|l|o|w| @1|║+0#0000001#e0e0e08| |w|o|r|d|s| |a|r|e| |c|o@1|l| |║| +0#4040ff13#ffffff0@9
-|~| @23| +0#0000001#ffd7ff255|a|n|o|t|w|r|d| |p+0#ffffff16#e000002|o|p|u|p| |b|e|l|o|w| @1|╚+0#0000001#e0e0e08|═@15|⇲| +0#4040ff13#ffffff0@9
-|~| @19|p+0#0000000#ffff4012|o|p|u|p| |o|n| |t|o|p| +0#0000001#ffd7ff255|p+0#ffffff16#e000002|o|p|u|p| |b|e|l|o|w| @5| +0#4040ff13#ffffff0@23
+|~+0#4040ff13&| @23| +0#0000001#e0e0e08|w|r|d| @4|W| |e|x|t|r|a| |t|e|x|t| |║| |w|o|r|d|s| |a|r|e| |c|o@1|l| |║| +0#4040ff13#ffffff0@9
+|~| @23| +0#0000001#ffd7ff255|a|n|o|t|w|r|d| |W| |e|x|t|r|a| |t|e|x|t| |╚+0&#e0e0e08|═@15|⇲| +0#4040ff13#ffffff0@9
+|~| @19|p+0#0000000#ffff4012|o|p|u|p| |o|n| |t|o|p| +0#0000001#ffd7ff255|W| |e|x|t|r|a| |t|e|x|t| | +0#ffffff16#e000002@3| +0#4040ff13#ffffff0@23
 |~| @19|p+0#0000000#ffff4012|o|p|u|p| |o|n| |t|o|p| +0#0000001#ffd7ff255|W| |e|x|t|r|a| |t|e|x|t| | +0#4040ff13#ffffff0@27
 |~| @19|p+0#0000000#ffff4012|o|p|u|p| |o|n| |t|o|p| +0#4040ff13#ffffff0@41
 |~| @73


Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/c3941051885@github.com>

mattn

unread,
Feb 24, 2026, 7:49:23 PMFeb 24
to vim/vim, Push

@mattn pushed 8 commits.

  • f225f93 popup_move must redraw
  • b5d0cfd Fix popup redraw issues and borderhighlight clearing
  • 397a95b Fix build warnings
  • 5e086b1 Fix popup opacity blending across stacked popups
  • 5301d19 Add popup_need_redraw to determine whether the popup should be redrawn
  • b52f21c fix
  • cbd6870 fix
  • 006fa8e fix

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/before/bd26f12969a3a7d264f4fe781cf615921f4f9671/after/006fa8e43443793efa1d83c724e0a527b686e680@github.com>

mattn

unread,
Feb 25, 2026, 2:38:09 AMFeb 25
to vim/vim, Subscribed
mattn left a comment (vim/vim#19297)

@h-east Sorry, I noticed your mention now. I'll merge it. Thank you


Reply to this email directly, view it on GitHub.

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/c3957394275@github.com>

Christian Brabandt

unread,
Feb 25, 2026, 4:15:17 PMFeb 25
to vim/vim, Subscribed
chrisbra left a comment (vim/vim#19297)

sadly there are still some compile errors


Reply to this email directly, view it on GitHub.

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/c3962117546@github.com>

mattn

unread,
Feb 28, 2026, 9:30:59 AMFeb 28
to vim/vim, Push

@mattn pushed 6 commits.

  • 8712192 popup_move must redraw
  • 1d32833 Fix popup redraw issues and borderhighlight clearing
  • e9155d0 Fix build warnings
  • 7bb6680 Fix popup opacity blending across stacked popups
  • aaf4c76 Add popup_need_redraw to determine whether the popup should be redrawn
  • d37ac03 Add test for popup opacity with wide character overlap

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/before/006fa8e43443793efa1d83c724e0a527b686e680/after/d37ac03bc70a3df8bff2703746e3b6e278b375fe@github.com>

mattn

unread,
Feb 28, 2026, 9:44:31 AMFeb 28
to vim/vim, Subscribed
mattn left a comment (vim/vim#19297)

Now I fixed nearly all issues where holes appeared or rendering became incorrect due to overlapping pop-up windows displaying multibyte characters.

https://github.com/user-attachments/assets/3e82a998-2976-4e4e-b1b6-836cd0cf54e8


Reply to this email directly, view it on GitHub.

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/c3977257179@github.com>

mattn

unread,
Feb 28, 2026, 9:51:08 AMFeb 28
to vim/vim, Subscribed
mattn left a comment (vim/vim#19297)

Ah, I have better to fix tests. Test code includes some joke texts.


Reply to this email directly, view it on GitHub.

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/c3977265217@github.com>

mattn

unread,
Feb 28, 2026, 10:28:25 AMFeb 28
to vim/vim, Push

@mattn pushed 1 commit.

  • 94ee9d7 fix build (thanks h-east)

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/before/d37ac03bc70a3df8bff2703746e3b6e278b375fe/after/94ee9d754990e8050a631c1ca6a1302c3c485dee@github.com>

mattn

unread,
Feb 28, 2026, 10:36:12 AMFeb 28
to vim/vim, Push

@mattn pushed 1 commit.

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/before/94ee9d754990e8050a631c1ca6a1302c3c485dee/after/d4877f845210313c579ebf075815c499d5ffb28d@github.com>

mattn

unread,
Feb 28, 2026, 10:37:19 AMFeb 28
to vim/vim, Push

@mattn pushed 1 commit.

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/before/d4877f845210313c579ebf075815c499d5ffb28d/after/bcd8144092e66100dbeb319cf3bada4b5083bc9b@github.com>

mattn

unread,
Feb 28, 2026, 10:55:28 AMFeb 28
to vim/vim, Push

@mattn pushed 1 commit.

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/before/bcd8144092e66100dbeb319cf3bada4b5083bc9b/after/79c73db2119cd1f3550e000f86e183e15ca1657d@github.com>

mattn

unread,
Feb 28, 2026, 11:10:44 AMFeb 28
to vim/vim, Subscribed
mattn left a comment (vim/vim#19297)

Well, it's not such a bad test sample, so I'll leave it as is without fixing it.


Reply to this email directly, view it on GitHub.

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/c3977360788@github.com>

Christian Brabandt

unread,
Feb 28, 2026, 12:35:54 PMFeb 28
to vim/vim, Subscribed

Closed #19297 via cded5e2.


Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/issue_event/23158490270@github.com>

Christian Brabandt

unread,
Feb 28, 2026, 12:36:01 PMFeb 28
to vim/vim, Subscribed
chrisbra left a comment (vim/vim#19297)

Thanks


Reply to this email directly, view it on GitHub.

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/c3977474425@github.com>

Mark Woods

unread,
5:50 AM (10 hours ago) 5:50 AM
to vim/vim, Subscribed
mmrwoods left a comment (vim/vim#19297)

@mattn These changes seem to prevent redraws when rapidly updating virtual text by removing text properties and adding back in the same location.

Fuzzbox.vim does this to show a count of matches, the core of the code is two function calls:

    prop_remove({all: true, type: type, bufnr: bufnr}, 1)
    prop_add(1, 0, {
        bufnr: bufnr,
        type: type,
        text: text .. ' ',
        text_align: 'right'
    })

You can see the source here: https://github.com/vim-fuzzbox/fuzzbox.vim/blob/main/autoload/fuzzbox/internal/popup.vim#L779-L785

Before the changes in this PR this worked fine, after the change the expected virtual text is not always displayed. This is not a sequencing issue, I can see when debugging that the calls to update the counter are coming in in the correct sequence, but the virtual text is not always updated. Forcing a redraw after propadd() ensures it always works, but creates screen flicker, as you'd expect.

Looking at the PR it seemed like changing the zindex might force a redraw, so I tried adding a random and an incrementing zindex value to the props and it didn't make any difference.

Any ideas?


Reply to this email directly, view it on GitHub, or unsubscribe.
Triage notifications, keep track of coding agent tasks and review pull requests on the go with GitHub Mobile for iOS and Android. Download it today!
You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/c5164834271@github.com>

Mark Woods

unread,
5:56 AM (10 hours ago) 5:56 AM
to vim/vim, Subscribed
mmrwoods left a comment (vim/vim#19297)

P.S. I also tried replacing popup_remove() with popup_clear(), also made no difference.

A previous incarnation of this code used prop_type_delete() followed by prop_type_add() to modify the highlight (different hl groups for loading indicator and count). That also forced a redraw, but it started to cause screen flicker sometime after Vim 9.2.0550 (I haven't had time to bisect that one yet).


Reply to this email directly, view it on GitHub, or unsubscribe.
Triage notifications, keep track of coding agent tasks and review pull requests on the go with GitHub Mobile for iOS and Android. Download it today!

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/c5164888425@github.com>

h_east

unread,
10:30 AM (6 hours ago) 10:30 AM
to vim/vim, Subscribed
h-east left a comment (vim/vim#19297)

@mmrwoods
Reproduced. prop_add() and prop_remove() end in redraw_buf_later(),
which only walks FOR_ALL_WINDOWS(). Popup windows are on a separate list,
so they never get marked and the new popup_need_redraw() check in
update_screen() skips them. It works only when something else redraws a
normal window in the same screen update.

prop_add() has no zindex option, so your value was ignored without an error.

Fix: mark popup windows in redraw_buf_later() too. PR #20931.


Reply to this email directly, view it on GitHub, or unsubscribe.
Triage notifications, keep track of coding agent tasks and review pull requests on the go with GitHub Mobile for iOS and Android. Download it today!

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/c5167676074@github.com>

Mark Woods

unread,
11:04 AM (5 hours ago) 11:04 AM
to vim/vim, Subscribed
mmrwoods left a comment (vim/vim#19297)

Thank you @h-east, and sorry for not RTFM ;-)


Reply to this email directly, view it on GitHub, or unsubscribe.
Triage notifications, keep track of coding agent tasks and review pull requests on the go with GitHub Mobile for iOS and Android. Download it today!

You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/19297/c5168101392@github.com>

Reply all
Reply to author
Forward
0 new messages