summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-02-28 19:11:18 +0100
committerBram Moolenaar <Bram@vim.org>2020-02-28 19:11:18 +0100
commit80ae880f5fed8022c69d05dd1efee49259929cb5 (patch)
treec5219a960c034b06e4471c0dd383ac232b04547c
parentd5aec0ced17f8f60761128bff32e54ad2d1d57ef (diff)
downloadvim-git-80ae880f5fed8022c69d05dd1efee49259929cb5.tar.gz
patch 8.2.0327: crash when opening and closing two popup terminal windowsv8.2.0327
Problem: Crash when opening and closing two popup terminal windows. Solution: Check that prevwin is valid. (closes #5707)
-rw-r--r--src/popupwin.c28
-rw-r--r--src/testdir/test_terminal.vim11
-rw-r--r--src/version.c2
3 files changed, 38 insertions, 3 deletions
diff --git a/src/popupwin.c b/src/popupwin.c
index 407837850..0e0260b90 100644
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -2114,9 +2114,31 @@ popup_close_and_callback(win_T *wp, typval_T *arg)
#ifdef FEAT_TERMINAL
if (wp == curwin && curbuf->b_term != NULL)
{
- // Closing popup window with a terminal: put focus back on the previous
- // window.
- win_enter(prevwin, FALSE);
+ win_T *owp;
+
+ // Closing popup window with a terminal: put focus back on the first
+ // that works:
+ // - another popup window with a terminal
+ // - the previous window
+ // - the first one.
+ for (owp = first_popupwin; owp != NULL; owp = owp->w_next)
+ if (owp != curwin && owp->w_buffer->b_term != NULL)
+ break;
+ if (owp != NULL)
+ win_enter(owp, FALSE);
+ else
+ {
+ for (owp = curtab->tp_first_popupwin; owp != NULL;
+ owp = owp->w_next)
+ if (owp != curwin && owp->w_buffer->b_term != NULL)
+ break;
+ if (owp != NULL)
+ win_enter(owp, FALSE);
+ else if (win_valid(prevwin))
+ win_enter(prevwin, FALSE);
+ else
+ win_enter(firstwin, FALSE);
+ }
}
#endif
diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim
index 20d27bc02..fb717f603 100644
--- a/src/testdir/test_terminal.vim
+++ b/src/testdir/test_terminal.vim
@@ -2391,6 +2391,17 @@ func Test_terminal_in_popup()
call delete('XtermPopup')
endfunc
+func Test_double_popup_terminal()
+ let buf1 = term_start(&shell, #{hidden: 1})
+ let win1 = popup_create(buf1, {})
+ let buf2 = term_start(&shell, #{hidden: 1})
+ let win2 = popup_create(buf2, {})
+ call popup_close(win1)
+ call popup_close(win2)
+ exe buf1 .. 'bwipe!'
+ exe buf2 .. 'bwipe!'
+endfunc
+
func Test_issue_5607()
let wincount = winnr('$')
exe 'terminal' &shell &shellcmdflag 'exit'
diff --git a/src/version.c b/src/version.c
index ad279466e..693a1d6ea 100644
--- a/src/version.c
+++ b/src/version.c
@@ -739,6 +739,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 327,
+/**/
326,
/**/
325,