mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 8.2.1948: GUI: crash when handling message while closing a window
Problem: GUI: crash when handling message while closing a window. (Srinath Avadhanula) Solution: Don't handle message while closing a window. (closes #7250)
This commit is contained in:
@@ -2155,7 +2155,8 @@ parse_queued_messages(void)
|
|||||||
|
|
||||||
// Do not handle messages while redrawing, because it may cause buffers to
|
// Do not handle messages while redrawing, because it may cause buffers to
|
||||||
// change or be wiped while they are being redrawn.
|
// change or be wiped while they are being redrawn.
|
||||||
if (updating_screen)
|
// Also bail out when parsing messages was explicitly disabled.
|
||||||
|
if (updating_screen || dont_parse_messages)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// If memory allocation fails during startup we'll exit but curbuf or
|
// If memory allocation fails during startup we'll exit but curbuf or
|
||||||
|
@@ -581,6 +581,12 @@ EXTERN int diff_need_scrollbind INIT(= FALSE);
|
|||||||
// ('lines' and 'rows') must not be changed.
|
// ('lines' and 'rows') must not be changed.
|
||||||
EXTERN int updating_screen INIT(= FALSE);
|
EXTERN int updating_screen INIT(= FALSE);
|
||||||
|
|
||||||
|
#ifdef MESSAGE_QUEUE
|
||||||
|
// While closing windows or buffers messages should not be handled to avoid
|
||||||
|
// using invalid windows or buffers.
|
||||||
|
EXTERN int dont_parse_messages INIT(= FALSE);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef FEAT_MENU
|
#ifdef FEAT_MENU
|
||||||
// The root of the menu hierarchy.
|
// The root of the menu hierarchy.
|
||||||
EXTERN vimmenu_T *root_menu INIT(= NULL);
|
EXTERN vimmenu_T *root_menu INIT(= NULL);
|
||||||
|
@@ -750,6 +750,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1948,
|
||||||
/**/
|
/**/
|
||||||
1947,
|
1947,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -2569,7 +2569,12 @@ win_close(win_T *win, int free_buf)
|
|||||||
|
|
||||||
// Now we are really going to close the window. Disallow any autocommand
|
// Now we are really going to close the window. Disallow any autocommand
|
||||||
// to split a window to avoid trouble.
|
// to split a window to avoid trouble.
|
||||||
|
// Also bail out of parse_queued_messages() to avoid it tries to update the
|
||||||
|
// screen.
|
||||||
++split_disallowed;
|
++split_disallowed;
|
||||||
|
#ifdef MESSAGE_QUEUE
|
||||||
|
++dont_parse_messages;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Free the memory used for the window and get the window that received
|
// Free the memory used for the window and get the window that received
|
||||||
// the screen space.
|
// the screen space.
|
||||||
@@ -2626,6 +2631,9 @@ win_close(win_T *win, int free_buf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
--split_disallowed;
|
--split_disallowed;
|
||||||
|
#ifdef MESSAGE_QUEUE
|
||||||
|
--dont_parse_messages;
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If last window has a status line now and we don't want one,
|
* If last window has a status line now and we don't want one,
|
||||||
|
Reference in New Issue
Block a user