@@ -1997,6 +1997,7 @@ set_termname(term)
19971997# define HMT_JSBTERM 8
19981998# define HMT_PTERM 16
19991999# define HMT_URXVT 32
2000+ # define HMT_SGR 64
20002001static int has_mouse_termcode = 0 ;
20012002# endif
20022003
@@ -2036,6 +2037,11 @@ set_mouse_termcode(n, s)
20362037 if (n == KS_URXVT_MOUSE )
20372038 has_mouse_termcode |= HMT_URXVT ;
20382039 else
2040+ # endif
2041+ # ifdef FEAT_MOUSE_SGR
2042+ if (n == KS_SGR_MOUSE )
2043+ has_mouse_termcode |= HMT_SGR ;
2044+ else
20392045# endif
20402046 has_mouse_termcode |= HMT_NORMAL ;
20412047# endif
@@ -2078,6 +2084,11 @@ del_mouse_termcode(n)
20782084 if (n == KS_URXVT_MOUSE )
20792085 has_mouse_termcode &= ~HMT_URXVT ;
20802086 else
2087+ # endif
2088+ # ifdef FEAT_MOUSE_SGR
2089+ if (n == KS_SGR_MOUSE )
2090+ has_mouse_termcode &= ~HMT_SGR ;
2091+ else
20812092# endif
20822093 has_mouse_termcode &= ~HMT_NORMAL ;
20832094# endif
@@ -4023,7 +4034,8 @@ check_termcode(max_offset, buf, bufsize, buflen)
40234034#ifdef FEAT_TERMRESPONSE
40244035 if (key_name [0 ] == NUL
40254036 /* URXVT mouse uses <ESC>[#;#;#M, but we are matching <ESC>[ */
4026- || key_name [0 ] == KS_URXVT_MOUSE )
4037+ || key_name [0 ] == KS_URXVT_MOUSE
4038+ || key_name [0 ] == KS_SGR_MOUSE )
40274039 {
40284040 /* Check for xterm version string: "<Esc>[>{x};{vers};{y}c". Also
40294041 * eat other possible responses to t_RV, rxvt returns
@@ -4061,6 +4073,16 @@ check_termcode(max_offset, buf, bufsize, buflen)
40614073
40624074 if (tp [1 + (tp [0 ] != CSI )] == '>' && j == 2 )
40634075 {
4076+ # ifdef TTYM_SGR
4077+ if (extra >= 277
4078+ # ifdef TTYM_URXVT
4079+ && ttym_flags != TTYM_URXVT
4080+ # endif
4081+ )
4082+ set_option_value ((char_u * )"ttym" , 0L ,
4083+ (char_u * )"sgr" , 0 );
4084+ else
4085+ # endif
40644086 /* if xterm version >= 95 use mouse dragging */
40654087 if (extra >= 95
40664088# ifdef TTYM_URXVT
@@ -4147,21 +4169,24 @@ check_termcode(max_offset, buf, bufsize, buflen)
41474169 /*
41484170 * If it is a mouse click, get the coordinates.
41494171 */
4150- if (key_name [0 ] == ( int ) KS_MOUSE
4172+ if (key_name [0 ] == KS_MOUSE
41514173# ifdef FEAT_MOUSE_JSB
4152- || key_name [0 ] == ( int ) KS_JSBTERM_MOUSE
4174+ || key_name [0 ] == KS_JSBTERM_MOUSE
41534175# endif
41544176# ifdef FEAT_MOUSE_NET
4155- || key_name [0 ] == ( int ) KS_NETTERM_MOUSE
4177+ || key_name [0 ] == KS_NETTERM_MOUSE
41564178# endif
41574179# ifdef FEAT_MOUSE_DEC
4158- || key_name [0 ] == ( int ) KS_DEC_MOUSE
4180+ || key_name [0 ] == KS_DEC_MOUSE
41594181# endif
41604182# ifdef FEAT_MOUSE_PTERM
4161- || key_name [0 ] == ( int ) KS_PTERM_MOUSE
4183+ || key_name [0 ] == KS_PTERM_MOUSE
41624184# endif
41634185# ifdef FEAT_MOUSE_URXVT
4164- || key_name [0 ] == (int )KS_URXVT_MOUSE
4186+ || key_name [0 ] == KS_URXVT_MOUSE
4187+ # endif
4188+ # ifdef FEAT_MOUSE_SGR
4189+ || key_name [0 ] == KS_SGR_MOUSE
41654190# endif
41664191 )
41674192 {
@@ -4243,8 +4268,9 @@ check_termcode(max_offset, buf, bufsize, buflen)
42434268 }
42444269 }
42454270
4246- # ifdef FEAT_MOUSE_URXVT
4247- if (key_name [0 ] == (int )KS_URXVT_MOUSE )
4271+ # if defined(FEAT_MOUSE_URXVT ) || defined(FEAT_MOUSE_SGR )
4272+ if (key_name [0 ] == KS_URXVT_MOUSE
4273+ || key_name [0 ] == KS_SGR_MOUSE )
42484274 {
42494275 for (;;)
42504276 {
@@ -4256,39 +4282,67 @@ check_termcode(max_offset, buf, bufsize, buflen)
42564282 * ^-- row
42574283 * ^----- column
42584284 * ^-------- code
4285+ *
4286+ * SGR 1006 mouse reporting mode:
4287+ * Almost identical to xterm mouse mode, except the values
4288+ * are decimal instead of bytes.
4289+ *
4290+ * \033[<%d;%d;%dM
4291+ * ^-- row
4292+ * ^----- column
4293+ * ^-------- code
4294+ *
4295+ * \033[<%d;%d;%dm : mouse release event
4296+ * ^-- row
4297+ * ^----- column
4298+ * ^-------- code
42594299 */
42604300 p = tp + slen ;
42614301
42624302 mouse_code = getdigits (& p );
42634303 if (* p ++ != ';' )
42644304 return -1 ;
42654305
4306+ /* when mouse reporting is SGR, add 32 to mouse code */
4307+ if (key_name [0 ] == KS_SGR_MOUSE )
4308+ mouse_code += 32 ;
4309+
42664310 mouse_col = getdigits (& p ) - 1 ;
42674311 if (* p ++ != ';' )
42684312 return -1 ;
42694313
42704314 mouse_row = getdigits (& p ) - 1 ;
4271- if (* p ++ != 'M' )
4315+ if (key_name [0 ] == KS_SGR_MOUSE && * p == 'm' )
4316+ mouse_code |= MOUSE_RELEASE ;
4317+ else if (* p != 'M' )
42724318 return -1 ;
4319+ p ++ ;
42734320
42744321 slen += (int )(p - (tp + slen ));
42754322
42764323 /* skip this one if next one has same code (like xterm
42774324 * case) */
42784325 j = termcodes [idx ].len ;
4279- if (STRNCMP (tp , tp + slen , (size_t )j ) == 0 ) {
4280- /* check if the command is complete by looking for the
4281- * M */
4326+ if (STRNCMP (tp , tp + slen , (size_t )j ) == 0 )
4327+ {
42824328 int slen2 ;
42834329 int cmd_complete = 0 ;
4284- for (slen2 = slen ; slen2 < len ; slen2 ++ ) {
4285- if (tp [slen2 ] == 'M' ) {
4330+
4331+ /* check if the command is complete by looking for the
4332+ * 'M' */
4333+ for (slen2 = slen ; slen2 < len ; slen2 ++ )
4334+ {
4335+ if (tp [slen2 ] == 'M'
4336+ || (key_name [0 ] == KS_SGR_MOUSE
4337+ && tp [slen2 ] == 'm' ))
4338+ {
42864339 cmd_complete = 1 ;
42874340 break ;
42884341 }
42894342 }
42904343 p += j ;
4291- if (cmd_complete && getdigits (& p ) == mouse_code ) {
4344+ if (cmd_complete && getdigits (& p ) == mouse_code )
4345+ {
42924346 slen += j ; /* skip the \033[ */
42934347 continue ;
42944348 }
@@ -4301,6 +4355,9 @@ check_termcode(max_offset, buf, bufsize, buflen)
43014355 if (key_name [0 ] == (int )KS_MOUSE
43024356#ifdef FEAT_MOUSE_URXVT
43034357 || key_name [0 ] == (int )KS_URXVT_MOUSE
4358+ #endif
4359+ #ifdef FEAT_MOUSE_SGR
4360+ || key_name [0 ] == KS_SGR_MOUSE
43044361#endif
43054362 )
43064363 {
0 commit comments