Patch 8.0.1477
Problem:    Redraw flicker when moving the mouse outside of terminal window.
Solution:   Instead of updating the cursor color and shape every time leaving
            and entering a terminal window, only update when different from
            the previously used cursor.
Files:      src/terminal.c


*** ../vim-8.0.1476/src/terminal.c      2018-01-30 22:31:13.751952708 +0100
--- src/terminal.c      2018-02-08 22:26:42.299566620 +0100
***************
*** 193,198 ****
--- 193,208 ----
  static int term_default_cterm_fg = -1;
  static int term_default_cterm_bg = -1;
  
+ /* Store the last set and the desired cursor properties, so that we only 
update
+  * them when needed.  Doing it unnecessary may result in flicker. */
+ static char_u *last_set_cursor_color = (char_u *)"";
+ static char_u *desired_cursor_color = (char_u *)"";
+ static int    last_set_cursor_shape = -1;
+ static int    desired_cursor_shape = -1;
+ static int    last_set_cursor_blink = -1;
+ static int    desired_cursor_blink = -1;
+ 
+ 
  /**************************************
   * 1. Generic code for all systems.
   */
***************
*** 630,636 ****
      {
        if (term->tl_job->jv_status != JOB_ENDED
                && term->tl_job->jv_status != JOB_FINISHED
!               && term->tl_job->jv_status != JOB_FAILED)
            job_stop(term->tl_job, NULL, "kill");
        job_unref(term->tl_job);
      }
--- 640,646 ----
      {
        if (term->tl_job->jv_status != JOB_ENDED
                && term->tl_job->jv_status != JOB_FINISHED
!               && term->tl_job->jv_status != JOB_FAILED)
            job_stop(term->tl_job, NULL, "kill");
        job_unref(term->tl_job);
      }
***************
*** 642,647 ****
--- 652,659 ----
      vim_free(term->tl_status_text);
      vim_free(term->tl_opencmd);
      vim_free(term->tl_eof_chars);
+     if (desired_cursor_color == term->tl_cursor_color)
+       desired_cursor_color = (char_u *)"";
      vim_free(term->tl_cursor_color);
      vim_free(term);
      buf->b_term = NULL;
***************
*** 1472,1479 ****
  }
  #endif
  
! static int did_change_cursor = FALSE;
  
      static void
  may_set_cursor_props(term_T *term)
  {
--- 1484,1511 ----
  }
  #endif
  
!     static void
! may_output_cursor_props(void)
! {
!     if (STRCMP(last_set_cursor_color, desired_cursor_color) != 0
!           || last_set_cursor_shape != desired_cursor_shape
!           || last_set_cursor_blink != desired_cursor_blink)
!     {
!       last_set_cursor_color = desired_cursor_color;
!       last_set_cursor_shape = desired_cursor_shape;
!       last_set_cursor_blink = desired_cursor_blink;
!       term_cursor_color(desired_cursor_color);
!       if (desired_cursor_shape == -1 || desired_cursor_blink == -1)
!           /* this will restore the initial cursor style, if possible */
!           ui_cursor_shape_forced(TRUE);
!       else
!           term_cursor_shape(desired_cursor_shape, desired_cursor_blink);
!     }
! }
  
+ /*
+  * Set the cursor color and shape, if not last set to these.
+  */
      static void
  may_set_cursor_props(term_T *term)
  {
***************
*** 1485,1513 ****
  #endif
      if (in_terminal_loop == term)
      {
-       did_change_cursor = TRUE;
        if (term->tl_cursor_color != NULL)
!           term_cursor_color(term->tl_cursor_color);
        else
!           term_cursor_color((char_u *)"");
!       term_cursor_shape(term->tl_cursor_shape, term->tl_cursor_blink);
      }
  }
  
      static void
! may_restore_cursor_props(void)
  {
  #ifdef FEAT_GUI
      if (gui.in_use)
        return;
  #endif
!     if (did_change_cursor)
!     {
!       did_change_cursor = FALSE;
!       term_cursor_color((char_u *)"");
!       /* this will restore the initial cursor style, if possible */
!       ui_cursor_shape_forced(TRUE);
!     }
  }
  
  /*
--- 1517,1546 ----
  #endif
      if (in_terminal_loop == term)
      {
        if (term->tl_cursor_color != NULL)
!           desired_cursor_color = term->tl_cursor_color;
        else
!           desired_cursor_color = (char_u *)"";
!       desired_cursor_shape = term->tl_cursor_shape;
!       desired_cursor_blink = term->tl_cursor_blink;
!       may_output_cursor_props();
      }
  }
  
+ /*
+  * Reset the desired cursor properties and restore them when needed.
+  */
      static void
