]> granicus.if.org Git - vim/commitdiff
patch 8.2.2064: terminal: cursor is on while redrawing, causing flicker v8.2.2064
authorBram Moolenaar <Bram@vim.org>
Sat, 28 Nov 2020 19:22:06 +0000 (20:22 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 28 Nov 2020 19:22:06 +0000 (20:22 +0100)
Problem:    terminal: cursor is on while redrawing, causing flicker.
Solution:   Switch the cursor off while redrawing.  Always add the top and
            left offset to the cursor position when not done already.
            (closes #5943)

src/popupwin.c
src/terminal.c
src/version.c

index 61f447ded2818e7f79d881ba61b5eb39e3aa982a..cfd2050d3a4015c3565fd1cd5523bf657bfab93d 100644 (file)
@@ -3699,6 +3699,9 @@ update_popups(void (*win_update)(win_T *wp))
     int            attr_scroll = 0;
     int            attr_thumb = 0;
 
+    // hide the cursor until redrawing is done.
+    cursor_off();
+
     // Find the window with the lowest zindex that hasn't been updated yet,
     // so that the window with a higher zindex is drawn later, thus goes on
     // top.
index 32e52ee440ff4328a43c4e1e265ece911d5a0b7d..644cddab72c34820c58aa847ed765191bd0f28d7 100644 (file)
@@ -1202,6 +1202,7 @@ write_to_term(buf_T *buffer, char_u *msg, channel_T *channel)
        return;
     }
     ch_log(channel, "writing %d bytes to terminal", (int)len);
+    cursor_off();
     term_write_job_output(term, msg, len);
 
 #ifdef FEAT_GUI
@@ -2199,15 +2200,17 @@ send_keys_to_term(term_T *term, int c, int modmask, int typed)
 }
 
     static void
-position_cursor(win_T *wp, VTermPos *pos, int add_off UNUSED)
+position_cursor(win_T *wp, VTermPos *pos)
 {
     wp->w_wrow = MIN(pos->row, MAX(0, wp->w_height - 1));
     wp->w_wcol = MIN(pos->col, MAX(0, wp->w_width - 1));
 #ifdef FEAT_PROP_POPUP
-    if (add_off && popup_is_popup(curwin))
+    if (popup_is_popup(wp))
     {
-       wp->w_wrow += popup_top_extra(curwin);
-       wp->w_wcol += popup_left_extra(curwin);
+       if ((wp->w_flags & WFLAG_WROW_OFF_ADDED) == 0)
+           wp->w_wrow += popup_top_extra(wp);
+       if ((wp->w_flags & WFLAG_WCOL_OFF_ADDED) == 0)
+           wp->w_wcol += popup_left_extra(wp);
        wp->w_flags |= WFLAG_WCOL_OFF_ADDED | WFLAG_WROW_OFF_ADDED;
     }
     else
@@ -2524,7 +2527,7 @@ terminal_loop(int blocking)
        if (termwinkey == Ctrl_W)
            termwinkey = 0;
     }
-    position_cursor(curwin, &curbuf->b_term->tl_cursor_pos, TRUE);
+    position_cursor(curwin, &curbuf->b_term->tl_cursor_pos);
     may_set_cursor_props(curbuf->b_term);
 
     while (blocking || vpeekc_nomap() != NUL)
@@ -3059,13 +3062,10 @@ handle_movecursor(
     while (for_all_windows_and_curwin(&wp, &did_curwin))
     {
        if (wp->w_buffer == term->tl_buffer)
-           position_cursor(wp, &pos, FALSE);
+           position_cursor(wp, &pos);
     }
     if (term->tl_buffer == curbuf && !term->tl_normal_mode)
-    {
-       may_toggle_cursor(term);
        update_cursor(term, term->tl_cursor_visible);
-    }
 
     return 1;
 }
@@ -3818,7 +3818,7 @@ term_update_window(win_T *wp)
 
     // The cursor may have been moved when resizing.
     vterm_state_get_cursorpos(state, &pos);
-    position_cursor(wp, &pos, FALSE);
+    position_cursor(wp, &pos);
 
     for (pos.row = term->tl_dirty_row_start; pos.row < term->tl_dirty_row_end
                                          && pos.row < wp->w_height; ++pos.row)
index 4165d97d9c637a0e0d464ed80e32871c65ed4eb3..ec0fabc3ee2b1c4cb03d74b798c6844401865004 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2064,
 /**/
     2063,
 /**/