| To: vim_dev@googlegroups.com |
| Subject: Patch 7.4.770 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.4.770 (after 7.4.766) |
| Problem: Background color response with transparency is not ignored. |
| Solution: Change the way escape sequences are recognized. (partly by |
| Hirohito Higashi) |
| Files: src/ascii.h, src/term.c |
| |
| |
| |
| |
| |
| *** 34,43 **** |
| #define ESC_STR_nc "\033" |
| #define DEL 0x7f |
| #define DEL_STR (char_u *)"\177" |
| - #define CSI 0x9b /* Control Sequence Introducer */ |
| - #define CSI_STR "\233" |
| - #define DCS 0x90 /* Device Control String */ |
| - #define STERM 0x9c /* String Terminator */ |
| |
| #define POUND 0xA3 |
| |
| --- 34,39 ---- |
| |
| *** 117,127 **** |
| #define ESC_STR_nc "\x27" |
| #define DEL 0x07 |
| #define DEL_STR (char_u *)"\007" |
| - /* TODO: EBCDIC Code page dependent (here 1047) */ |
| - #define CSI 0x9b /* Control Sequence Introducer */ |
| - #define CSI_STR "\233" |
| - #define DCS 0x90 /* Device Control String */ |
| - #define STERM 0x9c /* String Terminator */ |
| |
| #define POUND 0xB1 |
| |
| --- 113,118 ---- |
| |
| *** 173,178 **** |
| --- 164,176 ---- |
| |
| #endif /* defined EBCDIC */ |
| |
| + /* TODO: EBCDIC Code page dependent (here 1047) */ |
| + #define CSI 0x9b /* Control Sequence Introducer */ |
| + #define CSI_STR "\233" |
| + #define DCS 0x90 /* Device Control String */ |
| + #define OSC 0x9d /* Operating System Command */ |
| + #define STERM 0x9c /* String Terminator */ |
| + |
| /* |
| * Character that separates dir names in a path. |
| * For MS-DOS, WIN32 and OS/2 we use a backslash. A slash mostly works |
| |
| |
| |
| *** 2364,2370 **** |
| if (p[1] == '[') |
| return CSI; |
| if (p[1] == ']') |
| ! return 0x9d; |
| if (p[1] == 'O') |
| return 0x8f; |
| } |
| --- 2364,2370 ---- |
| if (p[1] == '[') |
| return CSI; |
| if (p[1] == ']') |
| ! return OSC; |
| if (p[1] == 'O') |
| return 0x8f; |
| } |
| |
| *** 4261,4278 **** |
| * - Cursor position report: <Esc>[{row};{col}R |
| * The final byte must be 'R'. It is used for checking the |
| * ambiguous-width character state. |
| - * |
| - * - Background color response: |
| - * <Esc>]11;rgb:{rrrr}/{gggg}/{bbbb}\007 |
| - * Or |
| - * <Esc>]11;rgb:{rrrr}/{gggg}/{bbbb}ST |
| - * The final byte must be '\007' or ST(0x9c or ESC\). |
| */ |
| ! 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 == '?')) |
| { |
| --- 4261,4271 ---- |
| * - Cursor position report: <Esc>[{row};{col}R |
| * The final byte must be 'R'. It is used for checking the |
| * ambiguous-width character state. |
| */ |
| ! char_u *argp = tp[0] == ESC ? tp + 2 : tp + 1; |
| |
| ! if ((*T_CRV != NUL || *T_U7 != NUL) |
| ! && ((tp[0] == ESC && len >= 3 && tp[1] == '[') |
| || (tp[0] == CSI && len >= 2)) |
| && (VIM_ISDIGIT(*argp) || *argp == '>' || *argp == '?')) |
| { |
| |
| *** 4410,4453 **** |
| key_name[1] = (int)KE_IGNORE; |
| slen = i + 1; |
| } |
| ! else if (*T_RBG != NUL |
| ! && len >= 24 - (tp[0] == CSI) |
| ! && len >= 24 - (tp[0] == CSI) + (argp[21] == ESC) |
| ! && 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' || argp[21] == STERM |
| ! || (argp[21] == ESC && argp[22] == '\\'))) |
| ! { |
| ! 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 - (tp[0] == CSI) + (argp[21] == ESC); |
| } |
| } |
| |
| ! /* Check for '<Esc>P1+r<hex bytes><Esc>\'. A "0" instead of the |
| ! * "1" means an invalid request. */ |
| else if (check_for_codes |
| ! && ((tp[0] == ESC && tp[1] == 'P' && len >= 2) |
| || tp[0] == DCS)) |
| { |
| ! j = 1 + (tp[0] != DCS); |
| ! for (i = j; i < len; ++i) |
| ! if ((tp[i] == ESC && tp[i + 1] == '\\' && i + 1 < len) |
| || tp[i] == STERM) |
| { |
| ! if (i - j >= 3 && tp[j + 1] == '+' && tp[j + 2] == 'r') |
| got_code_from_term(tp + j, i); |
| key_name[0] = (int)KS_EXTRA; |
| key_name[1] = (int)KE_IGNORE; |
| --- 4403,4482 ---- |
| key_name[1] = (int)KE_IGNORE; |
| slen = i + 1; |
| } |
| ! } |
| ! |
| ! /* 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")) |
| ! {/* TODO: don't set option when already the right value */ |
| ! LOG_TR("Received RBG"); |
| ! rbg_status = RBG_GOT; |
| ! set_option_value((char_u *)"bg", 0L, (char_u *)( |
| ! (3 * '6' < tp[j+7] + tp[j+12] + tp[j+17]) |
| ! ? "light" : "dark"), 0); |
| ! reset_option_was_set((char_u *)"bg"); |
| ! redraw_asap(CLEAR); |
| ! } |
| ! |
| ! /* got finished code: consume it */ |
| ! key_name[0] = (int)KS_EXTRA; |
| ! key_name[1] = (int)KE_IGNORE; |
| ! slen = i + 1 + (tp[i] == ESC); |
| ! break; |
| } |
| ! if (i == len) |
| ! { |
| ! LOG_TR("not enough characters for RB"); |
| ! return -1; |
| } |
| } |
| |
| ! /* Check for key code response from xterm: |
| ! * |
| ! * {lead}{flag}+r<hex bytes><{tail} |
| ! * |
| ! * {lead} can be <Esc>P or DCS |
| ! * {flag} can be '0' or '1' |
| ! * {tail} can be Esc>\ or STERM |
| ! * |
| ! * Consume any code that starts with "{lead}.+r". |
| ! */ |
| else if (check_for_codes |
| ! && ((tp[0] == ESC && len >= 2 && tp[1] == 'P') |
| || tp[0] == DCS)) |
| { |
| ! j = 1 + (tp[0] == ESC); |
| ! if (len >= j + 3 && (argp[1] != '+' || argp[2] != 'r')) |
| ! i = 0; /* no match */ |
| ! else |
| ! for (i = j; i < len; ++i) |
| ! if ((tp[i] == ESC && i + 1 < len && tp[i + 1] == '\\') |
| || tp[i] == STERM) |
| { |
| ! if (i - j >= 3) |
| got_code_from_term(tp + j, i); |
| key_name[0] = (int)KS_EXTRA; |
| key_name[1] = (int)KE_IGNORE; |
| |
| *** 4457,4464 **** |
| |
| if (i == len) |
| { |
| LOG_TR("not enough characters for XT"); |
| ! return -1; /* not enough characters */ |
| } |
| } |
| } |
| --- 4486,4495 ---- |
| |
| if (i == len) |
| { |
| + /* These codes arrive many together, each code can be |
| + * truncated at any point. */ |
| LOG_TR("not enough characters for XT"); |
| ! return -1; |
| } |
| } |
| } |
| |
| |
| |
| *** 743,744 **** |
| --- 743,746 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 770, |
| /**/ |
| |
| -- |
| Some of the well known MS-Windows errors: |
| ETIME Wrong time, wait a little while |
| ECRASH Try again... |
| EDETECT Unable to detect errors |
| EOVER You lost! Play another game? |
| ENOCLUE Eh, what did you want? |
| |
| /// 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 /// |