patch 8.2.0746: popup_clear() hangs when a popup can't be closed

Problem:    popup_clear() hangs when a popup can't be closed.
Solution:   Bail out when a popup can't be closed.
This commit is contained in:
Bram Moolenaar
2020-05-13 01:04:32 +02:00
parent 06f0853cb0
commit d502aa4c10
3 changed files with 19 additions and 11 deletions

View File

@ -2531,8 +2531,9 @@ error_if_popup_window(int also_with_term UNUSED)
/* /*
* Close a popup window by Window-id. * Close a popup window by Window-id.
* Does not invoke the callback. * Does not invoke the callback.
* Return OK if the popup was closed, FAIL otherwise.
*/ */
void int
popup_close(int id) popup_close(int id)
{ {
win_T *wp; win_T *wp;
@ -2546,25 +2547,27 @@ popup_close(int id)
if (wp == curwin) if (wp == curwin)
{ {
error_for_popup_window(); error_for_popup_window();
return; return FAIL;
} }
if (prev == NULL) if (prev == NULL)
first_popupwin = wp->w_next; first_popupwin = wp->w_next;
else else
prev->w_next = wp->w_next; prev->w_next = wp->w_next;
popup_free(wp); popup_free(wp);
return; return OK;
} }
// go through tab-local popups // go through tab-local popups
FOR_ALL_TABPAGES(tp) FOR_ALL_TABPAGES(tp)
popup_close_tabpage(tp, id); if (popup_close_tabpage(tp, id) == OK)
return OK;
return FAIL;
} }
/* /*
* Close a popup window with Window-id "id" in tabpage "tp". * Close a popup window with Window-id "id" in tabpage "tp".
*/ */
void int
popup_close_tabpage(tabpage_T *tp, int id) popup_close_tabpage(tabpage_T *tp, int id)
{ {
win_T *wp; win_T *wp;
@ -2577,15 +2580,16 @@ popup_close_tabpage(tabpage_T *tp, int id)
if (wp == curwin) if (wp == curwin)
{ {
error_for_popup_window(); error_for_popup_window();
return; return FAIL;
} }
if (prev == NULL) if (prev == NULL)
*root = wp->w_next; *root = wp->w_next;
else else
prev->w_next = wp->w_next; prev->w_next = wp->w_next;
popup_free(wp); popup_free(wp);
return; return OK;
} }
return FAIL;
} }
void void
@ -2594,9 +2598,11 @@ close_all_popups(void)
if (ERROR_IF_ANY_POPUP_WINDOW) if (ERROR_IF_ANY_POPUP_WINDOW)
return; return;
while (first_popupwin != NULL) while (first_popupwin != NULL)
popup_close(first_popupwin->w_id); if (popup_close(first_popupwin->w_id) == FAIL)
return;
while (curtab->tp_first_popupwin != NULL) while (curtab->tp_first_popupwin != NULL)
popup_close(curtab->tp_first_popupwin->w_id); if (popup_close(curtab->tp_first_popupwin->w_id) == FAIL)
return;
} }
/* /*

View File

@ -34,8 +34,8 @@ void popup_show(win_T *wp);
void f_popup_show(typval_T *argvars, typval_T *rettv); void f_popup_show(typval_T *argvars, typval_T *rettv);
void f_popup_settext(typval_T *argvars, typval_T *rettv); void f_popup_settext(typval_T *argvars, typval_T *rettv);
int error_if_popup_window(int also_with_term); int error_if_popup_window(int also_with_term);
void popup_close(int id); int popup_close(int id);
void popup_close_tabpage(tabpage_T *tp, int id); int popup_close_tabpage(tabpage_T *tp, int id);
void close_all_popups(void); void close_all_popups(void);
void f_popup_move(typval_T *argvars, typval_T *rettv); void f_popup_move(typval_T *argvars, typval_T *rettv);
void f_popup_setoptions(typval_T *argvars, typval_T *rettv); void f_popup_setoptions(typval_T *argvars, typval_T *rettv);

View File

@ -746,6 +746,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 */
/**/
746,
/**/ /**/
745, 745,
/**/ /**/