diff --git a/7.4.757 b/7.4.757 new file mode 100644 index 0000000..081af2c --- /dev/null +++ b/7.4.757 @@ -0,0 +1,273 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.4.757 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.4.757 +Problem: Cannot detect the background color of a terminal. +Solution: Add T_RBG to request the background color if possible. (Lubomir + Rintel) +Files: src/main.c, src/term.c, src/term.h, src/proto/term.pro + + +*** ../vim-7.4.756/src/main.c 2015-04-17 22:08:10.998772925 +0200 +--- src/main.c 2015-06-25 17:01:47.917747345 +0200 +*************** +*** 837,844 **** + + starttermcap(); /* start termcap if not done by wait_return() */ + TIME_MSG("start termcap"); +! #if defined(FEAT_TERMRESPONSE) && defined(FEAT_MBYTE) + may_req_ambiguous_char_width(); + #endif + + #ifdef FEAT_MOUSE +--- 837,847 ---- + + starttermcap(); /* start termcap if not done by wait_return() */ + TIME_MSG("start termcap"); +! #if defined(FEAT_TERMRESPONSE) +! # if defined(FEAT_MBYTE) + may_req_ambiguous_char_width(); ++ # endif ++ may_req_bg_color(); + #endif + + #ifdef FEAT_MOUSE +*** ../vim-7.4.756/src/term.c 2015-03-31 18:30:09.139370916 +0200 +--- src/term.c 2015-06-25 16:52:59.359131386 +0200 +*************** +*** 124,129 **** +--- 124,134 ---- + # define U7_SENT 2 /* did send T_U7, waiting for answer */ + # define U7_GOT 3 /* received T_U7 response */ + static int u7_status = U7_GET; ++ /* Request background color report: */ ++ # define RBG_GET 1 /* send T_RBG when switched to RAW mode */ ++ # define RBG_SENT 2 /* did send T_RBG, waiting for answer */ ++ # define RBG_GOT 3 /* received T_RBG response */ ++ static int rbg_status = RBG_GET; + # endif + + /* +*************** +*** 949,954 **** +--- 954,960 ---- + {(int)KS_CWP, IF_EB("\033[3;%d;%dt", ESC_STR "[3;%d;%dt")}, + # endif + {(int)KS_CRV, IF_EB("\033[>c", ESC_STR "[>c")}, ++ {(int)KS_RBG, IF_EB("\033]11;?\007", ESC_STR "]11;?\007")}, + {(int)KS_U7, IF_EB("\033[6n", ESC_STR "[6n")}, + + {K_UP, IF_EB("\033O*A", ESC_STR "O*A")}, +*************** +*** 1240,1245 **** +--- 1246,1252 ---- + # endif + {(int)KS_CRV, "[CRV]"}, + {(int)KS_U7, "[U7]"}, ++ {(int)KS_RBG, "[RBG]"}, + {K_UP, "[KU]"}, + {K_DOWN, "[KD]"}, + {K_LEFT, "[KL]"}, +*************** +*** 3224,3230 **** + * doesn't work in Cooked mode, an external program may get + * them. */ + if (tmode != TMODE_RAW && (crv_status == CRV_SENT +! || u7_status == U7_SENT)) + (void)vpeekc_nomap(); + check_for_codes_from_term(); + } +--- 3231,3238 ---- + * doesn't work in Cooked mode, an external program may get + * them. */ + if (tmode != TMODE_RAW && (crv_status == CRV_SENT +! || u7_status == U7_SENT +! || rbg_status == RBG_SENT)) + (void)vpeekc_nomap(); + check_for_codes_from_term(); + } +*************** +*** 3285,3292 **** + if (!gui.in_use && !gui.starting) + # endif + { +! /* May need to discard T_CRV or T_U7 response. */ +! if (crv_status == CRV_SENT || u7_status == U7_SENT) + { + # ifdef UNIX + /* Give the terminal a chance to respond. */ +--- 3293,3301 ---- + if (!gui.in_use && !gui.starting) + # endif + { +! /* May need to discard T_CRV, T_U7 or T_RBG response. */ +! if (crv_status == CRV_SENT || u7_status == U7_SENT +! || rbg_status == RBG_SENT) + { + # ifdef UNIX + /* Give the terminal a chance to respond. */ +*************** +*** 3398,3403 **** +--- 3407,3447 ---- + } + # endif + ++ #if defined(FEAT_TERMRESPONSE) || defined(PROTO) ++ /* ++ * Check how the terminal treats ambiguous character width (UAX #11). ++ * First, we move the cursor to (1, 0) and print a test ambiguous character ++ * \u25bd (WHITE DOWN-POINTING TRIANGLE) and query current cursor position. ++ * If the terminal treats \u25bd as single width, the position is (1, 1), ++ * or if it is treated as double width, that will be (1, 2). ++ * This function has the side effect that changes cursor position, so ++ * it must be called immediately after entering termcap mode. ++ */ ++ void ++ may_req_bg_color() ++ { ++ if (rbg_status == RBG_GET ++ && cur_tmode == TMODE_RAW ++ && termcap_active ++ && p_ek ++ # ifdef UNIX ++ && isatty(1) ++ && isatty(read_cmd_fd) ++ # endif ++ && *T_RBG != NUL ++ && !option_was_set((char_u *)"bg")) ++ { ++ LOG_TR("Sending BG request"); ++ out_str(T_RBG); ++ rbg_status = RBG_SENT; ++ /* check for the characters now, otherwise they might be eaten by ++ * get_keystroke() */ ++ out_flush(); ++ (void)vpeekc_nomap(); ++ } ++ } ++ # endif ++ + # ifdef DEBUG_TERMRESPONSE + static void + log_tr(char *msg) +*************** +*** 4222,4233 **** + * - Cursor position report: [{row};{col}R + * The final byte must be 'R'. It is used for checking the + * ambiguous-width character state. + */ +! p = tp[0] == CSI ? tp + 1 : tp + 2; +! if ((*T_CRV != NUL || *T_U7 != NUL) + && ((tp[0] == ESC && tp[1] == '[' && len >= 3) + || (tp[0] == CSI && len >= 2)) +! && (VIM_ISDIGIT(*p) || *p == '>' || *p == '?')) + { + #ifdef FEAT_MBYTE + int col; +--- 4266,4283 ---- + * - Cursor position report: [{row};{col}R + * The final byte must be 'R'. It is used for checking the + * ambiguous-width character state. ++ * ++ * - Background color response: ++ * ]11;rgb:{rrrr}/{gggg}/{bbbb}\007 ++ * The final byte must be '\007'. + */ +! char_u *argp = tp[0] == CSI ? tp + 1 : tp + 2; +! +! if ((*T_CRV != NUL || *T_U7 != NUL || *T_RBG != NUL) + && ((tp[0] == ESC && tp[1] == '[' && len >= 3) ++ || (tp[0] == ESC && tp[1] == ']' && len >= 24) + || (tp[0] == CSI && len >= 2)) +! && (VIM_ISDIGIT(*argp) || *argp == '>' || *argp == '?')) + { + #ifdef FEAT_MBYTE + int col; +*************** +*** 4363,4368 **** +--- 4413,4439 ---- + key_name[1] = (int)KE_IGNORE; + slen = i + 1; + } ++ else if (*T_RBG != NUL && len >= 24 - (tp[0] == CSI) ++ && argp[0] == '1' && argp[1] == '1' ++ && argp[2] == ';' && argp[3] == 'r' && argp[4] == 'g' ++ && argp[5] == 'b' && argp[6] == ':' ++ && argp[11] == '/' && argp[16] == '/' ++ && argp[21] == '\007') ++ { ++ LOG_TR("Received RBG"); ++ rbg_status = RBG_GOT; ++ if (!option_was_set((char_u *)"bg")) ++ { ++ set_option_value((char_u *)"bg", 0L, (char_u *)( ++ (3 * '6' < argp[7] + argp[12] + argp[17]) ++ ? "light" : "dark"), 0); ++ reset_option_was_set((char_u *)"bg"); ++ redraw_asap(CLEAR); ++ } ++ key_name[0] = (int)KS_EXTRA; ++ key_name[1] = (int)KE_IGNORE; ++ slen = 24; ++ } + } + + /* Check for 'P1+r\'. A "0" instead of the +*** ../vim-7.4.756/src/term.h 2015-03-31 18:30:09.143370872 +0200 +--- src/term.h 2015-06-25 16:21:55.222506530 +0200 +*************** +*** 79,84 **** +--- 79,85 ---- + KS_CWP, /* set window position in pixels */ + KS_CWS, /* set window size in characters */ + KS_CRV, /* request version string */ ++ KS_RBG, /* request background color */ + KS_CSI, /* start insert mode (bar cursor) */ + KS_CEI, /* end insert mode (block cursor) */ + KS_CSR, /* start replace mode (underline cursor) */ +*************** +*** 162,167 **** +--- 163,169 ---- + #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_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-7.4.756/src/proto/term.pro 2014-07-30 17:21:53.819518506 +0200 +--- src/proto/term.pro 2015-06-25 16:39:46.095228111 +0200 +*************** +*** 36,41 **** +--- 36,42 ---- + void stoptermcap __ARGS((void)); + void may_req_termresponse __ARGS((void)); + void may_req_ambiguous_char_width __ARGS((void)); ++ void may_req_bg_color __ARGS((void)); + int swapping_screen __ARGS((void)); + void setmouse __ARGS((void)); + int mouse_has __ARGS((int c)); +*** ../vim-7.4.756/src/version.c 2015-06-25 16:13:37.779750062 +0200 +--- src/version.c 2015-06-25 16:20:48.475209933 +0200 +*************** +*** 743,744 **** +--- 743,746 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 757, + /**/ + +-- +We are the Borg of GNU GPL. We will assimilate your source code. +Resistance is futile. + + /// 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 ///