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
|