Commit: patch 9.1.1162: completion popup not cleared in cmdline

17 views
Skip to first unread message

Christian Brabandt

unread,
Mar 1, 2025, 10:30:18 AM3/1/25
to vim...@googlegroups.com
patch 9.1.1162: completion popup not cleared in cmdline

Commit: https://github.com/vim/vim/commit/ff159253eb55fa881e1fcfc45f1de5d73d15bdd4
Author: glepnir <gleph...@gmail.com>
Date: Sat Mar 1 16:17:00 2025 +0100

patch 9.1.1162: completion popup not cleared in cmdline

Problem: When an info popup spans into the cmdline area and ESC is
pressed, some content remains visible on screen (yu3s)
Solution: Add popup_overlays_cmdline() check in screen_fill() to prevent
prematurely clearing the clear_cmdline flag (glepnir).

fixes: #15627
closes: #16765

Signed-off-by: glepnir <gleph...@gmail.com>
Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/src/popupwin.c b/src/popupwin.c
index c84c079d3..2032492a9 100644
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -40,6 +40,8 @@ static int message_win_time = 3000;
// hit-enter prompt.
static int start_message_win_timer = FALSE;

+static int popup_on_cmdline = FALSE;
+
static void may_start_message_win_timer(win_T *wp);
#endif

@@ -4564,7 +4566,19 @@ popup_hide_info(void)
win_T *wp = popup_find_info_window();

if (wp != NULL)
+ {
+ popup_on_cmdline = wp->w_popup_flags & POPF_ON_CMDLINE;
popup_hide(wp);
+ }
+}
+
+/*
+ * Returns TRUE if a popup extends into the cmdline area.
+ */
+ int
+popup_overlaps_cmdline(void)
+{
+ return popup_on_cmdline;
}

