0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

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)
This commit is contained in:
Bram Moolenaar
2017-07-25 23:08:47 +02:00
parent 8f14bb58cb
commit fc716d7256
2 changed files with 46 additions and 14 deletions

View File

@@ -106,6 +106,7 @@ struct terminal_S {
int tl_dirty_row_end; /* row below last one to update */ int tl_dirty_row_end; /* row below last one to update */
pos_T tl_cursor; pos_T tl_cursor;
int tl_cursor_visible;
}; };
/* /*
@@ -176,6 +177,7 @@ ex_terminal(exarg_T *eap)
if (term == NULL) if (term == NULL)
return; return;
term->tl_dirty_row_end = MAX_ROW; term->tl_dirty_row_end = MAX_ROW;
term->tl_cursor_visible = TRUE;
/* Open a new window or tab. */ /* Open a new window or tab. */
vim_memset(&split_ea, 0, sizeof(split_ea)); vim_memset(&split_ea, 0, sizeof(split_ea));
@@ -316,15 +318,18 @@ term_write_job_output(term_T *term, char_u *msg, size_t len)
} }
static void static void
update_cursor() update_cursor(term_T *term, int redraw)
{ {
/* TODO: this should not always be needed */ /* TODO: this should not always be needed */
setcursor(); setcursor();
out_flush(); if (redraw && term->tl_buffer == curbuf && term->tl_cursor_visible)
{
out_flush();
#ifdef FEAT_GUI #ifdef FEAT_GUI
if (gui.in_use) if (gui.in_use)
gui_update_cursor(FALSE, FALSE); gui_update_cursor(FALSE, FALSE);
#endif #endif
}
} }
/* /*
@@ -342,7 +347,7 @@ write_to_term(buf_T *buffer, char_u *msg, channel_T *channel)
/* TODO: only update once in a while. */ /* TODO: only update once in a while. */
update_screen(0); 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. */ /* TODO: skip screen update when handling a sequence of keys. */
update_screen(0); update_screen(0);
update_cursor(); update_cursor(curbuf->b_term, FALSE);
++no_mapping; ++no_mapping;
++allow_keys; ++allow_keys;
got_int = FALSE; got_int = FALSE;
@@ -559,12 +564,13 @@ term_job_ended(job_T *job)
did_one = TRUE; did_one = TRUE;
} }
if (did_one) if (did_one)
{
redraw_statuslines(); redraw_statuslines();
update_cursor(); if (curbuf->b_term != NULL)
{
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)); 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 static int
handle_damage(VTermRect rect, void *user) handle_damage(VTermRect rect, void *user)
{ {
@@ -608,7 +626,7 @@ handle_moverect(VTermRect dest UNUSED, VTermRect src UNUSED, void *user)
handle_movecursor( handle_movecursor(
VTermPos pos, VTermPos pos,
VTermPos oldpos UNUSED, VTermPos oldpos UNUSED,
int visible UNUSED, int visible,
void *user) void *user)
{ {
term_T *term = (term_T *)user; term_T *term = (term_T *)user;
@@ -625,8 +643,12 @@ handle_movecursor(
} }
} }
term->tl_cursor_visible = visible;
if (is_current) if (is_current)
update_cursor(); {
may_toggle_cursor(term);
update_cursor(term, TRUE);
}
return 1; return 1;
} }
@@ -648,11 +670,19 @@ handle_settermprop(
term->tl_status_text = NULL; term->tl_status_text = NULL;
if (term == curbuf->b_term) if (term == curbuf->b_term)
maketitle(); maketitle();
return 1; break;
case VTERM_PROP_CURSORVISIBLE:
term->tl_cursor_visible = value->boolean;
may_toggle_cursor(term);
out_flush();
break;
default: default:
break; break;
} }
return 0; /* Always return 1, otherwise vterm doesn't store the value internally. */
return 1;
} }
/* /*

View File

@@ -769,6 +769,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 */
/**/
775,
/**/ /**/
774, 774,
/**/ /**/