Patch 8.0.1194

137 views
Skip to first unread message

Bram Moolenaar

unread,
Oct 14, 2017, 5:24:51 PM10/14/17
to vim...@googlegroups.com

Patch 8.0.1194
Problem: Actual fg and bg colors of terminal are unknown.
Solution: Add t_RF. Store response to t_RB and t_RF, use for terminal.
Files: src/term.c, src/term.h, src/proto/term.pro, src/terminal.c,
src/vim.h, src/eval.c, runtime/doc/eval.txt


*** ../vim-8.0.1193/src/term.c 2017-10-04 18:04:09.397665211 +0200
--- src/term.c 2017-10-14 22:42:54.028013422 +0200
***************
*** 125,130 ****
--- 125,141 ----
/* 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;
+ static int bg_r = 255;
+ static int bg_g = 255;
+ static int bg_b = 255;
+ #endif
+
/* Request background color report: */
static int rbg_status = STATUS_GET;

***************
*** 882,887 ****
--- 893,899 ----
{(int)KS_CGP, IF_EB("\033[13t", ESC_STR "[13t")},
# endif
{(int)KS_CRV, IF_EB("\033[>c", ESC_STR "[>c")},
+ {(int)KS_RFG, IF_EB("\033]10;?\007", ESC_STR "]10;?\007")},
{(int)KS_RBG, IF_EB("\033]11;?\007", ESC_STR "]11;?\007")},
{(int)KS_U7, IF_EB("\033[6n", ESC_STR "[6n")},
# ifdef FEAT_TERMGUICOLORS
***************
*** 1185,1190 ****
--- 1197,1203 ----
# endif
{(int)KS_CRV, "[CRV]"},
{(int)KS_U7, "[U7]"},
+ {(int)KS_RFG, "[RFG]"},
{(int)KS_RBG, "[RBG]"},
{K_UP, "[KU]"},
{K_DOWN, "[KD]"},
***************
*** 1608,1614 ****
{KS_TS, "ts"}, {KS_FS, "fs"},
{KS_CWP, "WP"}, {KS_CWS, "WS"},
{KS_CSI, "SI"}, {KS_CEI, "EI"},
! {KS_U7, "u7"}, {KS_RBG, "RB"},
{KS_8F, "8f"}, {KS_8B, "8b"},
{KS_CBE, "BE"}, {KS_CBD, "BD"},
{KS_CPS, "PS"}, {KS_CPE, "PE"},
--- 1621,1627 ----
{KS_TS, "ts"}, {KS_FS, "fs"},
{KS_CWP, "WP"}, {KS_CWS, "WS"},
{KS_CSI, "SI"}, {KS_CEI, "EI"},
! {KS_U7, "u7"}, {KS_RFG, "RF"}, {KS_RBG, "RB"},
{KS_8F, "8f"}, {KS_8B, "8b"},
{KS_CBE, "BE"}, {KS_CBD, "BD"},
{KS_CPS, "PS"}, {KS_CPE, "PE"},
***************
*** 3320,3325 ****
--- 3333,3341 ----
* 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))
***************
*** 3391,3396 ****
--- 3407,3415 ----
/* 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)
***************
*** 3508,3523 ****
{
if (can_get_termresponse() && starting == 0)
{
! /* Only request background if t_RB is set and 'background' wasn't
! * changed. */
! if (rbg_status == STATUS_GET
! && *T_RBG != NUL
! && !option_was_set((char_u *)"bg"))
{
LOG_TR("Sending BG request");
out_str(T_RBG);
rbg_status = STATUS_SENT;

/* check for the characters now, otherwise they might be eaten by
* get_keystroke() */
out_flush();
--- 3527,3556 ----
{
if (can_get_termresponse() && starting == 0)
{
! int didit = FALSE;
!
! #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;
+ }

+ if (didit)
+ {
/* check for the characters now, otherwise they might be eaten by
* get_keystroke() */
out_flush();
***************
*** 4688,4733 ****
}
}

! /* Check for background color response from the terminal:
*
! * {lead}11;rgb:{rrrr}/{gggg}/{bbbb}{tail}
*
* {lead} can be <Esc>] or OSC
* {tail} can be '\007', <Esc>\ or STERM.
*
* Consume any code that starts with "{lead}11;", it's also
* possible that "rgba" is following.
*/
! else if (*T_RBG != NUL
&& ((tp[0] == ESC && len >= 2 && tp[1] == ']')
|| tp[0] == OSC))
{
j = 1 + (tp[0] == ESC);
if (len >= j + 3 && (argp[0] != '1'
! || argp[1] != '1' || argp[2] != ';'))
i = 0; /* no match */
else
for (i = j; i < len; ++i)
if (tp[i] == '\007' || (tp[0] == OSC ? tp[i] == STERM
: (tp[i] == ESC && i + 1 < len && tp[i + 1] == '\\')))
{
if (i - j >= 21 && STRNCMP(tp + j + 3, "rgb:", 4) == 0
! && tp[j + 11] == '/' && tp[j + 16] == '/'
! && !option_was_set((char_u *)"bg"))
{
! char *newval = (3 * '6' < tp[j+7] + tp[j+12]
! + tp[j+17]) ? "light" : "dark";

! LOG_TR("Received RBG response");
! rbg_status = STATUS_GOT;
! if (STRCMP(p_bg, newval) != 0)
{
! /* value differs, apply it */
! set_option_value((char_u *)"bg", 0L,
(char_u *)newval, 0);
! reset_option_was_set((char_u *)"bg");
! redraw_asap(CLEAR);
}
}

/* got finished code: consume it */
--- 4721,4792 ----
}
}

! /* Check for fore/background color response from the terminal:
*
! * {lead}{code};rgb:{rrrr}/{gggg}/{bbbb}{tail}
*
+ * {code} is 10 for foreground, 11 for background
* {lead} can be <Esc>] or OSC
* {tail} can be '\007', <Esc>\ or STERM.
*
* Consume any code that starts with "{lead}11;", it's also
* possible that "rgba" is following.
*/
! else if ((*T_RBG != NUL || *T_RFG != NUL)
&& ((tp[0] == ESC && len >= 2 && tp[1] == ']')
|| tp[0] == OSC))
{
j = 1 + (tp[0] == ESC);
if (len >= j + 3 && (argp[0] != '1'
! || (argp[1] != '1' && argp[1] != '0')
! || argp[2] != ';'))
i = 0; /* no match */
else
for (i = j; i < len; ++i)
if (tp[i] == '\007' || (tp[0] == OSC ? tp[i] == STERM
: (tp[i] == ESC && i + 1 < len && tp[i + 1] == '\\')))
{
+ int is_bg = argp[1] == '1';
+
if (i - j >= 21 && STRNCMP(tp + j + 3, "rgb:", 4) == 0
! && tp[j + 11] == '/' && tp[j + 16] == '/')
{
! int rval = hexhex2nr(tp + j + 7);
! int gval = hexhex2nr(tp + j + 12);
! int bval = hexhex2nr(tp + j + 17);

! if (is_bg)
{
! char *newval = (3 * '6' < tp[j+7] + tp[j+12]
! + tp[j+17]) ? "light" : "dark";
!
! LOG_TR("Received RBG response");
! rbg_status = STATUS_GOT;
! #ifdef FEAT_TERMINAL
! bg_r = rval;
! bg_g = gval;
! bg_b = bval;
! #endif
! if (!option_was_set((char_u *)"bg")
! && STRCMP(p_bg, newval) != 0)
! {
! /* value differs, apply it */
! set_option_value((char_u *)"bg", 0L,
(char_u *)newval, 0);
! reset_option_was_set((char_u *)"bg");
! redraw_asap(CLEAR);
! }
! }
! #ifdef FEAT_TERMINAL
! else
! {
! LOG_TR("Received RFG response");
! rfg_status = STATUS_GOT;
! fg_r = rval;
! fg_g = gval;
! fg_b = bval;
}
+ #endif
}

/* got finished code: consume it */
***************
*** 4735,4741 ****
key_name[1] = (int)KE_IGNORE;
slen = i + 1 + (tp[i] == ESC);
# ifdef FEAT_EVAL
! set_vim_var_string(VV_TERMRGBRESP, tp, slen);
# endif
break;
}
--- 4794,4801 ----
key_name[1] = (int)KE_IGNORE;
slen = i + 1 + (tp[i] == ESC);
# ifdef FEAT_EVAL
! set_vim_var_string(is_bg ? VV_TERMRBGRESP
! : VV_TERMRFGRESP, tp, slen);
# endif
break;
}
***************
*** 5768,5773 ****
--- 5828,5863 ----
return 0; /* no match found */
}