! prepare_restore_cursor_props(void)
  {
  #ifdef FEAT_GUI
      if (gui.in_use)
        return;
  #endif
!     desired_cursor_color = (char_u *)"";
!     desired_cursor_shape = -1;
!     desired_cursor_blink = -1;
!     may_output_cursor_props();
  }
  
  /*
***************
*** 1544,1549 ****
--- 1577,1583 ----
      int               tty_fd = curbuf->b_term->tl_job->jv_channel
                                 ->ch_part[get_tty_part(curbuf->b_term)].ch_fd;
  #endif
+     int               restore_cursor;
  
      /* Remember the terminal we are sending keys to.  However, the terminal
       * might be closed while waiting for a character, e.g. typing "exit" in a
***************
*** 1564,1569 ****
--- 1598,1604 ----
            if (update_screen(0) == FAIL)
                break;
        update_cursor(curbuf->b_term, FALSE);
+       restore_cursor = TRUE;
  
        c = term_vgetc();
        if (!term_use_loop())
***************
*** 1672,1677 ****
--- 1707,1717 ----
  # endif
        if (send_keys_to_term(curbuf->b_term, c, TRUE) != OK)
        {
+           if (c == K_MOUSEMOVE)
+               /* We are sure to come back here, don't reset the cursor color
+                * and shape to avoid flickering. */
+               restore_cursor = FALSE;
+ 
            ret = OK;
            goto theend;
        }
***************
*** 1680,1686 ****
  
  theend:
      in_terminal_loop = NULL;
!     may_restore_cursor_props();
      return ret;
  }
  
--- 1720,1727 ----
  
  theend:
      in_terminal_loop = NULL;
!     if (restore_cursor)
!       prepare_restore_cursor_props();
      return ret;
  }
  
***************
*** 2005,2010 ****
--- 2046,2053 ----
            break;
  
        case VTERM_PROP_CURSORCOLOR:
+           if (desired_cursor_color == term->tl_cursor_color)
+               desired_cursor_color = (char_u *)"";
            vim_free(term->tl_cursor_color);
            if (*value->string == NUL)
                term->tl_cursor_color = NULL;
***************
*** 3292,3298 ****
  
  #define WINPTY_SPAWN_FLAG_AUTO_SHUTDOWN 1ul
  #define WINPTY_SPAWN_FLAG_EXIT_AFTER_SHUTDOWN 2ull
! #define WINPTY_MOUSE_MODE_FORCE         2
  
  void* (*winpty_config_new)(UINT64, void*);
  void* (*winpty_open)(void*, void*);
--- 3335,3341 ----
  
  #define WINPTY_SPAWN_FLAG_AUTO_SHUTDOWN 1ul
  #define WINPTY_SPAWN_FLAG_EXIT_AFTER_SHUTDOWN 2ull
! #define WINPTY_MOUSE_MODE_FORCE               2
  
  void* (*winpty_config_new)(UINT64, void*);
  void* (*winpty_open)(void*, void*);
*** ../vim-8.0.1476/src/version.c       2018-02-08 09:57:23.803488891 +0100
--- src/version.c       2018-02-08 22:02:55.921932878 +0100
***************
*** 773,774 ****
--- 773,776 ----
  {   /* Add new patch number below this line */
+ /**/
+     1477,
  /**/

-- 
        **  Hello and Welcome to the Psychiatric Hotline **
If you are obsessive-compulsive, please press 1 repeatedly.
If you are co-dependent, please ask someone to press 2.
If you have multiple personalities, please press 3, 4, 5 and 6.
If you are paranoid-delusional, we know who you are and what you want
       - just stay on the line so we can trace the call.
If you are schizophrenic, listen carefully and a little voice will
       tell you which number to press next.
If you are manic-depressive, it doesn't matter which number you press
       - no one will answer.
If you suffer from panic attacks, push every button you can find.
If you are sane, please hold on - we have the rest of humanity on the
        other line and they desparately want to ask you a few questions.

 /// Bram Moolenaar -- [email protected] -- 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    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui