@@ -4008,7 +4008,9 @@ check_termcode(max_offset, buf, buflen)
40084008 }
40094009
40104010#ifdef FEAT_TERMRESPONSE
4011- if (key_name [0 ] == NUL )
4011+ if (key_name [0 ] == NUL
4012+ /* URXVT mouse uses <ESC>[#;#;#M, but we are matching <ESC>[ */
4013+ || key_name [0 ] == KS_URXVT_MOUSE )
40124014 {
40134015 /* Check for xterm version string: "<Esc>[>{x};{vers};{y}c". Also
40144016 * eat other possible responses to t_RV, rxvt returns
@@ -4047,7 +4049,7 @@ check_termcode(max_offset, buf, buflen)
40474049 if (tp [1 + (tp [0 ] != CSI )] == '>' && j == 2 )
40484050 {
40494051 /* if xterm version >= 95 use mouse dragging */
4050- if (extra >= 95 )
4052+ if (extra >= 95 && ttym_flags != TTYM_URXVT )
40514053 set_option_value ((char_u * )"ttym" , 0L ,
40524054 (char_u * )"xterm2" , 0 );
40534055 /* if xterm version >= 141 try to get termcap codes */
@@ -4140,6 +4142,9 @@ check_termcode(max_offset, buf, buflen)
41404142# endif
41414143# ifdef FEAT_MOUSE_PTERM
41424144 || key_name [0 ] == (int )KS_PTERM_MOUSE
4145+ # endif
4146+ # ifdef FEAT_MOUSE_URXVT
4147+ || key_name [0 ] == (int )KS_URXVT_MOUSE
41434148# endif
41444149 )
41454150 {
@@ -4219,7 +4224,69 @@ check_termcode(max_offset, buf, buflen)
42194224 else
42204225 break ;
42214226 }
4227+ }
4228+
4229+ # ifdef FEAT_MOUSE_URXVT
4230+ if (key_name [0 ] == (int )KS_URXVT_MOUSE )
4231+ {
4232+ for (;;)
4233+ {
4234+ /* URXVT 1015 mouse reporting mode:
4235+ * Almost identical to xterm mouse mode, except the values
4236+ * are decimal instead of bytes.
4237+ *
4238+ * \033[%d;%d;%dM
4239+ * ^-- row
4240+ * ^----- column
4241+ * ^-------- code
4242+ */
4243+ p = tp + slen ;
4244+
4245+ mouse_code = getdigits (& p );
4246+ if (* p ++ != ';' )
4247+ return -1 ;
4248+
4249+ mouse_col = getdigits (& p ) - 1 ;
4250+ if (* p ++ != ';' )
4251+ return -1 ;
4252+
4253+ mouse_row = getdigits (& p ) - 1 ;
4254+ if (* p ++ != 'M' )
4255+ return -1 ;
42224256
4257+ slen += (int )(p - (tp + slen ));
4258+
4259+ /* skip this one if next one has same code (like xterm
4260+ * case) */
4261+ j = termcodes [idx ].len ;
4262+ if (STRNCMP (tp , tp + slen , (size_t )j ) == 0 ) {
4263+ /* check if the command is complete by looking for the
4264+ * M */
4265+ int slen2 ;
4266+ int cmd_complete = 0 ;
4267+ for (slen2 = slen ; slen2 < len ; slen2 ++ ) {
4268+ if (tp [slen2 ] == 'M' ) {
4269+ cmd_complete = 1 ;
4270+ break ;
4271+ }
4272+ }
4273+ p += j ;
4274+ if (cmd_complete && getdigits (& p ) == mouse_code ) {
4275+ slen += j ; /* skip the \033[ */
4276+ continue ;
4277+ }
4278+ }
4279+ break ;
4280+ }
4281+ }
4282+ # endif
4283+
4284+ if (key_name [0 ] == (int )KS_MOUSE
4285+ #ifdef FEAT_MOUSE_URXVT
4286+ || key_name [0 ] == (int )KS_URXVT_MOUSE
4287+ #endif
4288+ )
4289+ {
42234290# if !defined(MSWIN ) && !defined(MSDOS )
42244291 /*
42254292 * Handle mouse events.
0 commit comments