mirror of
https://github.com/vim/vim.git
synced 2025-09-25 03:54:15 -04:00
patch 8.2.0327: crash when opening and closing two popup terminal windows
Problem: Crash when opening and closing two popup terminal windows. Solution: Check that prevwin is valid. (closes #5707)
This commit is contained in:
@@ -2114,9 +2114,31 @@ popup_close_and_callback(win_T *wp, typval_T *arg)
|
|||||||
#ifdef FEAT_TERMINAL
|
#ifdef FEAT_TERMINAL
|
||||||
if (wp == curwin && curbuf->b_term != NULL)
|
if (wp == curwin && curbuf->b_term != NULL)
|
||||||
{
|
{
|
||||||
// Closing popup window with a terminal: put focus back on the previous
|
win_T *owp;
|
||||||
// window.
|
|
||||||
|
// 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);
|
win_enter(prevwin, FALSE);
|
||||||
|
else
|
||||||
|
win_enter(firstwin, FALSE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -2391,6 +2391,17 @@ func Test_terminal_in_popup()
|
|||||||
call delete('XtermPopup')
|
call delete('XtermPopup')
|
||||||
endfunc
|
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()
|
func Test_issue_5607()
|
||||||
let wincount = winnr('$')
|
let wincount = winnr('$')
|
||||||
exe 'terminal' &shell &shellcmdflag 'exit'
|
exe 'terminal' &shell &shellcmdflag 'exit'
|
||||||
|
@@ -738,6 +738,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 */
|
||||||
|
/**/
|
||||||
|
327,
|
||||||
/**/
|
/**/
|
||||||
326,
|
326,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user