Mercurial > vim
diff src/term.c @ 3746:44038a9777aa v7.3.632
updated for version 7.3.632
Problem: Cannot select beyond 222 columns with the mouse in xterm.
Solution: Add support for SGR mouse tracking. (Hayaki Saito)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Wed, 15 Aug 2012 16:21:32 +0200 |
parents | a27fac494e70 |
children | fdac34e3afa5 |
line wrap: on
line diff
--- a/src/term.c +++ b/src/term.c @@ -1997,6 +1997,7 @@ set_termname(term) # define HMT_JSBTERM 8 # define HMT_PTERM 16 # define HMT_URXVT 32 +# define HMT_SGR 64 static int has_mouse_termcode = 0; # endif @@ -2037,6 +2038,11 @@ set_mouse_termcode(n, s) 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,6 +2085,11 @@ del_mouse_termcode(n) 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,7 +4034,8 @@ check_termcode(max_offset, buf, bufsize, #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_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,6 +4073,16 @@ check_termcode(max_offset, buf, bufsize, 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,21 +4169,24 @@ check_termcode(max_offset, buf, bufsize, /* * If it is a mouse click, get the coordinates. */ - if (key_name[0] == (int)KS_MOUSE + if (key_name[0] == KS_MOUSE # ifdef FEAT_MOUSE_JSB - || key_name[0] == (int)KS_JSBTERM_MOUSE + || key_name[0] == KS_JSBTERM_MOUSE # endif # ifdef FEAT_MOUSE_NET - || key_name[0] == (int)KS_NETTERM_MOUSE + || key_name[0] == KS_NETTERM_MOUSE # endif # ifdef FEAT_MOUSE_DEC - || key_name[0] == (int)KS_DEC_MOUSE + || key_name[0] == KS_DEC_MOUSE # endif # ifdef FEAT_MOUSE_PTERM - || key_name[0] == (int)KS_PTERM_MOUSE + || key_name[0] == KS_PTERM_MOUSE # endif # ifdef FEAT_MOUSE_URXVT - || key_name[0] == (int)KS_URXVT_MOUSE + || key_name[0] == KS_URXVT_MOUSE +# endif +# ifdef FEAT_MOUSE_SGR + || key_name[0] == KS_SGR_MOUSE # endif ) { @@ -4243,8 +4268,9 @@ check_termcode(max_offset, buf, bufsize, } } -# ifdef FEAT_MOUSE_URXVT - if (key_name[0] == (int)KS_URXVT_MOUSE) +# if defined(FEAT_MOUSE_URXVT) || defined(FEAT_MOUSE_SGR) + if (key_name[0] == KS_URXVT_MOUSE + || key_name[0] == KS_SGR_MOUSE) { for (;;) { @@ -4256,6 +4282,20 @@ check_termcode(max_offset, buf, bufsize, * ^-- 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,32 +4303,46 @@ check_termcode(max_offset, buf, bufsize, 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 (*p++ != 'M') + 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) { - /* check if the command is complete by looking for the - * M */ + if (STRNCMP(tp, tp + slen, (size_t)j) == 0) + { int slen2; int cmd_complete = 0; - for (slen2 = slen; slen2 < len; slen2++) { - if (tp[slen2] == 'M') { + + /* 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) { + if (cmd_complete && getdigits(&p) == mouse_code) + { slen += j; /* skip the \033[ */ continue; } @@ -4302,6 +4356,9 @@ check_termcode(max_offset, buf, bufsize, #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)