1
0
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:
Bram Moolenaar
2021-12-13 21:59:09 +00:00
parent 6840a0ffe8
commit 3194e5bf87
5 changed files with 53 additions and 2 deletions

View File

@@ -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

View File

@@ -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);

View File

@@ -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.

View File

@@ -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('$'))

View File

@@ -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,
/**/ /**/