Skip to content

Commit

Permalink
patch 8.0.0775: in a terminal the cursor is updated too often
Browse files Browse the repository at this point in the history
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)
  • Loading branch information
brammool committed Jul 25, 2017
1 parent 8f14bb5 commit fc716d7
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 14 deletions.
58 changes: 44 additions & 14 deletions src/terminal.c
Expand Up @@ -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;
};

/*
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -316,15 +318,18 @@ term_write_job_output(term_T *term, char_u *msg, size_t len)
}

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

/*
Expand All @@ -342,7 +347,7 @@ write_to_term(buf_T *buffer, char_u *msg, channel_T *channel)

/* TODO: only update once in a while. */
update_screen(0);
update_cursor();
update_cursor(term, TRUE);
}

/*
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -559,12 +564,13 @@ term_job_ended(job_T *job)
did_one = TRUE;
}
if (did_one)
{
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();
}

/*
Expand All @@ -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)
{
Expand All @@ -608,7 +626,7 @@ handle_moverect(VTermRect dest UNUSED, VTermRect src UNUSED, void *user)
handle_movecursor(
VTermPos pos,
VTermPos oldpos UNUSED,
int visible UNUSED,
int visible,
void *user)
{
term_T *term = (term_T *)user;
Expand All @@ -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;
}
Expand All @@ -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;
}

/*
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -769,6 +769,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
775,
/**/
774,
/**/
Expand Down

0 comments on commit fc716d7

Please sign in to comment.