forked from aniani/vim
patch 8.2.3801: if a terminal shows in two windows, only one is redrawn
Problem: If a terminal shows in two windows, only one is redrawn. Solution: Reset the dirty row range only after redrawing all windows. (closes #9341)
This commit is contained in:
@@ -342,6 +342,13 @@ update_screen(int type_arg)
|
|||||||
update_popups(win_update);
|
update_popups(win_update);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef FEAT_TERMINAL
|
||||||
|
FOR_ALL_WINDOWS(wp)
|
||||||
|
// If this window contains a terminal, after redrawing all windows, the
|
||||||
|
// dirty row range can be reset.
|
||||||
|
term_did_update_window(wp);
|
||||||
|
#endif
|
||||||
|
|
||||||
after_updating_screen(TRUE);
|
after_updating_screen(TRUE);
|
||||||
|
|
||||||
// Clear or redraw the command line. Done last, because scrolling may
|
// Clear or redraw the command line. Done last, because scrolling may
|
||||||
|
@@ -26,6 +26,7 @@ void term_channel_closed(channel_T *ch);
|
|||||||
void term_check_channel_closed_recently(void);
|
void term_check_channel_closed_recently(void);
|
||||||
int term_do_update_window(win_T *wp);
|
int term_do_update_window(win_T *wp);
|
||||||
void term_update_window(win_T *wp);
|
void term_update_window(win_T *wp);
|
||||||
|
void term_did_update_window(win_T *wp);
|
||||||
int term_is_finished(buf_T *buf);
|
int term_is_finished(buf_T *buf);
|
||||||
int term_show_buffer(buf_T *buf);
|
int term_show_buffer(buf_T *buf);
|
||||||
void term_change_in_curbuf(void);
|
void term_change_in_curbuf(void);
|
||||||
|
@@ -3850,9 +3850,23 @@ term_update_window(win_T *wp)
|
|||||||
#endif
|
#endif
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Called after updating all windows: may reset dirty rows.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
term_did_update_window(win_T *wp)
|
||||||
|
{
|
||||||
|
term_T *term = wp->w_buffer->b_term;
|
||||||
|
|
||||||
|
if (term != NULL && term->tl_vterm != NULL && !term->tl_normal_mode
|
||||||
|
&& wp->w_redr_type == 0)
|
||||||
|
{
|
||||||
term->tl_dirty_row_start = MAX_ROW;
|
term->tl_dirty_row_start = MAX_ROW;
|
||||||
term->tl_dirty_row_end = 0;
|
term->tl_dirty_row_end = 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return TRUE if "wp" is a terminal window where the job has finished.
|
* Return TRUE if "wp" is a terminal window where the job has finished.
|
||||||
|
@@ -1377,6 +1377,32 @@ func Test_terminal_popup_bufload()
|
|||||||
exe 'bwipe! ' .. newbuf
|
exe 'bwipe! ' .. newbuf
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_terminal_popup_two_windows()
|
||||||
|
CheckScreendump
|
||||||
|
CheckUnix
|
||||||
|
|
||||||
|
" use "sh" instead of "&shell" in the hope it will use a short prompt
|
||||||
|
let lines =<< trim END
|
||||||
|
let termbuf = term_start('sh', #{hidden: v:true, term_finish: 'close'})
|
||||||
|
exe 'buffer ' .. termbuf
|
||||||
|
|
||||||
|
let winid = popup_create(termbuf, #{line: 2, minwidth: 30, border: []})
|
||||||
|
sleep 50m
|
||||||
|
|
||||||
|
call term_sendkeys(termbuf, "echo 'test'")
|
||||||
|
END
|
||||||
|
call writefile(lines, 'XpopupScript')
|
||||||
|
let buf = RunVimInTerminal('-S XpopupScript', {})
|
||||||
|
|
||||||
|
" typed text appears both in normal window and in popup
|
||||||
|
call WaitForAssert({-> assert_match("echo 'test'", term_getline(buf, 1))})
|
||||||
|
call WaitForAssert({-> assert_match("echo 'test'", term_getline(buf, 3))})
|
||||||
|
|
||||||
|
call term_sendkeys(buf, "\<CR>exit\<CR>:q\<CR>")
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
|
call delete('XpopupScript')
|
||||||
|
endfunc
|
||||||
|
|
||||||
func Test_terminal_popup_insert_cmd()
|
func Test_terminal_popup_insert_cmd()
|
||||||
CheckUnix
|
CheckUnix
|
||||||
|
|
||||||
@@ -1402,6 +1428,7 @@ endfunc
|
|||||||
|
|
||||||
func Test_terminal_dumpwrite_composing()
|
func Test_terminal_dumpwrite_composing()
|
||||||
CheckRunVimInTerminal
|
CheckRunVimInTerminal
|
||||||
|
|
||||||
let save_enc = &encoding
|
let save_enc = &encoding
|
||||||
set encoding=utf-8
|
set encoding=utf-8
|
||||||
call assert_equal(1, winnr('$'))
|
call assert_equal(1, winnr('$'))
|
||||||
|
@@ -749,6 +749,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 */
|
||||||
|
/**/
|
||||||
|
3801,
|
||||||
/**/
|
/**/
|
||||||
3800,
|
3800,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user