Patch 8.1.1315
Problem:    There is always a delay if a termrequest is never answered.
Solution:   When the response is not received within two seconds consider the
            request to have failed.
Files:      src/term.c


*** ../vim-8.1.1314/src/term.c  2019-05-08 16:40:57.753592725 +0200
--- src/term.c  2019-05-10 23:05:59.609307792 +0200
***************
*** 110,128 ****
  #   define LOG_TR(msg) do { /**/ } while (0)
  #  endif
  
! #  define STATUS_GET  1       /* send request when switching to RAW mode */
! #  define STATUS_SENT 2       /* did send request, waiting for response */
! #  define STATUS_GOT  3       /* received response */
  
! /* Request Terminal Version status: */
! static int crv_status = STATUS_GET;
  
! /* Request Cursor position report: */
! static int u7_status = STATUS_GET;
  
  #  ifdef FEAT_TERMINAL
! /* Request foreground color report: */
! static int rfg_status = STATUS_GET;
  static int fg_r = 0;
  static int fg_g = 0;
  static int fg_b = 0;
--- 110,138 ----
  #   define LOG_TR(msg) do { /**/ } while (0)
  #  endif
  
! typedef enum {
!     STATUS_GET,               // send request when switching to RAW mode
!     STATUS_SENT,      // did send request, checking for response
!     STATUS_GOT,               // received response
!     STATUS_FAIL               // timed out
! } request_progress_T;
! 
! typedef struct {
!     request_progress_T            tr_progress;
!     time_t                tr_start;   // when request was sent, -1 for never
! } termrequest_T;
  
! #  define TERMREQUEST_INIT {STATUS_GET, -1}
  
! // Request Terminal Version status:
! static termrequest_T crv_status = TERMREQUEST_INIT;
! 
! // Request Cursor position report:
! static termrequest_T u7_status = TERMREQUEST_INIT;
  
  #  ifdef FEAT_TERMINAL
! // Request foreground color report:
! static termrequest_T rfg_status = TERMREQUEST_INIT;
  static int fg_r = 0;
  static int fg_g = 0;
  static int fg_b = 0;
***************
*** 132,147 ****
  #  endif
  
  /* Request background color report: */
! static int rbg_status = STATUS_GET;
  
  /* Request cursor blinking mode report: */
! static int rbm_status = STATUS_GET;
  
  /* Request cursor style report: */
! static int rcs_status = STATUS_GET;
  
  /* Request windos position report: */
! static int winpos_status = STATUS_GET;
  # endif
  
  /*
--- 142,170 ----
  #  endif
  
  /* Request background color report: */
! static termrequest_T rbg_status = TERMREQUEST_INIT;
  
  /* Request cursor blinking mode report: */
! static termrequest_T rbm_status = TERMREQUEST_INIT;
  
  /* Request cursor style report: */
! static termrequest_T rcs_status = TERMREQUEST_INIT;
  
  /* Request windos position report: */
! static termrequest_T winpos_status = TERMREQUEST_INIT;
! 
! static termrequest_T *all_termrequests[] = {
!     &crv_status,
!     &u7_status,
! #  ifdef FEAT_TERMINAL
!     &rfg_status,
! #  endif
!     &rbg_status,
!     &rbm_status,
!     &rcs_status,
!     &winpos_status,
!     NULL
! };
  # endif
  
  /*
***************
*** 2011,2017 ****
      set_term_defaults();      /* use current values as defaults */
  #ifdef FEAT_TERMRESPONSE
      LOG_TR(("setting crv_status to STATUS_GET"));
!     crv_status = STATUS_GET;  /* Get terminal version later */
  #endif
  
      /*
--- 2034,2040 ----
      set_term_defaults();      /* use current values as defaults */
  #ifdef FEAT_TERMRESPONSE
      LOG_TR(("setting crv_status to STATUS_GET"));
!     crv_status.tr_progress = STATUS_GET;      // Get terminal version later
  #endif
  
      /*
***************
*** 2833,2844 ****
  {
      return cur_tmode == TMODE_RAW
            && termcap_active
! # ifdef UNIX
            && (is_not_a_term() || (isatty(1) && isatty(read_cmd_fd)))
! # endif
            && p_ek;
  }
  
  static int winpos_x = -1;
  static int winpos_y = -1;
  static int did_request_winpos = 0;
--- 2856,2902 ----
  {
      return cur_tmode == TMODE_RAW
            && termcap_active
! #  ifdef UNIX
            && (is_not_a_term() || (isatty(1) && isatty(read_cmd_fd)))
! #  endif
            && p_ek;
  }
  
+ /*
+  * Set "status" to STATUS_SENT.
+  */
+     static void
+ termrequest_sent(termrequest_T *status)
+ {
+     status->tr_progress = STATUS_SENT;
+     status->tr_start = time(NULL);
+ }
+ 
+ /*
+  * Return TRUE if any of the requests are in STATUS_SENT.
+  */
+     static int
+ termrequest_any_pending()
+ {
+     int           i;
+     time_t  now = time(NULL);
+ 
+     for (i = 0; all_termrequests[i] != NULL; ++i)
+     {
+       if (all_termrequests[i]->tr_progress == STATUS_SENT)
+       {
+           if (all_termrequests[i]->tr_start > 0 && now > 0
+                                   && all_termrequests[i]->tr_start + 2 < now)
+               // Sent the request more than 2 seconds ago and didn't get a
+               // response, assume it failed.
+               all_termrequests[i]->tr_progress = STATUS_FAIL;
+           else
+               return TRUE;
+       }
+     }
+     return FALSE;
+ }
+ 
  static int winpos_x = -1;
  static int winpos_y = -1;
  static int did_request_winpos = 0;
***************
*** 2860,2866 ****
      winpos_x = -1;
      winpos_y = -1;
      ++did_request_winpos;
!     winpos_status = STATUS_SENT;
      OUT_STR(T_CGP);
      out_flush();
  
--- 2918,2924 ----
      winpos_x = -1;
      winpos_y = -1;
      ++did_request_winpos;
!     termrequest_sent(&winpos_status);
      OUT_STR(T_CGP);
      out_flush();
  
***************
*** 3478,3495 ****
            if (!gui.in_use && !gui.starting)
  # endif
            {
!               /* May need to check for T_CRV response and termcodes, it
!                * doesn't work in Cooked mode, an external program may get
!                * them. */
!               if (tmode != TMODE_RAW && (crv_status == STATUS_SENT
!                                        || u7_status == STATUS_SENT
! #ifdef FEAT_TERMINAL
!                                        || rfg_status == STATUS_SENT
! #endif
!                                        || rbg_status == STATUS_SENT
!                                        || rbm_status == STATUS_SENT
!                                        || rcs_status == STATUS_SENT
!                                        || winpos_status == STATUS_SENT))
                    (void)vpeekc_nomap();
                check_for_codes_from_term();
            }
--- 3536,3545 ----
            if (!gui.in_use && !gui.starting)
  # endif
            {
!               // May need to check for T_CRV response and termcodes, it
!               // doesn't work in Cooked mode, an external program may get
!               // them.
!               if (tmode != TMODE_RAW && termrequest_any_pending())
                    (void)vpeekc_nomap();
                check_for_codes_from_term();
            }
***************
*** 3540,3546 ****
            may_req_termresponse();
            /* Immediately check for a response.  If t_Co changes, we don't
             * want to redraw with wrong colors first. */
!           if (crv_status == STATUS_SENT)
                check_for_codes_from_term();
        }
  #endif
--- 3590,3596 ----
            may_req_termresponse();
            /* Immediately check for a response.  If t_Co changes, we don't
             * want to redraw with wrong colors first. */
!           if (crv_status.tr_progress == STATUS_SENT)
                check_for_codes_from_term();
        }
  #endif
***************
*** 3559,3581 ****
        if (!gui.in_use && !gui.starting)
  # endif
        {
!           /* May need to discard T_CRV, T_U7 or T_RBG response. */
!           if (crv_status == STATUS_SENT
!                   || u7_status == STATUS_SENT
! # ifdef FEAT_TERMINAL
!                   || rfg_status == STATUS_SENT
! # endif
!                   || rbg_status == STATUS_SENT
!                   || rbm_status == STATUS_SENT
!                   || rcs_status == STATUS_SENT
!                   || winpos_status == STATUS_SENT)
            {
  # ifdef UNIX
!               /* Give the terminal a chance to respond. */
                mch_delay(100L, FALSE);
  # endif
  # ifdef TCIFLUSH
!               /* Discard data received but not read. */
                if (exiting)
                    tcflush(fileno(stdin), TCIFLUSH);
  # endif
--- 3609,3623 ----
        if (!gui.in_use && !gui.starting)
  # endif
        {
!           // May need to discard T_CRV, T_U7 or T_RBG response.
!           if (termrequest_any_pending())
            {
  # ifdef UNIX
!               // Give the terminal a chance to respond.
                mch_delay(100L, FALSE);
  # endif
  # ifdef TCIFLUSH
!               // Discard data received but not read.
                if (exiting)
                    tcflush(fileno(stdin), TCIFLUSH);
  # endif
***************
*** 3614,3627 ****
      void
  may_req_termresponse(void)
  {
!     if (crv_status == STATUS_GET
            && can_get_termresponse()
            && starting == 0
            && *T_CRV != NUL)
      {
        LOG_TR(("Sending CRV request"));
        out_str(T_CRV);
!       crv_status = STATUS_SENT;
        /* check for the characters now, otherwise they might be eaten by
         * get_keystroke() */
        out_flush();
--- 3656,3669 ----
      void
  may_req_termresponse(void)
  {
!     if (crv_status.tr_progress == STATUS_GET
            && can_get_termresponse()
            && starting == 0
            && *T_CRV != NUL)
      {
        LOG_TR(("Sending CRV request"));
        out_str(T_CRV);
!       termrequest_sent(&crv_status);
        /* check for the characters now, otherwise they might be eaten by
         * get_keystroke() */
        out_flush();
***************
*** 3641,3677 ****
      void
  may_req_ambiguous_char_width(void)
  {
!     if (u7_status == STATUS_GET
            && can_get_termresponse()
            && starting == 0
            && *T_U7 != NUL
            && !option_was_set((char_u *)"ambiwidth"))
      {
!        char_u buf[16];
  
!        LOG_TR(("Sending U7 request"));
!        /* Do this in the second row.  In the first row the returned sequence
!         * may be CSI 1;2R, which is the same as <S-F3>. */
!        term_windgoto(1, 0);
!        buf[mb_char2bytes(0x25bd, buf)] = 0;
!        out_str(buf);
!        out_str(T_U7);
!        u7_status = STATUS_SENT;
!        out_flush();
! 
!        /* This overwrites a few characters on the screen, a redraw is needed
!         * after this. Clear them out for now. */
!        term_windgoto(1, 0);
!        out_str((char_u *)"  ");
!        term_windgoto(0, 0);
! 
!        /* Need to reset the known cursor position. */
!        screen_start();
! 
!        /* check for the characters now, otherwise they might be eaten by
!         * get_keystroke() */
!        out_flush();
!        (void)vpeekc_nomap();
      }
  }
  
--- 3683,3719 ----
      void
  may_req_ambiguous_char_width(void)
  {
!     if (u7_status.tr_progress == STATUS_GET
            && can_get_termresponse()
            && starting == 0
            && *T_U7 != NUL
            && !option_was_set((char_u *)"ambiwidth"))
      {
!       char_u  buf[16];
! 
!       LOG_TR(("Sending U7 request"));
!       /* Do this in the second row.  In the first row the returned sequence
!        * may be CSI 1;2R, which is the same as <S-F3>. */
!       term_windgoto(1, 0);
!       buf[mb_char2bytes(0x25bd, buf)] = 0;
!       out_str(buf);
!       out_str(T_U7);
!       termrequest_sent(&u7_status);
!       out_flush();
! 
!       /* This overwrites a few characters on the screen, a redraw is needed
!        * after this. Clear them out for now. */
!       term_windgoto(1, 0);
!       out_str((char_u *)"  ");
!       term_windgoto(0, 0);
! 
!       /* Need to reset the known cursor position. */
!       screen_start();
  
!       /* check for the characters now, otherwise they might be eaten by
!        * get_keystroke() */
!       out_flush();
!       (void)vpeekc_nomap();
      }
  }
  
***************
*** 3688,3708 ****
  
  # ifdef FEAT_TERMINAL
        /* Only request foreground if t_RF is set. */
!       if (rfg_status == STATUS_GET && *T_RFG != NUL)
        {
            LOG_TR(("Sending FG request"));
            out_str(T_RFG);
!           rfg_status = STATUS_SENT;
            didit = TRUE;
        }
  # endif
  
        /* Only request background if t_RB is set. */
!       if (rbg_status == STATUS_GET && *T_RBG != NUL)
        {
            LOG_TR(("Sending BG request"));
            out_str(T_RBG);
!           rbg_status = STATUS_SENT;
            didit = TRUE;
        }
  
--- 3730,3750 ----
  
  # ifdef FEAT_TERMINAL
        /* Only request foreground if t_RF is set. */
!       if (rfg_status.tr_progress == STATUS_GET && *T_RFG != NUL)
        {
            LOG_TR(("Sending FG request"));
            out_str(T_RFG);
!           termrequest_sent(&rfg_status);
            didit = TRUE;
        }
  # endif
  
        /* Only request background if t_RB is set. */
!       if (rbg_status.tr_progress == STATUS_GET && *T_RBG != NUL)
        {
            LOG_TR(("Sending BG request"));
            out_str(T_RBG);
!           termrequest_sent(&rbg_status);
            didit = TRUE;
        }
  
***************
*** 3962,3968 ****
  blink_state_is_inverted()
  {
  #ifdef FEAT_TERMRESPONSE
!     return rbm_status == STATUS_GOT && rcs_status == STATUS_GOT
                && initial_cursor_blink != initial_cursor_shape_blink;
  #else
      return FALSE;
--- 4004,4010 ----
  blink_state_is_inverted()
  {
  #ifdef FEAT_TERMRESPONSE
!     return rbm_status.tr_progress == STATUS_GOT && rcs_status.tr_progress == 
STATUS_GOT
                && initial_cursor_blink != initial_cursor_shape_blink;
  #else
      return FALSE;
***************
*** 4651,4657 ****
                        char *aw = NULL;
  
                        LOG_TR(("Received U7 status: %s", tp));
!                       u7_status = STATUS_GOT;
                        did_cursorhold = TRUE;
                        if (col == 2)
                            aw = "single";
--- 4693,4699 ----
                        char *aw = NULL;
  
                        LOG_TR(("Received U7 status: %s", tp));
!                       u7_status.tr_progress = STATUS_GOT;
                        did_cursorhold = TRUE;
                        if (col == 2)
                            aw = "single";
***************
*** 4689,4695 ****
                    int version = col;
  
                    LOG_TR(("Received CRV response: %s", tp));
!                   crv_status = STATUS_GOT;
                    did_cursorhold = TRUE;
  
                    /* If this code starts with CSI, you can bet that the
--- 4731,4737 ----
                    int version = col;
  
                    LOG_TR(("Received CRV response: %s", tp));
!                   crv_status.tr_progress = STATUS_GOT;
                    did_cursorhold = TRUE;
  
                    /* If this code starts with CSI, you can bet that the
***************
*** 4804,4810 ****
                         * 279 (otherwise it returns 0x18).
                         * Not for Terminal.app, it can't handle t_RS, it
                         * echoes the characters to the screen. */
!                       if (rcs_status == STATUS_GET
                                && version >= 279
                                && !is_not_xterm
                                && *T_CSH != NUL
--- 4846,4852 ----
                         * 279 (otherwise it returns 0x18).
                         * Not for Terminal.app, it can't handle t_RS, it
                         * echoes the characters to the screen. */
!                       if (rcs_status.tr_progress == STATUS_GET
                                && version >= 279
                                && !is_not_xterm
                                && *T_CSH != NUL
***************
*** 4812,4831 ****
                        {
                            LOG_TR(("Sending cursor style request"));
                            out_str(T_CRS);
!                           rcs_status = STATUS_SENT;
                            need_flush = TRUE;
                        }
  
                        /* Only request the cursor blink mode if t_RC set. Not
                         * for Gnome terminal, it can't handle t_RC, it
                         * echoes the characters to the screen. */
!                       if (rbm_status == STATUS_GET
                                && !is_not_xterm
                                && *T_CRC != NUL)
                        {
                            LOG_TR(("Sending cursor blink mode request"));
                            out_str(T_CRC);
!                           rbm_status = STATUS_SENT;
                            need_flush = TRUE;
                        }
  
--- 4854,4873 ----
                        {
                            LOG_TR(("Sending cursor style request"));
                            out_str(T_CRS);
!                           termrequest_sent(&rcs_status);
                            need_flush = TRUE;
                        }
  
                        /* Only request the cursor blink mode if t_RC set. Not
                         * for Gnome terminal, it can't handle t_RC, it
                         * echoes the characters to the screen. */
!                       if (rbm_status.tr_progress == STATUS_GET
                                && !is_not_xterm
                                && *T_CRC != NUL)
                        {
                            LOG_TR(("Sending cursor blink mode request"));
                            out_str(T_CRC);
!                           termrequest_sent(&rbm_status);
                            need_flush = TRUE;
                        }
  
***************
*** 4848,4854 ****
                 *
                 * {lead} can be <Esc>[ or CSI
                 */
!               else if (rbm_status == STATUS_SENT
                        && tp[(j = 1 + (tp[0] == ESC))] == '?'
                        && i == j + 6
                        && tp[j + 1] == '1'
--- 4890,4896 ----
                 *
                 * {lead} can be <Esc>[ or CSI
                 */
!               else if (rbm_status.tr_progress == STATUS_SENT
                        && tp[(j = 1 + (tp[0] == ESC))] == '?'
                        && i == j + 6
                        && tp[j + 1] == '1'
***************
*** 4858,4864 ****
                        && tp[i] == 'y')
                {
                    initial_cursor_blink = (tp[j + 4] == '1');
!                   rbm_status = STATUS_GOT;
                    LOG_TR(("Received cursor blinking mode response: %s", tp));
                    key_name[0] = (int)KS_EXTRA;
                    key_name[1] = (int)KE_IGNORE;
--- 4900,4906 ----
                        && tp[i] == 'y')
                {
                    initial_cursor_blink = (tp[j + 4] == '1');
!                   rbm_status.tr_progress = STATUS_GOT;
                    LOG_TR(("Received cursor blinking mode response: %s", tp));
                    key_name[0] = (int)KS_EXTRA;
                    key_name[1] = (int)KE_IGNORE;
***************
*** 4896,4902 ****
                            slen = i + 1;
  
                            if (--did_request_winpos <= 0)
!                               winpos_status = STATUS_GOT;
                        }
                    }
                    if (i == len)
--- 4938,4944 ----
                            slen = i + 1;
  
                            if (--did_request_winpos <= 0)
!                               winpos_status.tr_progress = STATUS_GOT;
                        }
                    }
                    if (i == len)
***************
*** 4948,4954 ****
                                                + tp[j+17]) ? "light" : "dark";
  
                                LOG_TR(("Received RBG response: %s", tp));
!                               rbg_status = STATUS_GOT;
  # ifdef FEAT_TERMINAL
                                bg_r = rval;
                                bg_g = gval;
--- 4990,4996 ----
                                                + tp[j+17]) ? "light" : "dark";
  
                                LOG_TR(("Received RBG response: %s", tp));
!                               rbg_status.tr_progress = STATUS_GOT;
  # ifdef FEAT_TERMINAL
                                bg_r = rval;
                                bg_g = gval;
***************
*** 4968,4974 ****
                            else
                            {
                                LOG_TR(("Received RFG response: %s", tp));
!                               rfg_status = STATUS_GOT;
                                fg_r = rval;
                                fg_g = gval;
                                fg_b = bval;
--- 5010,5016 ----
                            else
                            {
                                LOG_TR(("Received RFG response: %s", tp));
!                               rfg_status.tr_progress = STATUS_GOT;
                                fg_r = rval;
                                fg_g = gval;
                                fg_b = bval;
***************
*** 5008,5014 ****
             *
             * Consume any code that starts with "{lead}.+r" or "{lead}.$r".
             */
!           else if ((check_for_codes || rcs_status == STATUS_SENT)
                    && ((tp[0] == ESC && len >= 2 && tp[1] == 'P')
                        || tp[0] == DCS))
            {
--- 5050,5056 ----
             *
             * Consume any code that starts with "{lead}.+r" or "{lead}.$r".
             */
!           else if ((check_for_codes || rcs_status.tr_progress == STATUS_SENT)
                    && ((tp[0] == ESC && len >= 2 && tp[1] == 'P')
                        || tp[0] == DCS))
            {
***************
*** 5061,5067 ****
                             * the value set with T_SH. */
                            initial_cursor_shape_blink =
                                                   (number & 1) ? FALSE : TRUE;
!                           rcs_status = STATUS_GOT;
                            LOG_TR(("Received cursor shape response: %s", tp));
  
                            key_name[0] = (int)KS_EXTRA;
--- 5103,5109 ----
                             * the value set with T_SH. */
                            initial_cursor_shape_blink =
                                                   (number & 1) ? FALSE : TRUE;
!                           rcs_status.tr_progress = STATUS_GOT;
                            LOG_TR(("Received cursor shape response: %s", tp));
  
                            key_name[0] = (int)KS_EXTRA;
***************
*** 6045,6051 ****
      void
  term_get_fg_color(char_u *r, char_u *g, char_u *b)
  {
!     if (rfg_status == STATUS_GOT)
      {
        *r = fg_r;
        *g = fg_g;
--- 6087,6093 ----
      void
  term_get_fg_color(char_u *r, char_u *g, char_u *b)
  {
!     if (rfg_status.tr_progress == STATUS_GOT)
      {
        *r = fg_r;
        *g = fg_g;
***************
*** 6059,6065 ****
      void
  term_get_bg_color(char_u *r, char_u *g, char_u *b)
  {
!     if (rbg_status == STATUS_GOT)
      {
        *r = bg_r;
        *g = bg_g;
--- 6101,6107 ----
      void
  term_get_bg_color(char_u *r, char_u *g, char_u *b)
  {
!     if (rbg_status.tr_progress == STATUS_GOT)
      {
        *r = bg_r;
        *g = bg_g;
*** ../vim-8.1.1314/src/version.c       2019-05-10 21:38:50.037438773 +0200
--- src/version.c       2019-05-10 23:03:34.393608039 +0200
***************
*** 769,770 ****
--- 769,772 ----
  {   /* Add new patch number below this line */
+ /**/
+     1315,
  /**/

-- 
Wi n0t trei a h0liday in Sweden thi yer?
                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

 /// 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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/201905102110.x4ALAvhh008180%40masaka.moolenaar.net.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui