]> granicus.if.org Git - vim/commitdiff
updated for version 7.3.632 v7.3.632
authorBram Moolenaar <Bram@vim.org>
Wed, 15 Aug 2012 14:21:32 +0000 (16:21 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 15 Aug 2012 14:21:32 +0000 (16:21 +0200)
Problem:    Cannot select beyond 222 columns with the mouse in xterm.
Solution:   Add support for SGR mouse tracking. (Hayaki Saito)

runtime/doc/options.txt
src/feature.h
src/keymap.h
src/misc2.c
src/option.h
src/os_unix.c
src/term.c
src/version.c

index a31ae3d168cc36035c6902f992867e4084c420c9..949ff830d39f35c777e3c679b498e89c840ca69a 100644 (file)
@@ -7437,6 +7437,7 @@ A jump table for the options with a short description can be found at |Q_op|.
        or "xterm2" already.  The main use of this option is to set it to
        "xterm", when the terminal name doesn't start with "xterm", but it can
        handle xterm mouse codes.
+       The "sgr" value will be set if the xterm version is 277 or later.
        The "xterm2" value will be set if the xterm version is reported to be
        95 or higher.  This only works when compiled with the |+termresponse|
        feature and if |t_RV| is set to the escape sequence to request the
index d13e6214220a1681f23ebab11f46b49c89d2f509..f33510480b485491bb55a7cccafa80644dfc62d4 100644 (file)
 # ifdef FEAT_BIG
 #  define FEAT_MOUSE_URXVT
 # endif
+# ifdef FEAT_BIG
+#  define FEAT_MOUSE_SGR
+# endif
 # if defined(FEAT_NORMAL) && (defined(MSDOS) || defined(WIN3264))
 #  define DOS_MOUSE
 # endif
 # define FEAT_MOUSE_XTERM
 #endif
 
+/* sgr is a small variation of mouse_xterm, and shares its code */
+#if defined(FEAT_MOUSE_SGR) && !defined(FEAT_MOUSE_XTERM)
+# 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_JSB) \
            || defined(FEAT_MOUSE_PTERM) \
            || defined(FEAT_SYSMOUSE) \
-           || defined(FEAT_MOUSE_URXVT))
+           || defined(FEAT_MOUSE_URXVT) \
+           || defined(FEAT_MOUSE_SGR))
 # define FEAT_MOUSE_TTY                /* include non-GUI mouse support */
 #endif
 #if !defined(FEAT_MOUSE) && (defined(FEAT_MOUSE_TTY) || defined(FEAT_GUI))
index 4706dfe04f41b58fa4ae239bdaef0b6bfbf52eef..986006dc9292369ed1579eed8d60cfdd8c9152e0 100644 (file)
 /* Used for the urxvt mouse. */
 #define KS_URXVT_MOUSE         238
 
+/* Used for the sgr mouse. */
+#define KS_SGR_MOUSE           237
+
 /*
  * Filler used after KS_SPECIAL and others
  */
@@ -412,6 +415,7 @@ enum key_extra
 #define K_JSBTERM_MOUSE        TERMCAP2KEY(KS_JSBTERM_MOUSE, KE_FILLER)
 #define K_PTERM_MOUSE  TERMCAP2KEY(KS_PTERM_MOUSE, KE_FILLER)
 #define K_URXVT_MOUSE  TERMCAP2KEY(KS_URXVT_MOUSE, KE_FILLER)
+#define K_SGR_MOUSE    TERMCAP2KEY(KS_SGR_MOUSE, KE_FILLER)
 
 #define K_SELECT       TERMCAP2KEY(KS_SELECT, KE_FILLER)
 #define K_TEAROFF      TERMCAP2KEY(KS_TEAROFF, KE_FILLER)
index 43fec19bc18f0dc8fda1f330d1544cf64f7abb74..084d451ac549c7435955aad36df294624c76b9f9 100644 (file)
@@ -2432,6 +2432,9 @@ static struct key_name_entry
 #endif
 #ifdef FEAT_MOUSE_URXVT
     {K_URXVT_MOUSE,    (char_u *)"UrxvtMouse"},
+#endif
+#ifdef FEAT_MOUSE_SGR
+    {K_SGR_MOUSE,      (char_u *)"SgrMouse"},
 #endif
     {K_LEFTMOUSE,      (char_u *)"LeftMouse"},
     {K_LEFTMOUSE_NM,   (char_u *)"LeftMouseNM"},
index b0cbe1294a88d55b5c905fd8ce9847079e280c9f..3474d8e7b11c436603c2f4e13c90db156e578332 100644 (file)
@@ -822,7 +822,7 @@ EXTERN long p_ttyscroll;    /* 'ttyscroll' */
 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", "urxvt", NULL};
+static char *(p_ttym_values[]) = {"xterm", "xterm2", "dec", "netterm", "jsbterm", "pterm", "urxvt", "sgr", NULL};
 # endif
 # define TTYM_XTERM            0x01
 # define TTYM_XTERM2           0x02
@@ -831,6 +831,7 @@ static char *(p_ttym_values[]) = {"xterm", "xterm2", "dec", "netterm", "jsbterm"
 # define TTYM_JSBTERM          0x10
 # define TTYM_PTERM            0x20
 # define TTYM_URXVT            0x40
+# define TTYM_SGR              0x80
 #endif
 EXTERN char_u  *p_udir;        /* 'undodir' */
 EXTERN long    p_ul;           /* 'undolevels' */
index 860fbcc409fdf98e784525e23dd4aff2d76656e7..98ff1ea662a8125419f7d0419e7206b0fd1c98a1 100644 (file)
@@ -2159,10 +2159,13 @@ use_xterm_like_mouse(name)
  * Return 1 for "xterm".
  * Return 2 for "xterm2".
  * Return 3 for "urxvt".
+ * Return 4 for "sgr".
  */
     int
 use_xterm_mouse()
 {
+    if (ttym_flags == TTYM_SGR)
+       return 4;
     if (ttym_flags == TTYM_URXVT)
        return 3;
     if (ttym_flags == TTYM_XTERM2)
@@ -3339,7 +3342,8 @@ mch_setmouse(on)
     xterm_mouse_vers = use_xterm_mouse();
 
 # ifdef FEAT_MOUSE_URXVT
-    if (ttym_flags == TTYM_URXVT) {
+    if (ttym_flags == TTYM_URXVT)
+    {
        out_str_nf((char_u *)
                   (on
                   ? IF_EB("\033[?1015h", ESC_STR "[?1015h")
@@ -3348,6 +3352,17 @@ mch_setmouse(on)
     }
 # endif
 
+# ifdef FEAT_MOUSE_SGR
+    if (ttym_flags == TTYM_SGR)
+    {
+       out_str_nf((char_u *)
+                  (on
+                  ? IF_EB("\033[?1006h", ESC_STR "[?1006h")
+                  : IF_EB("\033[?1006l", ESC_STR "[?1006l")));
+       ison = on;
+    }
+# endif
+
     if (xterm_mouse_vers > 0)
     {
        if (on) /* enable mouse events, use mouse tracking if available */
@@ -3577,6 +3592,27 @@ check_mouse_termcode()
     else
        del_mouse_termcode(KS_URXVT_MOUSE);
 # endif
+# ifdef FEAT_MOUSE_SGR
+    /* same as the dec mouse */
+    if (use_xterm_mouse() == 4
+#  ifdef FEAT_GUI
+           && !gui.in_use
+#  endif
+           )
+    {
+       set_mouse_termcode(KS_SGR_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_SGR_MOUSE);
+# endif
 }
 #endif
 
index 74c5a336fea447e4c1722a1e82bef1d5953012c9..0a296fc91c4b4a0ea1fe3c209cc32db013e37e01 100644 (file)
@@ -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
 
@@ -2036,6 +2037,11 @@ set_mouse_termcode(n, s)
     if (n == KS_URXVT_MOUSE)
        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
@@ -2078,6 +2084,11 @@ del_mouse_termcode(n)
     if (n == KS_URXVT_MOUSE)
        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, buflen)
 #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, buflen)
 
                    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, buflen)
        /*
         * 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, buflen)
                }
            }
 
-# 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, buflen)
                     *            ^-- 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, buflen)
                    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;
                        }
@@ -4301,6 +4355,9 @@ check_termcode(max_offset, buf, bufsize, buflen)
        if (key_name[0] == (int)KS_MOUSE
 #ifdef FEAT_MOUSE_URXVT
            || key_name[0] == (int)KS_URXVT_MOUSE
+#endif
+#ifdef FEAT_MOUSE_SGR
+           || key_name[0] == KS_SGR_MOUSE
 #endif
            )
        {
index 5e6dedc85bfff23c0b05b334037da2ec97dd4379..a9f80b14c98ee18295eaaf8d308f0dd156af72f2 100644 (file)
@@ -384,6 +384,11 @@ static char *(features[]) =
 # else
        "-mouse_urxvt",
 # endif
+# ifdef FEAT_MOUSE_SGR
+       "+mouse_sgr",
+# else
+       "-mouse_sgr",
+# endif
 #endif
 #ifdef __QNX__
 # ifdef FEAT_MOUSE_PTERM
@@ -714,6 +719,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    632,
 /**/
     631,
 /**/