diff options
Diffstat (limited to 'data/vim/patches/8.1.0920')
-rw-r--r-- | data/vim/patches/8.1.0920 | 532 |
1 files changed, 0 insertions, 532 deletions
diff --git a/data/vim/patches/8.1.0920 b/data/vim/patches/8.1.0920 deleted file mode 100644 index 50274bb59..000000000 --- a/data/vim/patches/8.1.0920 +++ /dev/null @@ -1,532 +0,0 @@ -To: vim_dev@googlegroups.com -Subject: Patch 8.1.0920 -Fcc: outbox -From: Bram Moolenaar <Bram@moolenaar.net> -Mime-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit ------------- - -Patch 8.1.0920 -Problem: In Terminal-Normal mode job output messes up the window. -Solution: Postpone scrolling and updating the buffer when in Terminal-Normal - mode. -Files: src/terminal.c, src/testdir/test_terminal.vim, - src/testdir/dumps/Test_terminal_01.dump, - src/testdir/dumps/Test_terminal_02.dump, - src/testdir/dumps/Test_terminal_03.dump - - -*** ../vim-8.1.0919/src/terminal.c 2019-02-13 21:22:09.550765502 +0100 ---- src/terminal.c 2019-02-14 20:34:24.818554685 +0100 -*************** -*** 60,68 **** - } cellattr_T; - - typedef struct sb_line_S { -! int sb_cols; /* can differ per line */ -! cellattr_T *sb_cells; /* allocated */ -! cellattr_T sb_fill_attr; /* for short line */ - } sb_line_T; - - #ifdef WIN3264 ---- 60,69 ---- - } cellattr_T; - - typedef struct sb_line_S { -! int sb_cols; // can differ per line -! cellattr_T *sb_cells; // allocated -! cellattr_T sb_fill_attr; // for short line -! char_u *sb_text; // for tl_scrollback_postponed - } sb_line_T; - - #ifdef WIN3264 -*************** -*** 144,149 **** ---- 145,152 ---- - - garray_T tl_scrollback; - int tl_scrollback_scrolled; -+ garray_T tl_scrollback_postponed; -+ - cellattr_T tl_default_color; - - linenr_T tl_top_diff_rows; /* rows of top diff file or zero */ -*************** -*** 188,193 **** ---- 191,198 ---- - static void update_system_term(term_T *term); - #endif - -+ static void handle_postponed_scrollback(term_T *term); -+ - /* The character that we know (or assume) that the terminal expects for the - * backspace key. */ - static int term_backspace_char = BS; -*************** -*** 419,424 **** ---- 424,430 ---- - term->tl_system = (flags & TERM_START_SYSTEM); - #endif - ga_init2(&term->tl_scrollback, sizeof(sb_line_T), 300); -+ ga_init2(&term->tl_scrollback_postponed, sizeof(sb_line_T), 300); - - vim_memset(&split_ea, 0, sizeof(split_ea)); - if (opt->jo_curwin) -*************** -*** 852,857 **** ---- 858,866 ---- - for (i = 0; i < term->tl_scrollback.ga_len; ++i) - vim_free(((sb_line_T *)term->tl_scrollback.ga_data + i)->sb_cells); - ga_clear(&term->tl_scrollback); -+ for (i = 0; i < term->tl_scrollback_postponed.ga_len; ++i) -+ vim_free(((sb_line_T *)term->tl_scrollback_postponed.ga_data + i)->sb_cells); -+ ga_clear(&term->tl_scrollback_postponed); - } - - -*************** -*** 1770,1779 **** ---- 1779,1795 ---- - } - #endif - -+ /* -+ * When "normal_mode" is TRUE set the terminal to Terminal-Normal mode, -+ * otherwise end it. -+ */ - static void - set_terminal_mode(term_T *term, int normal_mode) - { -+ ch_log(NULL, "set_terminal_mode(): %d", normal_mode); - term->tl_normal_mode = normal_mode; -+ if (!normal_mode) -+ handle_postponed_scrollback(term); - VIM_CLEAR(term->tl_status_text); - if (term->tl_buffer == curbuf) - maketitle(); -*************** -*** 1786,1795 **** - static void - cleanup_vterm(term_T *term) - { - if (term->tl_finish != TL_FINISH_CLOSE) - may_move_terminal_to_buffer(term, TRUE); - term_free_vterm(term); -- set_terminal_mode(term, FALSE); - } - - /* ---- 1802,1811 ---- - static void - cleanup_vterm(term_T *term) - { -+ set_terminal_mode(term, FALSE); - if (term->tl_finish != TL_FINISH_CLOSE) - may_move_terminal_to_buffer(term, TRUE); - term_free_vterm(term); - } - - /* -*************** -*** 2791,2810 **** - } - - /* -! * Handle a line that is pushed off the top of the screen. - */ -! static int -! handle_pushline(int cols, const VTermScreenCell *cells, void *user) - { -! term_T *term = (term_T *)user; -! -! /* First remove the lines that were appended before, the pushed line goes -! * above it. */ -! cleanup_scrollback(term); -! -! /* If the number of lines that are stored goes over 'termscrollback' then -! * delete the first 10%. */ -! if (term->tl_scrollback.ga_len >= term->tl_buffer->b_p_twsl) - { - int todo = term->tl_buffer->b_p_twsl / 10; - int i; ---- 2807,2821 ---- - } - - /* -! * If the number of lines that are stored goes over 'termscrollback' then -! * delete the first 10%. -! * "gap" points to tl_scrollback or tl_scrollback_postponed. -! * "update_buffer" is TRUE when the buffer should be updated. - */ -! static void -! limit_scrollback(term_T *term, garray_T *gap, int update_buffer) - { -! if (gap->ga_len >= term->tl_buffer->b_p_twsl) - { - int todo = term->tl_buffer->b_p_twsl / 10; - int i; -*************** -*** 2812,2841 **** - curbuf = term->tl_buffer; - for (i = 0; i < todo; ++i) - { -! vim_free(((sb_line_T *)term->tl_scrollback.ga_data + i)->sb_cells); -! ml_delete(1, FALSE); - } - curbuf = curwin->w_buffer; - -! term->tl_scrollback.ga_len -= todo; -! mch_memmove(term->tl_scrollback.ga_data, -! (sb_line_T *)term->tl_scrollback.ga_data + todo, -! sizeof(sb_line_T) * term->tl_scrollback.ga_len); -! term->tl_scrollback_scrolled -= todo; - } - -! if (ga_grow(&term->tl_scrollback, 1) == OK) - { - cellattr_T *p = NULL; - int len = 0; - int i; - int c; - int col; - sb_line_T *line; - garray_T ga; - cellattr_T fill_attr = term->tl_default_color; - -! /* do not store empty cells at the end */ - for (i = 0; i < cols; ++i) - if (cells[i].chars[0] != 0) - len = i + 1; ---- 2823,2887 ---- - curbuf = term->tl_buffer; - for (i = 0; i < todo; ++i) - { -! vim_free(((sb_line_T *)gap->ga_data + i)->sb_cells); -! if (update_buffer) -! ml_delete(1, FALSE); - } - curbuf = curwin->w_buffer; - -! gap->ga_len -= todo; -! mch_memmove(gap->ga_data, -! (sb_line_T *)gap->ga_data + todo, -! sizeof(sb_line_T) * gap->ga_len); -! if (update_buffer) -! term->tl_scrollback_scrolled -= todo; - } -+ } - -! /* -! * Handle a line that is pushed off the top of the screen. -! */ -! static int -! handle_pushline(int cols, const VTermScreenCell *cells, void *user) -! { -! term_T *term = (term_T *)user; -! garray_T *gap; -! int update_buffer; -! -! if (term->tl_normal_mode) -! { -! // In Terminal-Normal mode the user interacts with the buffer, thus we -! // must not change it. Postpone adding the scrollback lines. -! gap = &term->tl_scrollback_postponed; -! update_buffer = FALSE; -! ch_log(NULL, "handle_pushline(): add to postponed"); -! } -! else -! { -! // First remove the lines that were appended before, the pushed line -! // goes above it. -! cleanup_scrollback(term); -! gap = &term->tl_scrollback; -! update_buffer = TRUE; -! ch_log(NULL, "handle_pushline(): add to window"); -! } -! -! limit_scrollback(term, gap, update_buffer); -! -! if (ga_grow(gap, 1) == OK) - { - cellattr_T *p = NULL; - int len = 0; - int i; - int c; - int col; -+ int text_len; -+ char_u *text; - sb_line_T *line; - garray_T ga; - cellattr_T fill_attr = term->tl_default_color; - -! // do not store empty cells at the end - for (i = 0; i < cols; ++i) - if (cells[i].chars[0] != 0) - len = i + 1; -*************** -*** 2861,2885 **** - } - } - if (ga_grow(&ga, 1) == FAIL) -! add_scrollback_line_to_buffer(term, (char_u *)"", 0); - else - { -! *((char_u *)ga.ga_data + ga.ga_len) = NUL; -! add_scrollback_line_to_buffer(term, ga.ga_data, ga.ga_len); - } -! ga_clear(&ga); - -! line = (sb_line_T *)term->tl_scrollback.ga_data -! + term->tl_scrollback.ga_len; - line->sb_cols = len; - line->sb_cells = p; - line->sb_fill_attr = fill_attr; -! ++term->tl_scrollback.ga_len; -! ++term->tl_scrollback_scrolled; - } - return 0; /* ignored */ - } - - static VTermScreenCallbacks screen_callbacks = { - handle_damage, /* damage */ - handle_moverect, /* moverect */ ---- 2907,2992 ---- - } - } - if (ga_grow(&ga, 1) == FAIL) -! { -! if (update_buffer) -! text = (char_u *)""; -! else -! text = vim_strsave((char_u *)""); -! text_len = 0; -! } - else - { -! text = ga.ga_data; -! text_len = ga.ga_len; -! *(text + text_len) = NUL; - } -! if (update_buffer) -! add_scrollback_line_to_buffer(term, text, text_len); - -! line = (sb_line_T *)gap->ga_data + gap->ga_len; - line->sb_cols = len; - line->sb_cells = p; - line->sb_fill_attr = fill_attr; -! if (update_buffer) -! { -! line->sb_text = NULL; -! ++term->tl_scrollback_scrolled; -! ga_clear(&ga); // free the text -! } -! else -! { -! line->sb_text = text; -! ga_init(&ga); // text is kept in tl_scrollback_postponed -! } -! ++gap->ga_len; - } - return 0; /* ignored */ - } - -+ /* -+ * Called when leaving Terminal-Normal mode: deal with any scrollback that was -+ * received and stored in tl_scrollback_postponed. -+ */ -+ static void -+ handle_postponed_scrollback(term_T *term) -+ { -+ int i; -+ -+ ch_log(NULL, "Moving postponed scrollback to scrollback"); -+ // First remove the lines that were appended before, the pushed lines go -+ // above it. -+ cleanup_scrollback(term); -+ -+ for (i = 0; i < term->tl_scrollback_postponed.ga_len; ++i) -+ { -+ char_u *text; -+ sb_line_T *pp_line; -+ sb_line_T *line; -+ -+ if (ga_grow(&term->tl_scrollback, 1) == FAIL) -+ break; -+ pp_line = (sb_line_T *)term->tl_scrollback_postponed.ga_data + i; -+ -+ text = pp_line->sb_text; -+ if (text == NULL) -+ text = (char_u *)""; -+ add_scrollback_line_to_buffer(term, text, (int)STRLEN(text)); -+ vim_free(pp_line->sb_text); -+ -+ line = (sb_line_T *)term->tl_scrollback.ga_data -+ + term->tl_scrollback.ga_len; -+ line->sb_cols = pp_line->sb_cols; -+ line->sb_cells = pp_line->sb_cells; -+ line->sb_fill_attr = pp_line->sb_fill_attr; -+ line->sb_text = NULL; -+ ++term->tl_scrollback_scrolled; -+ ++term->tl_scrollback.ga_len; -+ } -+ -+ ga_clear(&term->tl_scrollback_postponed); -+ limit_scrollback(term, &term->tl_scrollback, TRUE); -+ } -+ - static VTermScreenCallbacks screen_callbacks = { - handle_damage, /* damage */ - handle_moverect, /* moverect */ -*** ../vim-8.1.0919/src/testdir/test_terminal.vim 2019-02-03 14:52:42.505867463 +0100 ---- src/testdir/test_terminal.vim 2019-02-14 21:14:12.321329398 +0100 -*************** -*** 299,304 **** ---- 299,342 ---- - call term_wait(buf) - exe buf . 'bwipe' - set termwinscroll& -+ call delete('Xtext') -+ endfunc -+ -+ func Test_terminal_postponed_scrollback() -+ if !has('unix') -+ " tail -f only works on Unix -+ return -+ endif -+ -+ call writefile(range(50), 'Xtext') -+ call writefile([ -+ \ 'terminal', -+ \ 'call feedkeys("tail -n 100 -f Xtext\<CR>", "xt")', -+ \ 'sleep 100m', -+ \ 'call feedkeys("\<C-W>N", "xt")', -+ \ ], 'XTest_postponed') -+ let buf = RunVimInTerminal('-S XTest_postponed', {}) -+ " Check that the Xtext lines are displayed and in Terminal-Normal mode -+ call VerifyScreenDump(buf, 'Test_terminal_01', {}) -+ -+ silent !echo 'one more line' >>Xtext -+ " Sceen will not change, move cursor to get a different dump -+ call term_sendkeys(buf, "k") -+ call VerifyScreenDump(buf, 'Test_terminal_02', {}) -+ -+ " Back to Terminal-Job mode, text will scroll and show the extra line. -+ call term_sendkeys(buf, "a") -+ call VerifyScreenDump(buf, 'Test_terminal_03', {}) -+ -+ call term_wait(buf) -+ call term_sendkeys(buf, "\<C-C>") -+ call term_wait(buf) -+ call term_sendkeys(buf, "exit\<CR>") -+ call term_wait(buf) -+ call term_sendkeys(buf, ":q\<CR>") -+ call StopVimInTerminal(buf) -+ call delete('XTest_postponed') -+ call delete('Xtext') - endfunc - - func Test_terminal_size() -*************** -*** 1512,1517 **** ---- 1550,1557 ---- - let job = term_getjob(buf) - call feedkeys("\<C-L>\<C-C>", 'tx') - call WaitForAssert({-> assert_equal("dead", job_status(job))}) -+ -+ set termwinkey& - endfunc - - func Test_terminal_out_err() -*** ../vim-8.1.0919/src/testdir/dumps/Test_terminal_01.dump 2019-02-14 21:20:49.403132067 +0100 ---- src/testdir/dumps/Test_terminal_01.dump 2019-02-14 20:42:57.171827885 +0100 -*************** -*** 0 **** ---- 1,20 ---- -+ |4+0&#ffffff0|2| @72 -+ |4|3| @72 -+ |4@1| @72 -+ |4|5| @72 -+ |4|6| @72 -+ |4|7| @72 -+ |4|8| @72 -+ >4|9| @72 -+ |~+0#4040ff13&| @73 -+ |!+2#ffffff16#00e0003|/|b|i|n|/|t|c|s|h| |[|T|e|r|m|i|n|a|l|]| @35|5|2|,|1| @10|B|o|t -+ | +0#0000000#ffffff0@74 -+ |~+0#4040ff13&| @73 -+ |~| @73 -+ |~| @73 -+ |~| @73 -+ |~| @73 -+ |~| @73 -+ |~| @73 -+ |[+1#0000000&|N|o| |N|a|m|e|]| @47|0|,|0|-|1| @9|A|l@1 -+ | +0&&@74 -*** ../vim-8.1.0919/src/testdir/dumps/Test_terminal_02.dump 2019-02-14 21:20:49.407132044 +0100 ---- src/testdir/dumps/Test_terminal_02.dump 2019-02-14 20:42:58.223822224 +0100 -*************** -*** 0 **** ---- 1,20 ---- -+ |4+0&#ffffff0|2| @72 -+ |4|3| @72 -+ |4@1| @72 -+ |4|5| @72 -+ |4|6| @72 -+ |4|7| @72 -+ >4|8| @72 -+ |4|9| @72 -+ |~+0#4040ff13&| @73 -+ |!+2#ffffff16#00e0003|/|b|i|n|/|t|c|s|h| |[|T|e|r|m|i|n|a|l|]| @35|5|1|,|1| @10|B|o|t -+ | +0#0000000#ffffff0@74 -+ |~+0#4040ff13&| @73 -+ |~| @73 -+ |~| @73 -+ |~| @73 -+ |~| @73 -+ |~| @73 -+ |~| @73 -+ |[+1#0000000&|N|o| |N|a|m|e|]| @47|0|,|0|-|1| @9|A|l@1 -+ | +0&&@74 -*** ../vim-8.1.0919/src/testdir/dumps/Test_terminal_03.dump 2019-02-14 21:20:49.411132020 +0100 ---- src/testdir/dumps/Test_terminal_03.dump 2019-02-14 20:42:59.275816565 +0100 -*************** -*** 0 **** ---- 1,20 ---- -+ |4+0&#ffffff0|3| @72 -+ |4@1| @72 -+ |4|5| @72 -+ |4|6| @72 -+ |4|7| @72 -+ |4|8| @72 -+ |4|9| @72 -+ |o|n|e| |m|o|r|e| |l|i|n|e| @61 -+ > @74 -+ |!+2#ffffff16#00e0003|/|b|i|n|/|t|c|s|h| |[|r|u|n@1|i|n|g|]| @36|4@1|,|1| @10|B|o|t -+ | +0#0000000#ffffff0@74 -+ |~+0#4040ff13&| @73 -+ |~| @73 -+ |~| @73 -+ |~| @73 -+ |~| @73 -+ |~| @73 -+ |~| @73 -+ |[+1#0000000&|N|o| |N|a|m|e|]| @47|0|,|0|-|1| @9|A|l@1 -+ | +0&&@74 -*** ../vim-8.1.0919/src/version.c 2019-02-14 20:55:05.983776869 +0100 ---- src/version.c 2019-02-14 21:18:37.959858765 +0100 -*************** -*** 785,786 **** ---- 785,788 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 920, - /**/ - --- -Looking at Perl through Lisp glasses, Perl looks atrocious. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ an exciting new programming language -- http://www.Zimbu.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |