summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.1315
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.1315')
-rw-r--r--data/vim/patches/8.1.1315737
1 files changed, 737 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.1315 b/data/vim/patches/8.1.1315
new file mode 100644
index 000000000..c0f637c7f
--- /dev/null
+++ b/data/vim/patches/8.1.1315
@@ -0,0 +1,737 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.1315
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+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 -- Bram@Moolenaar.net -- 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 ///