+ #if defined(FEAT_TERMINAL) || defined(PROTO)
+ /*
+ * Get the text foreground color, if known.
+ */
+ void
+ term_get_fg_color(uint8_t *r, uint8_t *g, uint8_t *b)
+ {
+ if (rfg_status == STATUS_GOT)
+ {
+ *r = fg_r;
+ *g = fg_g;
+ *b = fg_b;
+ }
+ }
+
+ /*
+ * Get the text background color, if known.
+ */
+ void
+ term_get_bg_color(uint8_t *r, uint8_t *g, uint8_t *b)
+ {
+ if (rbg_status == STATUS_GOT)
+ {
+ *r = bg_r;
+ *g = bg_g;
+ *b = bg_b;
+ }
+ }
+ #endif
+
/*
* Replace any terminal code strings in from[] with the equivalent internal
* vim representation. This is used for the "from" and "to" part of a
*** ../vim-8.0.1193/src/term.h 2017-09-16 20:54:47.082560506 +0200
--- src/term.h 2017-10-14 22:14:45.195843780 +0200
***************
*** 88,93 ****
--- 88,94 ----
KS_CGP, /* get window position */
KS_CWS, /* set window size in characters */
KS_CRV, /* request version string */
+ KS_RFG, /* request foreground color */
KS_RBG, /* request background color */
KS_CSI, /* start insert mode (bar cursor) */
KS_CEI, /* end insert mode (block cursor) */
***************
*** 185,190 ****
--- 186,192 ----
#define T_CEI (TERM_STR(KS_CEI)) /* end insert mode */
#define T_CSR (TERM_STR(KS_CSR)) /* start replace mode */
#define T_CRV (TERM_STR(KS_CRV)) /* request version string */
+ #define T_RFG (TERM_STR(KS_RFG)) /* request foreground RGB */
#define T_RBG (TERM_STR(KS_RBG)) /* request background RGB */
#define T_OP (TERM_STR(KS_OP)) /* original color pair */
#define T_U7 (TERM_STR(KS_U7)) /* request cursor position */
*** ../vim-8.0.1193/src/proto/term.pro 2017-08-28 22:43:00.774266657 +0200
--- src/proto/term.pro 2017-10-14 22:33:27.871962205 +0200
***************
*** 64,69 ****
--- 64,71 ----
void del_termcode(char_u *name);
void set_mouse_topline(win_T *wp);
int check_termcode(int max_offset, char_u *buf, int bufsize, int *buflen);
+ void term_get_fg_color(uint8_t *r, uint8_t *g, uint8_t *b);
+ void term_get_bg_color(uint8_t *r, uint8_t *g, uint8_t *b);
char_u *replace_termcodes(char_u *from, char_u **bufp, int from_part, int do_lt, int special);
int find_term_bykeys(char_u *src);
void show_termcodes(void);
*** ../vim-8.0.1193/src/terminal.c 2017-10-07 17:35:04.229590525 +0200
--- src/terminal.c 2017-10-14 23:22:51.479503662 +0200
***************
*** 40,51 ****
* TODO:
* - in GUI vertical split causes problems. Cursor is flickering. (Hirohito
* Higashi, 2017 Sep 19)
! * - Can we get the default fg/bg color of the terminal and use it for
! * libvterm? Should also fix ssh-in-a-win.
* - double click in Window toolbar starts Visual mode (but not always?).
* - Shift-Tab does not work.
* - after resizing windows overlap. (Boris Staletic, #2164)
* - :wall gives an error message. (Marius Gedminas, #2190)
* - Redirecting output does not work on MS-Windows, Test_terminal_redir_file()
* is disabled.
* - cursor blinks in terminal on widows with a timer. (xtal8, #2142)
--- 40,51 ----
* TODO:
* - in GUI vertical split causes problems. Cursor is flickering. (Hirohito
* Higashi, 2017 Sep 19)
! * - patch to handle composing characters. (Ozaki Kiichi, #2195)
* - double click in Window toolbar starts Visual mode (but not always?).
* - Shift-Tab does not work.
* - after resizing windows overlap. (Boris Staletic, #2164)
* - :wall gives an error message. (Marius Gedminas, #2190)
+ * patch suggested by Yasuhiro Matsumoto, Oct 10
* - Redirecting output does not work on MS-Windows, Test_terminal_redir_file()
* is disabled.
* - cursor blinks in terminal on widows with a timer. (xtal8, #2142)
***************
*** 59,65 ****
* - GUI: when 'confirm' is set and trying to exit Vim, dialog offers to save
* changes to "!shell".
* (justrajdeep, 2017 Aug 22)
! * - Redrawing is slow with Athena and Motif.
* - For the GUI fill termios with default values, perhaps like pangoterm:
* http://bazaar.launchpad.net/~leonerd/pangoterm/trunk/view/head:/main.c#L134
* - if the job in the terminal does not support the mouse, we can use the
--- 59,65 ----
* - GUI: when 'confirm' is set and trying to exit Vim, dialog offers to save
* changes to "!shell".
* (justrajdeep, 2017 Aug 22)
! * - Redrawing is slow with Athena and Motif. Also other GUI? (Ramel Eshed)
* - For the GUI fill termios with default values, perhaps like pangoterm:
* http://bazaar.launchpad.net/~leonerd/pangoterm/trunk/view/head:/main.c#L134
* - if the job in the terminal does not support the mouse, we can use the
***************
*** 2608,2635 ****
if (cterm_bg >= 0)
cterm_color2rgb(cterm_bg, bg);
}
- #if defined(WIN3264) && !defined(FEAT_GUI_W32)
else
{
int tmp;

/* In an MS-Windows console we know the normal colors. */
if (cterm_normal_fg_color > 0)
{
cterm_color2rgb(cterm_normal_fg_color - 1, fg);
tmp = fg->red;
fg->red = fg->blue;
fg->blue = tmp;
}
if (cterm_normal_bg_color > 0)
{
cterm_color2rgb(cterm_normal_bg_color - 1, bg);
tmp = bg->red;
bg->red = bg->blue;
bg->blue = tmp;
}
}
- #endif

vterm_state_set_default_colors(vterm_obtain_state(vterm), fg, bg);

--- 2608,2644 ----
if (cterm_bg >= 0)
cterm_color2rgb(cterm_bg, bg);
}
else
{
+ #if defined(WIN3264) && !defined(FEAT_GUI_W32)
int tmp;
+ #endif

/* In an MS-Windows console we know the normal colors. */
if (cterm_normal_fg_color > 0)
{
cterm_color2rgb(cterm_normal_fg_color - 1, fg);
+ # if defined(WIN3264) && !defined(FEAT_GUI_W32)
tmp = fg->red;
fg->red = fg->blue;
fg->blue = tmp;
+ # endif
}
+ else
+ term_get_fg_color(&fg->red, &fg->green, &fg->blue);
+
if (cterm_normal_bg_color > 0)
{
cterm_color2rgb(cterm_normal_bg_color - 1, bg);
+ # if defined(WIN3264) && !defined(FEAT_GUI_W32)
tmp = bg->red;
bg->red = bg->blue;
bg->blue = tmp;
+ # endif
}
+ else
+ term_get_bg_color(&bg->red, &bg->green, &bg->blue);
}

vterm_state_set_default_colors(vterm_obtain_state(vterm), fg, bg);

*** ../vim-8.0.1193/src/vim.h 2017-09-24 16:24:28.620560231 +0200
--- src/vim.h 2017-10-14 22:15:28.587549844 +0200
***************
*** 1998,2008 ****
#define VV_TYPE_NONE 78
#define VV_TYPE_JOB 79
#define VV_TYPE_CHANNEL 80
! #define VV_TERMRGBRESP 81
! #define VV_TERMU7RESP 82
! #define VV_TERMSTYLERESP 83
! #define VV_TERMBLINKRESP 84
! #define VV_LEN 85 /* number of v: vars */

/* used for v_number in VAR_SPECIAL */
#define VVAL_FALSE 0L
--- 1998,2009 ----
#define VV_TYPE_NONE 78
#define VV_TYPE_JOB 79
#define VV_TYPE_CHANNEL 80
! #define VV_TERMRFGRESP 81
! #define VV_TERMRBGRESP 82
! #define VV_TERMU7RESP 83
! #define VV_TERMSTYLERESP 84
! #define VV_TERMBLINKRESP 85
! #define VV_LEN 86 /* number of v: vars */

/* used for v_number in VAR_SPECIAL */
#define VVAL_FALSE 0L
*** ../vim-8.0.1193/src/eval.c 2017-10-02 19:29:44.810988948 +0200
--- src/eval.c 2017-10-14 22:11:06.157327672 +0200
***************
*** 187,193 ****
{VV_NAME("t_none", VAR_NUMBER), VV_RO},
{VV_NAME("t_job", VAR_NUMBER), VV_RO},
{VV_NAME("t_channel", VAR_NUMBER), VV_RO},
! {VV_NAME("termrgbresp", VAR_STRING), VV_RO},
{VV_NAME("termu7resp", VAR_STRING), VV_RO},
{VV_NAME("termstyleresp", VAR_STRING), VV_RO},
{VV_NAME("termblinkresp", VAR_STRING), VV_RO},
--- 187,194 ----
{VV_NAME("t_none", VAR_NUMBER), VV_RO},
{VV_NAME("t_job", VAR_NUMBER), VV_RO},
{VV_NAME("t_channel", VAR_NUMBER), VV_RO},
! {VV_NAME("termrfgresp", VAR_STRING), VV_RO},
! {VV_NAME("termrbgresp", VAR_STRING), VV_RO},
{VV_NAME("termu7resp", VAR_STRING), VV_RO},
{VV_NAME("termstyleresp", VAR_STRING), VV_RO},
{VV_NAME("termblinkresp", VAR_STRING), VV_RO},
*** ../vim-8.0.1193/runtime/doc/eval.txt 2017-09-15 22:43:01.793323528 +0200
--- runtime/doc/eval.txt 2017-10-14 22:11:57.972976624 +0200
***************
*** 1912,1922 ****
termcap entry. This is used to find out what the shape of the
cursor is. This is used by |term_getcursor()|.

! *v:termrgbresp*
! v:termrgbresp The escape sequence returned by the terminal for the |t_RB|
termcap entry. This is used to find out what the terminal
background color is, see 'background'.

*v:termu7resp*
v:termu7resp The escape sequence returned by the terminal for the |t_u7|
termcap entry. This is used to find out what the terminal
--- 1912,1927 ----
termcap entry. This is used to find out what the shape of the
cursor is. This is used by |term_getcursor()|.

! *v:termrbgresp*
! v:termrbgresp The escape sequence returned by the terminal for the |t_RB|
termcap entry. This is used to find out what the terminal
background color is, see 'background'.

+ *v:termrfgresp*
+ v:termrfgresp The escape sequence returned by the terminal for the |t_RF|
+ termcap entry. This is used to find out what the terminal
+ foreground color is.
+
*v:termu7resp*
v:termu7resp The escape sequence returned by the terminal for the |t_u7|
termcap entry. This is used to find out what the terminal
*** ../vim-8.0.1193/src/version.c 2017-10-14 21:15:49.307655074 +0200
--- src/version.c 2017-10-14 22:30:51.025072735 +0200
***************
*** 763,764 ****
--- 763,766 ----
{ /* Add new patch number below this line */
+ /**/
+ 1194,
/**/

--
Not too long ago, a keyboard was something to make music with...

/// Bram Moolenaar -- Br...@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 ///

Ken Takata

unread,
Oct 14, 2017, 8:20:52 PM10/14/17
to vim_dev
Hi Bram,

2017/10/15 Sun 6:24:51 UTC+9 Bram Moolenaar wrote:
> Patch 8.0.1194
> Problem: Actual fg and bg colors of terminal are unknown.
> Solution: Add t_RF. Store response to t_RB and t_RF, use for terminal.
> Files: src/term.c, src/term.h, src/proto/term.pro, src/terminal.c,
> src/vim.h, src/eval.c, runtime/doc/eval.txt

Win32 buills fail with this.
Please check the attached patch.

Regards,
Ken Takata

fix-8.0.1194.patch

Brian Pina

unread,
Oct 15, 2017, 5:01:03 AM10/15/17
to vim_dev
Hey Bram,

> Patch 8.0.1194
> Problem: Actual fg and bg colors of terminal are unknown.
> Solution: Add t_RF. Store response to t_RB and t_RF, use for terminal.
> Files: src/term.c, src/term.h, src/proto/term.pro, src/terminal.c,
> src/vim.h, src/eval.c, runtime/doc/eval.txt


I think this is having issues when running vim inside of tmux. I am receiving a segfault when running vim through a tmux session. vim -u NONE works okay, but the segfault occurs without any local plugins.

(gdb) bt
#0 0x000000000059865f in may_req_bg_color ()
#1 0x00000000005d8559 in vim_main2 ()
#2 0x000000000042b429 in main ()

compiled vim at 65e4c4f68
compiled tmux at fb02df66c

The problem does not appear when compiling v8.0.1193 and local plugins are able to load fine in tmux sessions.

h_east

unread,
Oct 15, 2017, 5:58:45 AM10/15/17
to vim_dev
Hi All,

2017-10-15(Sun) 18:01:03 UTC+9 Brian Pina:

Attached patch fix this problem.

--
Best regards,
Hirohito Higashi (h_east)

fix_crash_8.0.1194.patch

Bram Moolenaar

unread,
Oct 15, 2017, 7:35:21 AM10/15/17
to vim...@googlegroups.com, h_east
Thanks!

--
What the word 'politics' means: 'Poli' in Latin meaning 'many' and 'tics'
meaning 'bloodsucking creatures'.
Reply all
Reply to author
Forward
0 new messages