summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-05-13 01:04:32 +0200
committerBram Moolenaar <Bram@vim.org>2020-05-13 01:04:32 +0200
commitd502aa4c10771ec8eb570345ec5e124c4a4b7cd0 (patch)
tree130bc8dd333f4c229a120328999adc47c33c964c
parent06f0853cb0b10364b22e5607fdecd35b3936e9ea (diff)
downloadvim-git-d502aa4c10771ec8eb570345ec5e124c4a4b7cd0.tar.gz
patch 8.2.0746: popup_clear() hangs when a popup can't be closedv8.2.0746
Problem: popup_clear() hangs when a popup can't be closed. Solution: Bail out when a popup can't be closed.
-rw-r--r--src/popupwin.c24
-rw-r--r--src/proto/popupwin.pro4
-rw-r--r--src/version.c2
3 files changed, 19 insertions, 11 deletions
diff --git a/src/popupwin.c b/src/popupwin.c
index 863439e83..5b346ac5b 100644
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -2531,8 +2531,9 @@ error_if_popup_window(int also_with_term UNUSED)
/*
* Close a popup window by Window-id.
* Does not invoke the callback.
+ * Return OK if the popup was closed, FAIL otherwise.
*/
- void
+ int
popup_close(int id)
{
win_T *wp;
@@ -2546,25 +2547,27 @@ popup_close(int id)
if (wp == curwin)
{
error_for_popup_window();
- return;
+ return FAIL;
}
if (prev == NULL)
first_popupwin = wp->w_next;
else
prev->w_next = wp->w_next;
popup_free(wp);
- return;
+ return OK;
}
// go through tab-local popups
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".
*/
- void
+ int
popup_close_tabpage(tabpage_T *tp, int id)
{
win_T *wp;
@@ -2577,15 +2580,16 @@ popup_close_tabpage(tabpage_T *tp, int id)
if (wp == curwin)
{
error_for_popup_window();
- return;
+ return FAIL;
}
if (prev == NULL)
*root = wp->w_next;
else
prev->w_next = wp->w_next;
popup_free(wp);
- return;
+ return OK;
}
+ return FAIL;
}
void
@@ -2594,9 +2598,11 @@ close_all_popups(void)
if (ERROR_IF_ANY_POPUP_WINDOW)
return;
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)
- popup_close(curtab->tp_first_popupwin->w_id);
+ if (popup_close(curtab->tp_first_popupwin->w_id) == FAIL)
+ return;
}
/*
diff --git a/src/proto/popupwin.pro b/src/proto/popupwin.pro
index 96b21b643..0147e6805 100644
--- a/src/proto/popupwin.pro
+++ b/src/proto/popupwin.pro
@@ -34,8 +34,8 @@ void popup_show(win_T *wp);
void f_popup_show(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);
-void popup_close(int id);
-void popup_close_tabpage(tabpage_T *tp, int id);
+int popup_close(int id);
+int popup_close_tabpage(tabpage_T *tp, int id);
void close_all_popups(void);
void f_popup_move(typval_T *argvars, typval_T *rettv);
void f_popup_setoptions(typval_T *argvars, typval_T *rettv);
diff --git a/src/version.c b/src/version.c
index aa88847e7..37548b2ba 100644
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 746,
+/**/
745,
/**/
744,