| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.632 |
| 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.3.632 |
| Problem: Cannot select beyond 222 columns with the mouse in xterm. |
| Solution: Add support for SGR mouse tracking. (Hayaki Saito) |
| Files: runtime/doc/options.txt, src/feature.h, src/keymap.h, src/misc2.c, |
| src/option.h, src/os_unix.c, src/term.c, src/version.c |
| |
| |
| |
| |
| |
| *** 7383,7388 **** |
| --- 7424,7435 ---- |
| jsbterm JSB term mouse handling. |
| *pterm-mouse* |
| pterm QNX pterm mouse handling. |
| + *urxvt-mouse* |
| + urxvt Mouse handling for the urxvt (rxvt-unicode) terminal. |
| + *sgr-mouse* |
| + sgr Mouse handling for the terminal that emits SGR-styled |
| + mouse reporting. Works with xterm version 277 or |
| + later. |
| |
| The mouse handling must be enabled at compile time |+mouse_xterm| |
| |+mouse_dec| |+mouse_netterm|. |
| |
| *** 7395,7400 **** |
| --- 7442,7448 ---- |
| or "xterm2" already. The main use of this option is to set it to |
| "xterm", when the terminal name doesn't start with "xterm", but it can |
| handle xterm mouse codes. |
| + The "sgr" value will be set if the xterm version is 277 or later. |
| The "xterm2" value will be set if the xterm version is reported to be |
| 95 or higher. This only works when compiled with the |+termresponse| |
| feature and if |t_RV| is set to the escape sequence to request the |
| |
| |
| |
| *** 1056,1061 **** |
| --- 1056,1064 ---- |
| # ifdef FEAT_BIG |
| # define FEAT_MOUSE_URXVT |
| # endif |
| + # ifdef FEAT_BIG |
| + # define FEAT_MOUSE_SGR |
| + # endif |
| # if defined(FEAT_NORMAL) && (defined(MSDOS) || defined(WIN3264)) |
| # define DOS_MOUSE |
| # endif |
| |
| *** 1077,1082 **** |
| --- 1080,1090 ---- |
| # define FEAT_MOUSE_XTERM |
| #endif |
| |
| + /* sgr is a small variation of mouse_xterm, and shares its code */ |
| + #if defined(FEAT_MOUSE_SGR) && !defined(FEAT_MOUSE_XTERM) |
| + # define FEAT_MOUSE_XTERM |
| + #endif |
| + |
| /* Define FEAT_MOUSE when any of the above is defined or FEAT_GUI. */ |
| #if !defined(FEAT_MOUSE_TTY) \ |
| && (defined(FEAT_MOUSE_XTERM) \ |
| |
| *** 1087,1093 **** |
| || defined(FEAT_MOUSE_JSB) \ |
| || defined(FEAT_MOUSE_PTERM) \ |
| || defined(FEAT_SYSMOUSE) \ |
| ! || defined(FEAT_MOUSE_URXVT)) |
| # define FEAT_MOUSE_TTY /* include non-GUI mouse support */ |
| #endif |
| #if !defined(FEAT_MOUSE) && (defined(FEAT_MOUSE_TTY) || defined(FEAT_GUI)) |
| --- 1095,1102 ---- |
| || defined(FEAT_MOUSE_JSB) \ |
| || defined(FEAT_MOUSE_PTERM) \ |
| || defined(FEAT_SYSMOUSE) \ |
| ! || defined(FEAT_MOUSE_URXVT) \ |
| ! || defined(FEAT_MOUSE_SGR)) |
| # define FEAT_MOUSE_TTY /* include non-GUI mouse support */ |
| #endif |
| #if !defined(FEAT_MOUSE) && (defined(FEAT_MOUSE_TTY) || defined(FEAT_GUI)) |
| |
| |
| |
| *** 110,115 **** |
| --- 110,118 ---- |
| /* Used for the urxvt mouse. */ |
| #define KS_URXVT_MOUSE 238 |
| |
| + /* Used for the sgr mouse. */ |
| + #define KS_SGR_MOUSE 237 |
| + |
| /* |
| * Filler used after KS_SPECIAL and others |
| */ |
| |
| *** 412,417 **** |
| --- 415,421 ---- |
| #define K_JSBTERM_MOUSE TERMCAP2KEY(KS_JSBTERM_MOUSE, KE_FILLER) |
| #define K_PTERM_MOUSE TERMCAP2KEY(KS_PTERM_MOUSE, KE_FILLER) |
| #define K_URXVT_MOUSE TERMCAP2KEY(KS_URXVT_MOUSE, KE_FILLER) |
| + #define K_SGR_MOUSE TERMCAP2KEY(KS_SGR_MOUSE, KE_FILLER) |
| |
| #define K_SELECT TERMCAP2KEY(KS_SELECT, KE_FILLER) |
| #define K_TEAROFF TERMCAP2KEY(KS_TEAROFF, KE_FILLER) |
| |
| |
| |
| *** 2433,2438 **** |
| --- 2433,2441 ---- |
| #ifdef FEAT_MOUSE_URXVT |
| {K_URXVT_MOUSE, (char_u *)"UrxvtMouse"}, |
| #endif |
| + #ifdef FEAT_MOUSE_SGR |
| + {K_SGR_MOUSE, (char_u *)"SgrMouse"}, |
| + #endif |
| {K_LEFTMOUSE, (char_u *)"LeftMouse"}, |
| {K_LEFTMOUSE_NM, (char_u *)"LeftMouseNM"}, |
| {K_LEFTDRAG, (char_u *)"LeftDrag"}, |
| |
| |
| |
| *** 822,828 **** |
| EXTERN char_u *p_ttym; /* 'ttymouse' */ |
| EXTERN unsigned ttym_flags; |
| # ifdef IN_OPTION_C |
| ! static char *(p_ttym_values[]) = {"xterm", "xterm2", "dec", "netterm", "jsbterm", "pterm", "urxvt", NULL}; |
| # endif |
| # define TTYM_XTERM 0x01 |
| # define TTYM_XTERM2 0x02 |
| --- 822,828 ---- |
| EXTERN char_u *p_ttym; /* 'ttymouse' */ |
| EXTERN unsigned ttym_flags; |
| # ifdef IN_OPTION_C |
| ! static char *(p_ttym_values[]) = {"xterm", "xterm2", "dec", "netterm", "jsbterm", "pterm", "urxvt", "sgr", NULL}; |
| # endif |
| # define TTYM_XTERM 0x01 |
| # define TTYM_XTERM2 0x02 |
| |
| *** 831,836 **** |
| --- 831,837 ---- |
| # define TTYM_JSBTERM 0x10 |
| # define TTYM_PTERM 0x20 |
| # define TTYM_URXVT 0x40 |
| + # define TTYM_SGR 0x80 |
| #endif |
| EXTERN char_u *p_udir; /* 'undodir' */ |
| EXTERN long p_ul; /* 'undolevels' */ |
| |
| |
| |
| *** 2159,2168 **** |
| --- 2159,2171 ---- |
| * Return 1 for "xterm". |
| * Return 2 for "xterm2". |
| * Return 3 for "urxvt". |
| + * Return 4 for "sgr". |
| */ |
| int |
| use_xterm_mouse() |
| { |
| + if (ttym_flags == TTYM_SGR) |
| + return 4; |
| if (ttym_flags == TTYM_URXVT) |
| return 3; |
| if (ttym_flags == TTYM_XTERM2) |
| |
| *** 3339,3345 **** |
| xterm_mouse_vers = use_xterm_mouse(); |
| |
| # ifdef FEAT_MOUSE_URXVT |
| ! if (ttym_flags == TTYM_URXVT) { |
| out_str_nf((char_u *) |
| (on |
| ? IF_EB("\033[?1015h", ESC_STR "[?1015h") |
| --- 3342,3349 ---- |
| xterm_mouse_vers = use_xterm_mouse(); |
| |
| # ifdef FEAT_MOUSE_URXVT |
| ! if (ttym_flags == TTYM_URXVT) |
| ! { |
| out_str_nf((char_u *) |
| (on |
| ? IF_EB("\033[?1015h", ESC_STR "[?1015h") |
| |
| *** 3348,3353 **** |
| --- 3352,3368 ---- |
| } |
| # endif |
| |
| + # ifdef FEAT_MOUSE_SGR |
| + if (ttym_flags == TTYM_SGR) |
| + { |
| + out_str_nf((char_u *) |
| + (on |
| + ? IF_EB("\033[?1006h", ESC_STR "[?1006h") |
| + : IF_EB("\033[?1006l", ESC_STR "[?1006l"))); |
| + ison = on; |
| + } |
| + # endif |
| + |
| if (xterm_mouse_vers > 0) |
| { |
| if (on) /* enable mouse events, use mouse tracking if available */ |
| |
| *** 3577,3582 **** |
| --- 3592,3618 ---- |
| else |
| del_mouse_termcode(KS_URXVT_MOUSE); |
| # endif |
| + # ifdef FEAT_MOUSE_SGR |
| + /* same as the dec mouse */ |
| + if (use_xterm_mouse() == 4 |
| + # ifdef FEAT_GUI |
| + && !gui.in_use |
| + # endif |
| + ) |
| + { |
| + set_mouse_termcode(KS_SGR_MOUSE, (char_u *)(term_is_8bit(T_NAME) |
| + ? IF_EB("\233<", CSI_STR "<") |
| + : IF_EB("\033[<", ESC_STR "[<"))); |
| + |
| + if (*p_mouse != NUL) |
| + { |
| + mch_setmouse(FALSE); |
| + setmouse(); |
| + } |
| + } |
| + else |
| + del_mouse_termcode(KS_SGR_MOUSE); |
| + # endif |
| } |
| #endif |
| |
| |
| |
| |
| *** 1997,2002 **** |
| --- 1997,2003 ---- |
| # define HMT_JSBTERM 8 |
| # define HMT_PTERM 16 |
| # define HMT_URXVT 32 |
| + # define HMT_SGR 64 |
| static int has_mouse_termcode = 0; |
| # endif |
| |
| |
| *** 2037,2042 **** |
| --- 2038,2048 ---- |
| has_mouse_termcode |= HMT_URXVT; |
| else |
| # endif |
| + # ifdef FEAT_MOUSE_SGR |
| + if (n == KS_SGR_MOUSE) |
| + has_mouse_termcode |= HMT_SGR; |
| + else |
| + # endif |
| has_mouse_termcode |= HMT_NORMAL; |
| # endif |
| } |
| |
| *** 2079,2084 **** |
| --- 2085,2095 ---- |
| has_mouse_termcode &= ~HMT_URXVT; |
| else |
| # endif |
| + # ifdef FEAT_MOUSE_SGR |
| + if (n == KS_SGR_MOUSE) |
| + has_mouse_termcode &= ~HMT_SGR; |
| + else |
| + # endif |
| has_mouse_termcode &= ~HMT_NORMAL; |
| # endif |
| } |
| |
| *** 4023,4029 **** |
| #ifdef FEAT_TERMRESPONSE |
| if (key_name[0] == NUL |
| /* URXVT mouse uses <ESC>[#;#;#M, but we are matching <ESC>[ */ |
| ! || key_name[0] == KS_URXVT_MOUSE) |
| { |
| /* Check for xterm version string: "<Esc>[>{x};{vers};{y}c". Also |
| * eat other possible responses to t_RV, rxvt returns |
| --- 4034,4041 ---- |
| #ifdef FEAT_TERMRESPONSE |
| if (key_name[0] == NUL |
| /* URXVT mouse uses <ESC>[#;#;#M, but we are matching <ESC>[ */ |
| ! || key_name[0] == KS_URXVT_MOUSE |
| ! || key_name[0] == KS_SGR_MOUSE) |
| { |
| /* Check for xterm version string: "<Esc>[>{x};{vers};{y}c". Also |
| * eat other possible responses to t_RV, rxvt returns |
| |
| *** 4061,4066 **** |
| --- 4073,4088 ---- |
| |
| if (tp[1 + (tp[0] != CSI)] == '>' && j == 2) |
| { |
| + # ifdef TTYM_SGR |
| + if (extra >= 277 |
| + # ifdef TTYM_URXVT |
| + && ttym_flags != TTYM_URXVT |
| + # endif |
| + ) |
| + set_option_value((char_u *)"ttym", 0L, |
| + (char_u *)"sgr", 0); |
| + else |
| + # endif |
| /* if xterm version >= 95 use mouse dragging */ |
| if (extra >= 95 |
| # ifdef TTYM_URXVT |
| |
| *** 4147,4167 **** |
| /* |
| * If it is a mouse click, get the coordinates. |
| */ |
| ! if (key_name[0] == (int)KS_MOUSE |
| # ifdef FEAT_MOUSE_JSB |
| ! || key_name[0] == (int)KS_JSBTERM_MOUSE |
| # endif |
| # ifdef FEAT_MOUSE_NET |
| ! || key_name[0] == (int)KS_NETTERM_MOUSE |
| # endif |
| # ifdef FEAT_MOUSE_DEC |
| ! || key_name[0] == (int)KS_DEC_MOUSE |
| # endif |
| # ifdef FEAT_MOUSE_PTERM |
| ! || key_name[0] == (int)KS_PTERM_MOUSE |
| # endif |
| # ifdef FEAT_MOUSE_URXVT |
| ! || key_name[0] == (int)KS_URXVT_MOUSE |
| # endif |
| ) |
| { |
| --- 4169,4192 ---- |
| /* |
| * If it is a mouse click, get the coordinates. |
| */ |
| ! if (key_name[0] == KS_MOUSE |
| # ifdef FEAT_MOUSE_JSB |
| ! || key_name[0] == KS_JSBTERM_MOUSE |
| # endif |
| # ifdef FEAT_MOUSE_NET |
| ! || key_name[0] == KS_NETTERM_MOUSE |
| # endif |
| # ifdef FEAT_MOUSE_DEC |
| ! || key_name[0] == KS_DEC_MOUSE |
| # endif |
| # ifdef FEAT_MOUSE_PTERM |
| ! || key_name[0] == KS_PTERM_MOUSE |
| # endif |
| # ifdef FEAT_MOUSE_URXVT |
| ! || key_name[0] == KS_URXVT_MOUSE |
| ! # endif |
| ! # ifdef FEAT_MOUSE_SGR |
| ! || key_name[0] == KS_SGR_MOUSE |
| # endif |
| ) |
| { |
| |
| *** 4243,4250 **** |
| } |
| } |
| |
| ! # ifdef FEAT_MOUSE_URXVT |
| ! if (key_name[0] == (int)KS_URXVT_MOUSE) |
| { |
| for (;;) |
| { |
| --- 4268,4276 ---- |
| } |
| } |
| |
| ! # if defined(FEAT_MOUSE_URXVT) || defined(FEAT_MOUSE_SGR) |
| ! if (key_name[0] == KS_URXVT_MOUSE |
| ! || key_name[0] == KS_SGR_MOUSE) |
| { |
| for (;;) |
| { |
| |
| *** 4256,4261 **** |
| --- 4282,4301 ---- |
| * ^-- row |
| * ^----- column |
| * ^-------- code |
| + * |
| + * SGR 1006 mouse reporting mode: |
| + * Almost identical to xterm mouse mode, except the values |
| + * are decimal instead of bytes. |
| + * |
| + * \033[<%d;%d;%dM |
| + * ^-- row |
| + * ^----- column |
| + * ^-------- code |
| + * |
| + * \033[<%d;%d;%dm : mouse release event |
| + * ^-- row |
| + * ^----- column |
| + * ^-------- code |
| */ |
| p = tp + slen; |
| |
| |
| *** 4263,4294 **** |
| if (*p++ != ';') |
| return -1; |
| |
| mouse_col = getdigits(&p) - 1; |
| if (*p++ != ';') |
| return -1; |
| |
| mouse_row = getdigits(&p) - 1; |
| ! if (*p++ != 'M') |
| return -1; |
| |
| slen += (int)(p - (tp + slen)); |
| |
| /* skip this one if next one has same code (like xterm |
| * case) */ |
| j = termcodes[idx].len; |
| ! if (STRNCMP(tp, tp + slen, (size_t)j) == 0) { |
| ! /* check if the command is complete by looking for the |
| ! * M */ |
| int slen2; |
| int cmd_complete = 0; |
| ! for (slen2 = slen; slen2 < len; slen2++) { |
| ! if (tp[slen2] == 'M') { |
| cmd_complete = 1; |
| break; |
| } |
| } |
| p += j; |
| ! if (cmd_complete && getdigits(&p) == mouse_code) { |
| slen += j; /* skip the \033[ */ |
| continue; |
| } |
| --- 4303,4348 ---- |
| if (*p++ != ';') |
| return -1; |
| |
| + /* when mouse reporting is SGR, add 32 to mouse code */ |
| + if (key_name[0] == KS_SGR_MOUSE) |
| + mouse_code += 32; |
| + |
| mouse_col = getdigits(&p) - 1; |
| if (*p++ != ';') |
| return -1; |
| |
| mouse_row = getdigits(&p) - 1; |
| ! if (key_name[0] == KS_SGR_MOUSE && *p == 'm') |
| ! mouse_code |= MOUSE_RELEASE; |
| ! else if (*p != 'M') |
| return -1; |
| + p++; |
| |
| slen += (int)(p - (tp + slen)); |
| |
| /* skip this one if next one has same code (like xterm |
| * case) */ |
| j = termcodes[idx].len; |
| ! if (STRNCMP(tp, tp + slen, (size_t)j) == 0) |
| ! { |
| int slen2; |
| int cmd_complete = 0; |
| ! |
| ! /* check if the command is complete by looking for the |
| ! * 'M' */ |
| ! for (slen2 = slen; slen2 < len; slen2++) |
| ! { |
| ! if (tp[slen2] == 'M' |
| ! || (key_name[0] == KS_SGR_MOUSE |
| ! && tp[slen2] == 'm')) |
| ! { |
| cmd_complete = 1; |
| break; |
| } |
| } |
| p += j; |
| ! if (cmd_complete && getdigits(&p) == mouse_code) |
| ! { |
| slen += j; /* skip the \033[ */ |
| continue; |
| } |
| |
| *** 4302,4307 **** |
| --- 4356,4364 ---- |
| #ifdef FEAT_MOUSE_URXVT |
| || key_name[0] == (int)KS_URXVT_MOUSE |
| #endif |
| + #ifdef FEAT_MOUSE_SGR |
| + || key_name[0] == KS_SGR_MOUSE |
| + #endif |
| ) |
| { |
| # if !defined(MSWIN) && !defined(MSDOS) |
| |
| |
| |
| *** 384,389 **** |
| --- 384,394 ---- |
| # else |
| "-mouse_urxvt", |
| # endif |
| + # ifdef FEAT_MOUSE_SGR |
| + "+mouse_sgr", |
| + # else |
| + "-mouse_sgr", |
| + # endif |
| #endif |
| #ifdef __QNX__ |
| # ifdef FEAT_MOUSE_PTERM |
| |
| |
| |
| *** 716,717 **** |
| --- 721,724 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 632, |
| /**/ |
| |
| -- |
| hundred-and-one symptoms of being an internet addict: |
| 243. You unsuccessfully try to download a pizza from www.dominos.com. |
| |
| /// 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 /// |