Mercurial > vim
changeset 11786:98154b91e43a v8.0.0775
patch 8.0.0775: in a terminal the cursor is updated too often
commit https://github.com/vim/vim/commit/fc716d725613c3b5934e7eac6573adde8e4f8183
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Jul 25 23:08:47 2017 +0200
patch 8.0.0775: in a terminal the cursor is updated too often
Problem: In a terminal the cursor is updated too often.
Solution: Only flush when needed. (Yasuhiro Matsumoto). Remeber whether the
cursor is visible. (closes #1873)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 25 Jul 2017 23:15:03 +0200 |
parents | e22f9669e392 |
children | c3c09047d106 |
files | src/terminal.c src/version.c |
diffstat | 2 files changed, 46 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/src/terminal.c +++ b/src/terminal.c @@ -106,6 +106,7 @@ struct terminal_S { int tl_dirty_row_end; /* row below last one to update */ pos_T tl_cursor; + int tl_cursor_visible; }; /* @@ -176,6 +177,7 @@ ex_terminal(exarg_T *eap) if (term == NULL) return; term->tl_dirty_row_end = MAX_ROW; + term->tl_cursor_visible = TRUE; /* Open a new window or tab. */ vim_memset(&split_ea, 0, sizeof(split_ea)); @@ -316,15 +318,18 @@ term_write_job_output(term_T *term, char } static void -update_cursor() +update_cursor(term_T *term, int redraw) { /* TODO: this should not always be needed */ setcursor(); - out_flush(); + if (redraw && term->tl_buffer == curbuf && term->tl_cursor_visible) + { + out_flush(); #ifdef FEAT_GUI - if (gui.in_use) - gui_update_cursor(FALSE, FALSE); + if (gui.in_use) + gui_update_cursor(FALSE, FALSE); #endif + } } /* @@ -342,7 +347,7 @@ write_to_term(buf_T *buffer, char_u *msg /* TODO: only update once in a while. */ update_screen(0); - update_cursor(); + update_cursor(term, TRUE); } /* @@ -473,7 +478,7 @@ terminal_loop(void) { /* TODO: skip screen update when handling a sequence of keys. */ update_screen(0); - update_cursor(); + update_cursor(curbuf->b_term, FALSE); ++no_mapping; ++allow_keys; got_int = FALSE; @@ -559,12 +564,13 @@ term_job_ended(job_T *job) did_one = TRUE; } if (did_one) + redraw_statuslines(); + if (curbuf->b_term != NULL) { - redraw_statuslines(); - update_cursor(); + if (curbuf->b_term->tl_job == job) + maketitle(); + update_cursor(curbuf->b_term, TRUE); } - if (curbuf->b_term != NULL && curbuf->b_term->tl_job == job) - maketitle(); } /* @@ -583,6 +589,18 @@ position_cursor(win_T *wp, VTermPos *pos wp->w_wcol = MIN(pos->col, MAX(0, wp->w_width - 1)); } + static void +may_toggle_cursor(term_T *term) +{ + if (curbuf == term->tl_buffer) + { + if (term->tl_cursor_visible) + cursor_on(); + else + cursor_off(); + } +} + static int handle_damage(VTermRect rect, void *user) { @@ -608,7 +626,7 @@ handle_moverect(VTermRect dest UNUSED, V handle_movecursor( VTermPos pos, VTermPos oldpos UNUSED, - int visible UNUSED, + int visible, void *user) { term_T *term = (term_T *)user; @@ -625,8 +643,12 @@ handle_movecursor( } } + term->tl_cursor_visible = visible; if (is_current) - update_cursor(); + { + may_toggle_cursor(term); + update_cursor(term, TRUE); + } return 1; } @@ -648,11 +670,19 @@ handle_settermprop( term->tl_status_text = NULL; if (term == curbuf->b_term) maketitle(); - return 1; + break; + + case VTERM_PROP_CURSORVISIBLE: + term->tl_cursor_visible = value->boolean; + may_toggle_cursor(term); + out_flush(); + break; + default: break; } - return 0; + /* Always return 1, otherwise vterm doesn't store the value internally. */ + return 1; } /*