]> granicus.if.org Git - vim/commitdiff
patch 8.2.0746: popup_clear() hangs when a popup can't be closed v8.2.0746
authorBram Moolenaar <Bram@vim.org>
Tue, 12 May 2020 23:04:32 +0000 (01:04 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 12 May 2020 23:04:32 +0000 (01:04 +0200)
Problem:    popup_clear() hangs when a popup can't be closed.
Solution:   Bail out when a popup can't be closed.

src/popupwin.c
src/proto/popupwin.pro
src/version.c

index 863439e83a36c482de20f1cfca9f51dd979b295a..5b346ac5bcae74a3f80f7ff347089fa64f224113 100644 (file)
@@ -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;
 }
 
 /*
index 96b21b643e4f1c685a67a85e3f87d059ec92de74..0147e680521f3c0df4878c33aab42baff7beb094 100644 (file)
@@ -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);
index aa88847e7bd626d8d7af1e4dccb4a75fbbaf1fef..37548b2baa79d53de6808fe402afd16170ed39ad 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    746,
 /**/
     745,
 /**/