Mercurial > vim
changeset 3166:12bb368fef2c v7.3.353
updated for version 7.3.353
Problem: Missing part of the urxvt patch.
Solution: Add the change in term.c
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Wed, 26 Oct 2011 23:48:20 +0200 |
parents | 851be4a41033 |
children | 379a6398d462 |
files | src/term.c src/version.c |
diffstat | 2 files changed, 72 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/term.c +++ b/src/term.c @@ -4008,7 +4008,9 @@ check_termcode(max_offset, buf, buflen) } #ifdef FEAT_TERMRESPONSE - if (key_name[0] == NUL) + 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 @@ -4047,7 +4049,7 @@ check_termcode(max_offset, buf, buflen) if (tp[1 + (tp[0] != CSI)] == '>' && j == 2) { /* if xterm version >= 95 use mouse dragging */ - if (extra >= 95) + if (extra >= 95 && ttym_flags != TTYM_URXVT) set_option_value((char_u *)"ttym", 0L, (char_u *)"xterm2", 0); /* if xterm version >= 141 try to get termcap codes */ @@ -4141,6 +4143,9 @@ check_termcode(max_offset, buf, buflen) # ifdef FEAT_MOUSE_PTERM || key_name[0] == (int)KS_PTERM_MOUSE # endif +# ifdef FEAT_MOUSE_URXVT + || key_name[0] == (int)KS_URXVT_MOUSE +# endif ) { is_click = is_drag = FALSE; @@ -4219,7 +4224,69 @@ check_termcode(max_offset, buf, buflen) else break; } - + } + +# ifdef FEAT_MOUSE_URXVT + if (key_name[0] == (int)KS_URXVT_MOUSE) + { + for (;;) + { + /* URXVT 1015 mouse reporting mode: + * Almost identical to xterm mouse mode, except the values + * are decimal instead of bytes. + * + * \033[%d;%d;%dM + * ^-- row + * ^----- column + * ^-------- code + */ + p = tp + slen; + + mouse_code = getdigits(&p); + 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; + } + } + break; + } + } +# endif + + if (key_name[0] == (int)KS_MOUSE +#ifdef FEAT_MOUSE_URXVT + || key_name[0] == (int)KS_URXVT_MOUSE +#endif + ) + { # if !defined(MSWIN) && !defined(MSDOS) /* * Handle mouse events.