summaryrefslogtreecommitdiff
blob: 3f6f5d90618ebbf43d276334bba2f3594057887c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
diff --git a/config.h.in b/config.h.in
index 914d606..b869bfb 100644
--- a/config.h.in
+++ b/config.h.in
@@ -9,6 +9,9 @@
 /* Define if you want handling for rarely used but handy features */
 #undef ENABLE_FRILLS
 
+/* Define if you want support for SGR mouse mode 1006 */
+#undef ENABLE_SGRMOUSE
+
 /* Define if you can embed a perl interpreter */
 #undef ENABLE_PERL
 
diff --git a/configure.ac b/configure.ac
index 0da3b59..c8b9c80 100644
--- a/configure.ac
+++ b/configure.ac
@@ -76,6 +76,7 @@ AC_SEARCH_LIBS(gethostbyname, nsl)
 AC_SEARCH_LIBS(socket,        socket)
 
 support_frills=yes
+support_sgrmouse=yes
 support_inheritpixmap=yes
 support_fading=yes
 support_keepscrolling=yes
@@ -109,6 +110,7 @@ AC_ARG_ENABLE(everything,
   [
     if test x$enableval = xno; then
        support_frills=no
+       support_sgrmouse=no
        support_inheritpixmap=no
        support_fading=no
        support_keepscrolling=no
@@ -137,6 +139,7 @@ AC_ARG_ENABLE(everything,
     fi
     if test x$enableval = xyes; then
        support_frills=yes
+       support_sgrmouse=yes
        support_inheritpixmap=yes
        support_fading=yes
        support_keepscrolling=yes
@@ -359,6 +362,12 @@ AC_ARG_ENABLE(frills,
     support_frills=$enableval
   fi])
 
+AC_ARG_ENABLE(sgrmouse,
+  [  --enable-sgrmouse       enable support for SGR mouse mode 1006],
+  [if test x$enableval = xyes -o x$enableval = xno; then
+    support_sgrmouse=$enableval
+  fi])
+
 AC_ARG_ENABLE(keepscrolling,
   [  --enable-keepscrolling  enable continual scrolling on scrollbar arrow press],
   [if test x$enableval = xyes -o x$enableval = xno; then
@@ -666,6 +675,9 @@ fi
 if test x$support_frills = xyes; then
   AC_DEFINE(ENABLE_FRILLS, 1, Define if you want handling for rarely used but handy features)
 fi
+if test x$support_sgrmouse = xyes; then
+  AC_DEFINE(ENABLE_SGRMOUSE, 1, Define if you want support for SGR mouse mode 1006)
+fi
 if test x$support_mousewheel = xyes; then
   AC_DEFINE(MOUSE_WHEEL, 1, Define to use wheel events (button4 and button5) to scroll)
 fi
diff --git a/src/command.C b/src/command.C
index 7b79f51..a62ef87 100644
--- a/src/command.C
+++ b/src/command.C
@@ -1282,6 +1282,13 @@ rxvt_term::mouse_report (XButtonEvent &ev)
   int button_number, key_state = 0;
   int x, y;
   int code = 32;
+  bool mode_sgr = false;
+
+#if ENABLE_SGRMOUSE
+  if (priv_modes & PrivMode_ExtMouseSgr) mode_sgr = true;
+#endif
+
+  if (mode_sgr) code = 0;
 
   x = Pixel2Col (ev.x) + 1;
   y = Pixel2Row (ev.y) + 1;
@@ -1296,11 +1303,18 @@ rxvt_term::mouse_report (XButtonEvent &ev)
       code += 32;
     }
 
-  if (MEvent.button == AnyButton)
+  if (!(mode_sgr) && MEvent.button == AnyButton)
     button_number = 3;
   else
     {
-      button_number = MEvent.button - Button1;
+      if (ev.type == MotionNotify) {
+        if (ev.state & Button1Mask) button_number = 0;
+        else if (ev.state & Button2Mask) button_number = 1;
+        else if (ev.state & Button3Mask) button_number = 2;
+        else return;
+      } else {
+        button_number = ev.button - Button1;
+      }
       /* add 0x3D for wheel events, like xterm does */
       if (button_number >= 3)
         button_number += 64 - 3;
@@ -1361,6 +1375,15 @@ rxvt_term::mouse_report (XButtonEvent &ev)
               wint_t (32 + x),
               wint_t (32 + y));
   else
+#endif
+#if ENABLE_SGRMOUSE
+  if (mode_sgr)
+    tt_printf ("\033[<%d;%d;%d%c",
+              code + button_number + key_state,
+              x,
+              y,
+              (ev.type == ButtonRelease ? 'm' : 'M'));
+  else
 #endif
     tt_printf ("\033[M%c%c%c",
               code + button_number + key_state,
@@ -2904,7 +2927,7 @@ rxvt_term::process_csi_seq ()
                 scr_soft_reset ();
 
                 static const int pm_h[] = { 7, 25 };
-                static const int pm_l[] = { 1, 3, 4, 5, 6, 9, 66, 1000, 1001, 1005, 1015, 1049 };
+                static const int pm_l[] = { 1, 3, 4, 5, 6, 9, 66, 1000, 1001, 1002, 1003, 1005, 1006, 1015, 1049 };
 
                 process_terminal_mode ('h', 0, ecb_array_length (pm_h), pm_h);
                 process_terminal_mode ('l', 0, ecb_array_length (pm_l), pm_l);
@@ -3710,6 +3733,9 @@ rxvt_term::process_terminal_mode (int mode, int priv ecb_unused, unsigned int na
                   { 1003, PrivMode_MouseAnyEvent },
 #if ENABLE_FRILLS
                   { 1005, PrivMode_ExtModeMouse },
+#endif
+#if ENABLE_SGRMOUSE
+                  { 1006, PrivMode_ExtMouseSgr },
 #endif
                   { 1010, PrivMode_TtyOutputInh }, // rxvt extension
                   { 1011, PrivMode_Keypress }, // rxvt extension
diff --git a/src/rxvt.h b/src/rxvt.h
index 5c7cf66..2ffd3fb 100644
--- a/src/rxvt.h
+++ b/src/rxvt.h
@@ -645,6 +645,7 @@ enum {
 #define PrivMode_ExtModeMouse   (1UL<<23) // xterm pseudo-utf-8 hack
 #define PrivMode_ExtMouseRight  (1UL<<24) // xterm pseudo-utf-8, but works in non-utf-8-locales
 #define PrivMode_BlinkingCursor (1UL<<25)
+#define PrivMode_ExtMouseSgr    (1UL<<27) // sgr mouse extension
 
 #define PrivMode_mouse_report   (PrivMode_MouseX10|PrivMode_MouseX11|PrivMode_MouseBtnEvent|PrivMode_MouseAnyEvent)
 
diff --git a/src/xdefaults.C b/src/xdefaults.C
index 894aa8d..e5952b7 100644
--- a/src/xdefaults.C
+++ b/src/xdefaults.C
@@ -359,6 +359,9 @@ static const char optionsstring[] = "options: "
 #if defined(ENABLE_FRILLS)
                                     "frills,"
 #endif
+#if defined(ENABLE_SGRMOUSE)
+                                    "sgrmouse,"
+#endif
 #if defined(SELECTION_SCROLLING)
                                     "selectionscrolling,"
 #endif