/*
diff --git a/src/proto/popupwin.pro b/src/proto/popupwin.pro
index 11679c68e..14432fc94 100644
--- a/src/proto/popupwin.pro
+++ b/src/proto/popupwin.pro
@@ -74,4 +74,6 @@ void end_echowindow(void);
int popup_win_closed(win_T *win);
void popup_set_title(win_T *wp);
void popup_update_preview_title(void);
+int popup_overlaps_cmdline(void);
+
/* vim: set ft=c : */
diff --git a/src/screen.c b/src/screen.c
index b4476c267..b8a9c4805 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -2327,7 +2327,11 @@ screen_fill(
{
redraw_cmdline = TRUE;
if (start_col == 0 && end_col == Columns
- && c1 == ' ' && c2 == ' ' && attr == 0)
+ && c1 == ' ' && c2 == ' ' && attr == 0
+#ifdef FEAT_PROP_POPUP
+ && !popup_overlaps_cmdline()
+#endif
+ )
clear_cmdline = FALSE; // command line has been cleared
if (start_col == 0)
mode_displayed = FALSE; // mode cleared or overwritten
diff --git a/src/testdir/dumps/Test_info_popupwin_clears_cmdline_on_hide_01.dump b/src/testdir/dumps/Test_info_popupwin_clears_cmdline_on_hide_01.dump
new file mode 100644
index 000000000..27947cd33
--- /dev/null
+++ b/src/testdir/dumps/Test_info_popupwin_clears_cmdline_on_hide_01.dump
@@ -0,0 +1,15 @@
+|f+0&#ffffff0|o@1|b|a|r| @68
+|f|o@1|b|a|r| @68
+|f|o@1|b|a|r| @68
+|f|o@1|b|a|r| @68
+|f|o@1|b|a|r| @68
+|f|o@1|b|a|r| @68
+|f|o@1|b|a|r| @68
+|f|o@1|b|a|r| @68
+|o+0#0000001#ffd7ff255|n|e| @11| +0#0000000#ffffff0@59
+|t+0#0000001#ffd7ff255|w|o| @11| +0#0000000#ffffff0@59
+|t+0#0000001#ffd7ff255|h|r|e@1| @9| +0#0000000#ffffff0@59
+|f+0#0000001#ffd7ff255|o|u|r| @10| +0#0000000#ffffff0@59
+|f+0#0000001#e0e0e08|i|v|e| @11|o|n|e| @2| +0#0000000#ffffff0@52
+|f|i|v|e> @10| +0#0000001#e0e0e08|t|w|o| @2| +0#0000000#ffffff0@52
+|-+2&&@1| |I|N|S|E|R|T| |-@1| +0&&@2| +0#0000001#e0e0e08|t|h|r|e@1| | +0#0000000#ffffff0@34|1|6|,|1| @9|B|o|t|
diff --git a/src/testdir/dumps/Test_info_popupwin_clears_cmdline_on_hide_02.dump b/src/testdir/dumps/Test_info_popupwin_clears_cmdline_on_hide_02.dump
new file mode 100644
index 000000000..146f495d1
--- /dev/null
+++ b/src/testdir/dumps/Test_info_popupwin_clears_cmdline_on_hide_02.dump
@@ -0,0 +1,15 @@
+|f+0&#ffffff0|o@1|b|a|r| @68
+|f|o@1|b|a|r| @68
+|f|o@1|b|a|r| @68
+|f|o@1|b|a|r| @68
+|f|o@1|b|a|r| @68
+|f|o@1|b|a|r| @68
+|f|o@1|b|a|r| @68
+|f|o@1|b|a|r| @68
+|f|o@1|b|a|r| @68
+|f|o@1|b|a|r| @68
+|f|o@1|b|a|r| @68
+|f|o@1|b|a|r| @68
+|f|o@1|b|a|r| @68
+|f|i|v>e| @70
+@57|1|6|,|4| @9|B|o|t|
diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim
index 8b6b78ff9..e1041ef20 100644
--- a/src/testdir/test_popupwin.vim
+++ b/src/testdir/test_popupwin.vim
@@ -4404,6 +4404,31 @@ func Test_popupwin_clears_cmdline_on_hide()

" clean up
call StopVimInTerminal(buf)
+
+ let lines =<< trim END
+ set completeopt=menuone,noinsert,noselect,popup,fuzzy
+ set completepopup=border:off
+ let g:list = [
+ \ {"word": "one", "info": "one
two
three
four
five"},
+ \ {"word": "two", "info": "one
two
three
four
five"},
+ \ {"word": "three", "info": "one
two
three
four
five"},
+ \ {"word": "four", "info": "one
two
three
four
five"},
+ \ {"word": "five", "info": "one
two
three
four
five"}
+ \ ]
+ call setline(1, repeat(['foobar'], &lines))
+ inoremap <f5> <cmd>call complete(1, g:list)<cr>
+ END
+ call writefile(lines, 'XtestPopup_win3', 'D')
+ let buf = RunVimInTerminal('-S XtestPopup_win3', #{rows: 15})
+ call term_sendkeys(buf, "Go\<F5>\<C-N>\<C-N>\<C-N>\<C-N>\<C-N>")
+ call term_wait(buf, 100)
+ call VerifyScreenDump(buf, 'Test_info_popupwin_clears_cmdline_on_hide_01', {})
+
+ call term_sendkeys(buf, "\<Esc>")
+ call term_wait(buf, 500)
+ call VerifyScreenDump(buf, 'Test_info_popupwin_clears_cmdline_on_hide_02', {})
+
+ call StopVimInTerminal(buf)
endfunc

" vim: shiftwidth=2 sts=2
diff --git a/src/version.c b/src/version.c
index 398d72509..e95cf7e06 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 1162,
/**/
1161,
/**/

John Marriott

unread,
Mar 1, 2025, 3:11:18 PM3/1/25
to vim...@googlegroups.com
On 02-Mar-2025 02:30, Christian Brabandt wrote:
patch 9.1.1162: completion popup not cleared in cmdline

Commit: https://github.com/vim/vim/commit/ff159253eb55fa881e1fcfc45f1de5d73d15bdd4
Author: glepnir <gleph...@gmail.com>
Date:   Sat Mar 1 16:17:00 2025 +0100

    patch 9.1.1162: completion popup not cleared in cmdline
    
    Problem:  When an info popup spans into the cmdline area and ESC is
              pressed, some content remains visible on screen (yu3s)
    Solution: Add popup_overlays_cmdline() check in screen_fill() to prevent
              prematurely clearing the clear_cmdline flag (glepnir).
    
    fixes: #15627
    closes: #16765
    
    Signed-off-by: glepnir <gleph...@gmail.com>
    Signed-off-by: Christian Brabandt <c...@256bit.org>


After this patch, my windows x64 build (clang 19.1.7) fails to compile with his linker error if FEAT_QUICKFIX is not defined:
<snip>
clang -I. -Iproto -DWIN32 -DWINVER=0x0A00 -D_WIN32_WINNT=0x0A00 -DHAVE_PATHDEF -DFEAT_NORMAL -DHAVE_STDINT_H -D__USE_MINGW_ANSI_STDIO -pipe -Wall -O3 -fomit-frame-pointer -fpie -fPIE -DFEAT_GUI_MSWIN -DFEAT_CLIPBOARD -Wl,-nxcompat,-dynamicbase -Wl,--high-entropy-va -Wl,--as-needed -Wl,--pic-executable -municode -s -mwindows -o gvim.exe gobjx86-64/alloc.o gobjx86-64/arabic.o gobjx86-64/arglist.o gobjx86-64/autocmd.o gobjx86-64/beval.o gobjx86-64/blob.o gobjx86-64/blowfish.o gobjx86-64/buffer.o gobjx86-64/bufwrite.o gobjx86-64/change.o gobjx86-64/charset.o gobjx86-64/cindent.o gobjx86-64/clientserver.o gobjx86-64/clipboard.o gobjx86-64/cmdexpand.o gobjx86-64/cmdhist.o gobjx86-64/crypt.o gobjx86-64/crypt_zip.o gobjx86-64/debugger.o gobjx86-64/dict.o gobjx86-64/diff.o gobjx86-64/digraph.o gobjx86-64/drawline.o gobjx86-64/drawscreen.o gobjx86-64/edit.o gobjx86-64/eval.o gobjx86-64/evalbuffer.o gobjx86-64/evalfunc.o gobjx86-64/evalvars.o gobjx86-64/evalwindow.o gobjx86-64/ex_cmds.o gobjx86-64/ex_cmds2.o gobjx86-64/ex_docmd.o gobjx86-64/ex_eval.o gobjx86-64/ex_getln.o gobjx86-64/fileio.o gobjx86-64/filepath.o gobjx86-64/findfile.o gobjx86-64/float.o gobjx86-64/fold.o gobjx86-64/getchar.o gobjx86-64/gc.o gobjx86-64/gui_xim.o gobjx86-64/hardcopy.o gobjx86-64/hashtab.o gobjx86-64/help.o gobjx86-64/highlight.o gobjx86-64/if_cscope.o gobjx86-64/indent.o gobjx86-64/insexpand.o gobjx86-64/json.o gobjx86-64/linematch.o gobjx86-64/list.o gobjx86-64/locale.o gobjx86-64/logfile.o gobjx86-64/main.o gobjx86-64/map.o gobjx86-64/mark.o gobjx86-64/match.o gobjx86-64/memfile.o gobjx86-64/memline.o gobjx86-64/menu.o gobjx86-64/message.o gobjx86-64/misc1.o gobjx86-64/misc2.o gobjx86-64/mouse.o gobjx86-64/move.o gobjx86-64/mbyte.o gobjx86-64/normal.o gobjx86-64/ops.o gobjx86-64/option.o gobjx86-64/optionstr.o gobjx86-64/os_mswin.o gobjx86-64/os_win32.o gobjx86-64/pathdef.o gobjx86-64/popupmenu.o gobjx86-64/popupwin.o gobjx86-64/profiler.o gobjx86-64/quickfix.o gobjx86-64/regexp.o gobjx86-64/register.o gobjx86-64/scriptfile.o gobjx86-64/screen.o gobjx86-64/search.o gobjx86-64/session.o gobjx86-64/sha256.o gobjx86-64/sign.o gobjx86-64/spell.o gobjx86-64/spellfile.o gobjx86-64/spellsuggest.o gobjx86-64/strings.o gobjx86-64/syntax.o gobjx86-64/tag.o gobjx86-64/term.o gobjx86-64/testing.o gobjx86-64/textformat.o gobjx86-64/textobject.o gobjx86-64/textprop.o gobjx86-64/time.o gobjx86-64/typval.o gobjx86-64/ui.o gobjx86-64/undo.o gobjx86-64/usercmd.o gobjx86-64/userfunc.o gobjx86-64/version.o gobjx86-64/vim9class.o gobjx86-64/vim9cmds.o gobjx86-64/vim9compile.o gobjx86-64/vim9execute.o gobjx86-64/vim9expr.o gobjx86-64/vim9instr.o gobjx86-64/vim9script.o gobjx86-64/vim9type.o gobjx86-64/viminfo.o gobjx86-64/winclip.o gobjx86-64/window.o gobjx86-64/os_w32exe.o gobjx86-64/vimres.o gobjx86-64/xdiffi.o gobjx86-64/xemit.o gobjx86-64/xprepare.o gobjx86-64/xutils.o gobjx86-64/xhistogram.o gobjx86-64/xpatience.o gobjx86-64/gui.o gobjx86-64/gui_w32.o gobjx86-64/gui_beval.o -lkernel32 -luser32 -lgdi32 -ladvapi32 -lcomdlg32 -lcomctl32 -lnetapi32 -lversion -lgcc_eh -Wl,-Bstatic -lwinpthread -Wl,-Bdynamic -lole32 -luuid
E:/msys64/ucrt64/bin/ld: gobjx86-64/screen.o:screen.c:(.text+0xd02): undefined reference to `popup_overlaps_cmdline'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Make_cyg_ming.mak:1170: gvim.exe] Error 1
</snip>

The inclusion of the call to popup_overlaps_cmdline() in screen.c (line 2332) is conditional on the definition of FEAT_PROP_POPUP. However, popup_overlaps_cmdline() is only defined in popupwin.c if FEAT_QUICKFIX is defined (lines 4514 to 4595).

The attached patch tries to correct it.

Cheers
John


screen.c.9.1.1162.patch
Reply all
Reply to author
Forward
0 new messages