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:
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
|||||||
Reference in New Issue
Block a user