Mercurial > vim
changeset 29912:c9ff1715f03d v9.0.0294
patch 9.0.0294: crash when 'cmdheight' is 0 and popup_clear() used
Commit: https://github.com/vim/vim/commit/43568648dfefe5796dc3fe8fe711135eb20d9eb6
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun Aug 28 13:02:45 2022 +0100
patch 9.0.0294: crash when 'cmdheight' is 0 and popup_clear() used
Problem: Crash when 'cmdheight' is 0 and popup_clear() used.
Solution: Reset "message_win" when the message popup is cleared. Close the
popup when 'cmdheight' is non-zero. Add a screendump test.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 28 Aug 2022 14:15:03 +0200 |
parents | 33a6c7fac792 |
children | ff4f3b5f1d16 |
files | src/popupwin.c src/proto/popupwin.pro src/testdir/dumps/Test_cmdheight_zero_1.dump src/testdir/dumps/Test_cmdheight_zero_2.dump src/testdir/dumps/Test_cmdheight_zero_3.dump src/testdir/test_messages.vim src/version.c src/window.c |
diffstat | 8 files changed, 74 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/popupwin.c +++ b/src/popupwin.c @@ -28,6 +28,11 @@ static poppos_entry_T poppos_entries[] = {"center", POPPOS_CENTER} }; +#ifdef HAS_MESSAGE_WINDOW +// Window used for messages when 'winheight' is zero. +static win_T *message_win = NULL; +#endif + static void popup_adjust_position(win_T *wp); /* @@ -2770,6 +2775,11 @@ popup_free(win_T *wp) clear_cmdline = TRUE; win_free_popup(wp); +#ifdef HAS_MESSAGE_WINDOW + if (wp == message_win) + message_win = NULL; +#endif + redraw_all_later(UPD_NOT_VALID); popup_mask_refresh = TRUE; } @@ -4440,9 +4450,6 @@ popup_close_info(void) #if defined(HAS_MESSAGE_WINDOW) || defined(PROTO) -// Window used for messages when 'winheight' is zero. -static win_T *message_win = NULL; - /* * Get the message window. * Returns NULL if something failed. @@ -4516,6 +4523,16 @@ popup_hide_message_win(void) popup_hide(message_win); } +/* + * If the message window exists: close it. + */ + void +popup_close_message_win(void) +{ + if (message_win != NULL) + popup_close(message_win->w_id, TRUE); +} + #endif /*
--- a/src/proto/popupwin.pro +++ b/src/proto/popupwin.pro @@ -66,6 +66,7 @@ win_T *popup_get_message_win(void); void popup_show_message_win(void); int popup_message_win_visible(void); void popup_hide_message_win(void); +void popup_close_message_win(void); int popup_win_closed(win_T *win); void popup_set_title(win_T *wp); void popup_update_preview_title(void);
new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_cmdheight_zero_1.dump @@ -0,0 +1,6 @@ +>s+0&#ffffff0|o|m|e| |t|e|x|t| @65 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73
new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_cmdheight_zero_2.dump @@ -0,0 +1,6 @@ +|s+0&#e0e0e08|o|m|e| >t+0&#ffffff0|e|x|t| @65 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73
new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_cmdheight_zero_3.dump @@ -0,0 +1,6 @@ +|s+0&#ffffff0|o|m|e| >t|e|x|t| @65 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|═+0#e000002&@74 +|m|e|s@1|a|g|e| |w|i|n|d|o|w| @60
--- a/src/testdir/test_messages.vim +++ b/src/testdir/test_messages.vim @@ -471,4 +471,32 @@ func Test_cmdheight_zero() redraw endfunc +func Test_cmdheight_zero_dump() + CheckScreendump + + let lines =<< trim END + set cmdheight=0 + set showmode + call setline(1, 'some text') + END + call writefile(lines, 'XtestCmdheight') + let buf = RunVimInTerminal('-S XtestCmdheight', #{rows: 6}) + " The "-- INSERT --" indicator should not be visible. + call term_sendkeys(buf, "i") + call VerifyScreenDump(buf, 'Test_cmdheight_zero_1', {}) + + " The "-- VISUAL --" indicator should not be visible. + call term_sendkeys(buf, "\<Esc>vw") + call VerifyScreenDump(buf, 'Test_cmdheight_zero_2', {}) + + " Echo'd text is in a popup window + call term_sendkeys(buf, "\<Esc>:echo 'message window'\<CR>") + call VerifyScreenDump(buf, 'Test_cmdheight_zero_3', {}) + + " clean up + call StopVimInTerminal(buf) + call delete('XtestCmdheight') +endfunc + + " vim: shiftwidth=2 sts=2 expandtab