# HG changeset patch # User yidingjia # Date 1315795270 25200 # Node ID e977ad0fdba239c773c489fbec5ba29861ca18e7 # Parent ee53a39d58960b8726c53c76bef8d16159ed2b10 mode 1015 mouse reporting diff -r ee53a39d5896 -r e977ad0fdba2 src/feature.h --- a/src/feature.h Sun Aug 15 15:24:20 2010 +0200 +++ b/src/feature.h Sun Sep 11 19:41:10 2011 -0700 @@ -1062,6 +1062,9 @@ # ifdef FEAT_BIG # define FEAT_MOUSE_DEC # endif +# ifdef FEAT_BIG +# define FEAT_MOUSE_URXVT +# endif # if defined(FEAT_NORMAL) && (defined(MSDOS) || defined(WIN3264)) # define DOS_MOUSE # endif @@ -1077,13 +1080,20 @@ #if defined(FEAT_NORMAL) && defined(HAVE_SYSMOUSE) # define FEAT_SYSMOUSE #endif + +/* urxvt is a small variation of mouse_xterm, and share its code */ +#if defined(FEAT_MOUSE_URXVT) +# 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) \ || defined(FEAT_MOUSE_NET) || defined(FEAT_MOUSE_DEC) \ || defined(DOS_MOUSE) || defined(FEAT_MOUSE_GPM) \ || defined(FEAT_MOUSE_JSB) || defined(FEAT_MOUSE_PTERM) \ - || defined(FEAT_SYSMOUSE)) + || 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)) diff -r ee53a39d5896 -r e977ad0fdba2 src/keymap.h --- a/src/keymap.h Sun Aug 15 15:24:20 2010 +0200 +++ b/src/keymap.h Sun Sep 11 19:41:10 2011 -0700 @@ -106,6 +106,8 @@ /* Used for menu in a tab pages line. */ #define KS_TABMENU 239 + +#define KS_URXVT_MOUSE 238 /* * Filler used after KS_SPECIAL and others diff -r ee53a39d5896 -r e977ad0fdba2 src/option.h --- a/src/option.h Sun Aug 15 15:24:20 2010 +0200 +++ b/src/option.h Sun Sep 11 19:41:10 2011 -0700 @@ -816,7 +816,7 @@ EXTERN char_u *p_ttym; /* 'ttymouse' */ 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", NULL}; +static char *(p_ttym_values[]) = {"xterm", "xterm2", "dec", "netterm", "jsbterm", "pterm", "urxvt", NULL}; # endif # define TTYM_XTERM 0x01 # define TTYM_XTERM2 0x02 @@ -824,6 +824,7 @@ static char *(p_ttym_values[]) = {"xterm # define TTYM_NETTERM 0x08 # define TTYM_JSBTERM 0x10 # define TTYM_PTERM 0x20 +# define TTYM_URXVT 0x40 #endif EXTERN char_u *p_udir; /* 'undodir' */ EXTERN long p_ul; /* 'undolevels' */ diff -r ee53a39d5896 -r e977ad0fdba2 src/os_unix.c --- a/src/os_unix.c Sun Aug 15 15:24:20 2010 +0200 +++ b/src/os_unix.c Sun Sep 11 19:41:10 2011 -0700 @@ -2134,10 +2134,13 @@ use_xterm_like_mouse(name) * Return non-zero when using an xterm mouse, according to 'ttymouse'. * Return 1 for "xterm". * Return 2 for "xterm2". + * Return 3 for "urxvt". */ int use_xterm_mouse() { + if (ttym_flags == TTYM_URXVT) + return 3; if (ttym_flags == TTYM_XTERM2) return 2; if (ttym_flags == TTYM_XTERM) @@ -3294,6 +3297,17 @@ mch_setmouse(on) return; 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") + : IF_EB("\033[?1015l", ESC_STR "[?1015l"))); + ison = on; + } +# endif + if (xterm_mouse_vers > 0) { if (on) /* enable mouse events, use mouse tracking if available */ @@ -3410,6 +3424,9 @@ check_mouse_termcode() { # ifdef FEAT_MOUSE_XTERM if (use_xterm_mouse() +# ifdef FEAT_MOUSE_URXVT + && use_xterm_mouse() != 3 +# endif # ifdef FEAT_GUI && !gui.in_use # endif @@ -3498,6 +3515,27 @@ check_mouse_termcode() (char_u *) IF_EB("\033[", ESC_STR "[")); else del_mouse_termcode(KS_PTERM_MOUSE); +# endif +# ifdef FEAT_MOUSE_URXVT + /* same as the dec mouse */ + if (use_xterm_mouse() == 3 +# ifdef FEAT_GUI + && !gui.in_use +# endif + ) + { + set_mouse_termcode(KS_URXVT_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_URXVT_MOUSE); # endif } #endif diff -r ee53a39d5896 -r e977ad0fdba2 src/term.c --- a/src/term.c Sun Aug 15 15:24:20 2010 +0200 +++ b/src/term.c Sun Sep 11 19:41:10 2011 -0700 @@ -4064,7 +4064,9 @@ check_termcode(max_offset, buf, buflen) } #ifdef FEAT_TERMRESPONSE - if (key_name[0] == NUL) + if (key_name[0] == NUL || + // URXVT mouse uses [#;#;#M, but we are matching [ + key_name[0] == KS_URXVT_MOUSE) { /* Check for xterm version string: "[>{x};{vers};{y}c". Also * eat other possible responses to t_RV, rxvt returns @@ -4103,7 +4105,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 */ @@ -4196,6 +4198,9 @@ check_termcode(max_offset, buf, buflen) # 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 ) { @@ -4275,7 +4280,68 @@ 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 + */ + int code_len; + p = tp + slen; + + mouse_code = getdigits(&p); + if (*p++ != ';') + return -1; + code_len = p - tp + slen; + + 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. diff -r ee53a39d5896 -r e977ad0fdba2 src/version.c --- a/src/version.c Sun Aug 15 15:24:20 2010 +0200 +++ b/src/version.c Sun Sep 11 19:41:10 2011 -0700 @@ -378,6 +378,11 @@ static char *(features[]) = "+mouse_xterm", # else "-mouse_xterm", +# endif +# ifdef FEAT_MOUSE_URXVT + "+mouse_urxvt", +# else + "-mouse_urxvt", # endif #endif #ifdef __QNX__