blob: 7c424cd11b72acacd83135e86930ec0984c06fe0 [file] [log] [blame]
Bram Moolenaar905dd902019-04-07 14:21:47 +02001" Tests for decoding escape sequences sent by the terminal.
2
3" This only works for Unix in a terminal
4if has('gui_running') || !has('unix')
5 finish
6endif
7
Bram Moolenaar564344a2019-04-28 13:00:12 +02008source shared.vim
9
Bram Moolenaard0621d82019-05-02 21:12:19 +020010" xterm2 and sgr always work, urxvt is optional.
11let s:test_ttymouse = ['xterm2', 'sgr']
12if has('mouse_urxvt')
13 call add(s:test_ttymouse, 'urxvt')
14endif
15
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020016" Helper function to emit a terminal escape code.
Bram Moolenaard0621d82019-05-02 21:12:19 +020017func TerminalEscapeCode(code, row, col, m)
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +020018 if &ttymouse ==# 'xterm2'
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020019 " need to use byte encoding here.
Bram Moolenaard0621d82019-05-02 21:12:19 +020020 let str = list2str([a:code + 0x20, a:col + 0x20, a:row + 0x20])
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020021 if has('iconv')
22 let bytes = iconv(str, 'utf-8', 'latin1')
23 else
24 " Hopefully the numbers are not too big.
25 let bytes = str
26 endif
27 call feedkeys("\<Esc>[M" .. bytes, 'Lx!')
28 elseif &ttymouse ==# 'sgr'
Bram Moolenaard0621d82019-05-02 21:12:19 +020029 call feedkeys(printf("\<Esc>[<%d;%d;%d%s", a:code, a:col, a:row, a:m), 'Lx!')
30 elseif &ttymouse ==# 'urxvt'
31 call feedkeys(printf("\<Esc>[%d;%d;%dM", a:code + 0x20, a:col, a:row), 'Lx!')
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020032 endif
33endfunc
34
35func MouseLeftClick(row, col)
Bram Moolenaard0621d82019-05-02 21:12:19 +020036 call TerminalEscapeCode(0, a:row, a:col, 'M')
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020037endfunc
38
Bram Moolenaarc1b81602019-04-27 19:11:35 +020039func MouseMiddleClick(row, col)
Bram Moolenaard0621d82019-05-02 21:12:19 +020040 call TerminalEscapeCode(1, a:row, a:col, 'M')
Bram Moolenaarc1b81602019-04-27 19:11:35 +020041endfunc
42
Bram Moolenaar1ee36d62019-05-01 23:13:56 +020043func MouseCtrlLeftClick(row, col)
44 let ctrl = 0x10
Bram Moolenaard0621d82019-05-02 21:12:19 +020045 call TerminalEscapeCode(0 + ctrl, a:row, a:col, 'M')
Bram Moolenaar1ee36d62019-05-01 23:13:56 +020046endfunc
47
48func MouseCtrlRightClick(row, col)
49 let ctrl = 0x10
Bram Moolenaard0621d82019-05-02 21:12:19 +020050 call TerminalEscapeCode(2 + ctrl, a:row, a:col, 'M')
Bram Moolenaar1ee36d62019-05-01 23:13:56 +020051endfunc
52
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020053func MouseLeftRelease(row, col)
Bram Moolenaard0621d82019-05-02 21:12:19 +020054 call TerminalEscapeCode(3, a:row, a:col, 'm')
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020055endfunc
56
Bram Moolenaarc1b81602019-04-27 19:11:35 +020057func MouseMiddleRelease(row, col)
Bram Moolenaard0621d82019-05-02 21:12:19 +020058 call TerminalEscapeCode(3, a:row, a:col, 'm')
Bram Moolenaarc1b81602019-04-27 19:11:35 +020059endfunc
60
Bram Moolenaar1ee36d62019-05-01 23:13:56 +020061func MouseRightRelease(row, col)
Bram Moolenaard0621d82019-05-02 21:12:19 +020062 call TerminalEscapeCode(3, a:row, a:col, 'm')
Bram Moolenaar1ee36d62019-05-01 23:13:56 +020063endfunc
64
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020065func MouseLeftDrag(row, col)
Bram Moolenaard0621d82019-05-02 21:12:19 +020066 call TerminalEscapeCode(0x20, a:row, a:col, 'M')
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020067endfunc
68
69func MouseWheelUp(row, col)
Bram Moolenaard0621d82019-05-02 21:12:19 +020070 call TerminalEscapeCode(0x40, a:row, a:col, 'M')
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020071endfunc
72
73func MouseWheelDown(row, col)
Bram Moolenaard0621d82019-05-02 21:12:19 +020074 call TerminalEscapeCode(0x41, a:row, a:col, 'M')
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020075endfunc
76
Bram Moolenaarc1b81602019-04-27 19:11:35 +020077func Test_xterm_mouse_left_click()
Bram Moolenaar905dd902019-04-07 14:21:47 +020078 new
79 let save_mouse = &mouse
80 let save_term = &term
81 let save_ttymouse = &ttymouse
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020082 set mouse=a term=xterm
Bram Moolenaar905dd902019-04-07 14:21:47 +020083 call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer'])
Bram Moolenaar905dd902019-04-07 14:21:47 +020084
Bram Moolenaard0621d82019-05-02 21:12:19 +020085 for ttymouse_val in s:test_ttymouse
Bram Moolenaar49452192019-04-17 16:27:02 +020086 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +020087 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020088 go
Bram Moolenaar49452192019-04-17 16:27:02 +020089 call assert_equal([0, 1, 1, 0], getpos('.'), msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020090 let row = 2
91 let col = 6
92 call MouseLeftClick(row, col)
93 call MouseLeftRelease(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +020094 call assert_equal([0, 2, 6, 0], getpos('.'), msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020095 endfor
Bram Moolenaar905dd902019-04-07 14:21:47 +020096
97 let &mouse = save_mouse
98 let &term = save_term
99 let &ttymouse = save_ttymouse
100 bwipe!
101endfunc
102
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200103" Test that <C-LeftMouse> jumps to help tag and <C-RightMouse> jumps back.
104func Test_xterm_mouse_ctrl_click()
105 let save_mouse = &mouse
106 let save_term = &term
107 let save_ttymouse = &ttymouse
108 set mouse=a term=xterm
109
Bram Moolenaard0621d82019-05-02 21:12:19 +0200110 for ttymouse_val in s:test_ttymouse
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200111 let msg = 'ttymouse=' .. ttymouse_val
112 exe 'set ttymouse=' .. ttymouse_val
113 help
114 /usr_02.txt
115 norm! zt
116 let row = 1
117 let col = 1
118 call MouseCtrlLeftClick(row, col)
119 call MouseLeftRelease(row, col)
120 call assert_match('usr_02.txt$', bufname('%'), msg)
121 call assert_equal('*usr_02.txt*', expand('<cWORD>'))
122
123 call MouseCtrlRightClick(row, col)
124 call MouseLeftRelease(row, col)
125 call assert_match('help.txt$', bufname('%'), msg)
126 call assert_equal('|usr_02.txt|', expand('<cWORD>'))
127
128 helpclose
129 endfor
130
131 let &mouse = save_mouse
132 let &term = save_term
133 let &ttymouse = save_ttymouse
134endfunc
135
Bram Moolenaarc1b81602019-04-27 19:11:35 +0200136func Test_xterm_mouse_middle_click()
Bram Moolenaar564344a2019-04-28 13:00:12 +0200137 if !WorkingClipboard()
138 throw 'Skipped: No working clipboard'
139 endif
140
Bram Moolenaarc1b81602019-04-27 19:11:35 +0200141 new
142 let save_mouse = &mouse
143 let save_term = &term
144 let save_ttymouse = &ttymouse
145 let save_quotestar = @*
146 let @* = 'abc'
147 set mouse=a term=xterm
148
Bram Moolenaard0621d82019-05-02 21:12:19 +0200149 for ttymouse_val in s:test_ttymouse
Bram Moolenaarc1b81602019-04-27 19:11:35 +0200150 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200151 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaarc1b81602019-04-27 19:11:35 +0200152 call setline(1, ['123456789', '123456789'])
153
154 " Middle-click in the middle of the line pastes text where clicked.
155 let row = 1
156 let col = 6
157 call MouseMiddleClick(row, col)
158 call MouseMiddleRelease(row, col)
159 call assert_equal(['12345abc6789', '123456789'], getline(1, '$'), msg)
160
161 " Middle-click beyond end of the line pastes text at the end of the line.
162 let col = 20
163 call MouseMiddleClick(row, col)
164 call MouseMiddleRelease(row, col)
165 call assert_equal(['12345abc6789abc', '123456789'], getline(1, '$'), msg)
166
167 " Middle-click beyond the last line pastes in the last line.
168 let row = 5
169 let col = 3
170 call MouseMiddleClick(row, col)
171 call MouseMiddleRelease(row, col)
172 call assert_equal(['12345abc6789abc', '12abc3456789'], getline(1, '$'), msg)
173 endfor
174
175 let &mouse = save_mouse
176 let &term = save_term
177 let &ttymouse = save_ttymouse
178 let @* = save_quotestar
179 bwipe!
180endfunc
181
Bram Moolenaar049736f2019-04-07 21:55:07 +0200182func Test_xterm_mouse_wheel()
183 new
184 let save_mouse = &mouse
185 let save_term = &term
186 let save_ttymouse = &ttymouse
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200187 set mouse=a term=xterm
Bram Moolenaar049736f2019-04-07 21:55:07 +0200188 call setline(1, range(1, 100))
189
Bram Moolenaard0621d82019-05-02 21:12:19 +0200190 for ttymouse_val in s:test_ttymouse
Bram Moolenaar49452192019-04-17 16:27:02 +0200191 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200192 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200193 go
Bram Moolenaar49452192019-04-17 16:27:02 +0200194 call assert_equal(1, line('w0'), msg)
195 call assert_equal([0, 1, 1, 0], getpos('.'), msg)
Bram Moolenaar049736f2019-04-07 21:55:07 +0200196
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200197 call MouseWheelDown(1, 1)
Bram Moolenaar49452192019-04-17 16:27:02 +0200198 call assert_equal(4, line('w0'), msg)
199 call assert_equal([0, 4, 1, 0], getpos('.'), msg)
Bram Moolenaar049736f2019-04-07 21:55:07 +0200200
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200201 call MouseWheelDown(1, 1)
Bram Moolenaar49452192019-04-17 16:27:02 +0200202 call assert_equal(7, line('w0'), msg)
203 call assert_equal([0, 7, 1, 0], getpos('.'), msg)
Bram Moolenaar049736f2019-04-07 21:55:07 +0200204
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200205 call MouseWheelUp(1, 1)
Bram Moolenaar49452192019-04-17 16:27:02 +0200206 call assert_equal(4, line('w0'), msg)
207 call assert_equal([0, 7, 1, 0], getpos('.'), msg)
Bram Moolenaar049736f2019-04-07 21:55:07 +0200208
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200209 call MouseWheelUp(1, 1)
Bram Moolenaar49452192019-04-17 16:27:02 +0200210 call assert_equal(1, line('w0'), msg)
211 call assert_equal([0, 7, 1, 0], getpos('.'), msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200212 endfor
Bram Moolenaar049736f2019-04-07 21:55:07 +0200213
214 let &mouse = save_mouse
215 let &term = save_term
216 let &ttymouse = save_ttymouse
217 bwipe!
218endfunc
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200219
220func Test_xterm_mouse_drag_window_separator()
221 let save_mouse = &mouse
222 let save_term = &term
223 let save_ttymouse = &ttymouse
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200224 set mouse=a term=xterm
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200225
Bram Moolenaard0621d82019-05-02 21:12:19 +0200226 for ttymouse_val in s:test_ttymouse
Bram Moolenaar49452192019-04-17 16:27:02 +0200227 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200228 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200229
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200230 " Split horizontally and test dragging the horizontal window separator.
231 split
232 let rowseparator = winheight(0) + 1
233 let row = rowseparator
234 let col = 1
Bram Moolenaarc8b3dda2019-04-12 21:42:52 +0200235
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200236 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
237 if ttymouse_val !=# 'xterm2' || row <= 223
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200238 call MouseLeftClick(row, col)
239 let row -= 1
240 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200241 call assert_equal(rowseparator - 1, winheight(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200242 let row += 1
243 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200244 call assert_equal(rowseparator, winheight(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200245 call MouseLeftRelease(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200246 call assert_equal(rowseparator, winheight(0) + 1, msg)
Bram Moolenaarc8b3dda2019-04-12 21:42:52 +0200247 endif
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200248 bwipe!
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200249
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200250 " Split vertically and test dragging the vertical window separator.
251 vsplit
252 let colseparator = winwidth(0) + 1
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200253 let row = 1
254 let col = colseparator
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200255
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200256 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
257 if ttymouse_val !=# 'xterm2' || col <= 223
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200258 call MouseLeftClick(row, col)
259 let col -= 1
260 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200261 call assert_equal(colseparator - 1, winwidth(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200262 let col += 1
263 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200264 call assert_equal(colseparator, winwidth(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200265 call MouseLeftRelease(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200266 call assert_equal(colseparator, winwidth(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200267 endif
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200268 bwipe!
269 endfor
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200270
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200271 let &mouse = save_mouse
272 let &term = save_term
273 let &ttymouse = save_ttymouse
274endfunc
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200275
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200276func Test_xterm_mouse_drag_statusline()
277 let save_mouse = &mouse
278 let save_term = &term
279 let save_ttymouse = &ttymouse
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200280 let save_laststatus = &laststatus
281 set mouse=a term=xterm laststatus=2
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200282
Bram Moolenaard0621d82019-05-02 21:12:19 +0200283 for ttymouse_val in s:test_ttymouse
Bram Moolenaar49452192019-04-17 16:27:02 +0200284 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200285 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200286
Bram Moolenaar49452192019-04-17 16:27:02 +0200287 call assert_equal(1, &cmdheight, msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200288 let rowstatusline = winheight(0) + 1
289 let row = rowstatusline
290 let col = 1
Bram Moolenaarc8b3dda2019-04-12 21:42:52 +0200291
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200292 if ttymouse_val ==# 'xterm2' && row > 223
293 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
Bram Moolenaarc8b3dda2019-04-12 21:42:52 +0200294 continue
295 endif
296
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200297 call MouseLeftClick(row, col)
298 let row -= 1
299 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200300 call assert_equal(2, &cmdheight, msg)
301 call assert_equal(rowstatusline - 1, winheight(0) + 1, msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200302 let row += 1
303 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200304 call assert_equal(1, &cmdheight, msg)
305 call assert_equal(rowstatusline, winheight(0) + 1, msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200306 call MouseLeftRelease(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200307 call assert_equal(1, &cmdheight, msg)
308 call assert_equal(rowstatusline, winheight(0) + 1, msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200309 endfor
310
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200311 let &mouse = save_mouse
312 let &term = save_term
313 let &ttymouse = save_ttymouse
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200314 let &laststatus = save_laststatus
315endfunc
316
317func Test_xterm_mouse_click_tab()
318 let save_mouse = &mouse
319 let save_term = &term
320 let save_ttymouse = &ttymouse
321 set mouse=a term=xterm
322 let row = 1
323
Bram Moolenaard0621d82019-05-02 21:12:19 +0200324 for ttymouse_val in s:test_ttymouse
Bram Moolenaar49452192019-04-17 16:27:02 +0200325 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200326 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200327 e Xfoo
328 tabnew Xbar
329
330 let a = split(execute(':tabs'), "\n")
331 call assert_equal(['Tab page 1',
332 \ ' Xfoo',
333 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200334 \ '> Xbar'], a, msg)
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200335
336 " Test clicking on tab names in the tabline at the top.
337 let col = 2
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200338 redraw
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200339 call MouseLeftClick(row, col)
340 call MouseLeftRelease(row, col)
341 let a = split(execute(':tabs'), "\n")
342 call assert_equal(['Tab page 1',
343 \ '> Xfoo',
344 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200345 \ ' Xbar'], a, msg)
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200346
347 let col = 9
348 call MouseLeftClick(row, col)
349 call MouseLeftRelease(row, col)
350 let a = split(execute(':tabs'), "\n")
351 call assert_equal(['Tab page 1',
352 \ ' Xfoo',
353 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200354 \ '> Xbar'], a, msg)
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200355
356 %bwipe!
357 endfor
358
359 let &mouse = save_mouse
360 let &term = save_term
361 let &ttymouse = save_ttymouse
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200362endfunc
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200363
364func Test_xterm_mouse_click_X_to_close_tab()
365 let save_mouse = &mouse
366 let save_term = &term
367 let save_ttymouse = &ttymouse
368 set mouse=a term=xterm
369 let row = 1
370 let col = &columns
371
Bram Moolenaard0621d82019-05-02 21:12:19 +0200372 for ttymouse_val in s:test_ttymouse
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200373 if ttymouse_val ==# 'xterm2' && col > 223
374 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200375 continue
376 endif
Bram Moolenaar49452192019-04-17 16:27:02 +0200377 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200378 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200379 e Xtab1
380 tabnew Xtab2
381 tabnew Xtab3
382 tabn 2
383
384 let a = split(execute(':tabs'), "\n")
385 call assert_equal(['Tab page 1',
386 \ ' Xtab1',
387 \ 'Tab page 2',
388 \ '> Xtab2',
389 \ 'Tab page 3',
Bram Moolenaar49452192019-04-17 16:27:02 +0200390 \ ' Xtab3'], a, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200391
392 " Click on "X" in tabline to close current tab i.e. Xtab2.
393 redraw
394 call MouseLeftClick(row, col)
395 call MouseLeftRelease(row, col)
396 let a = split(execute(':tabs'), "\n")
397 call assert_equal(['Tab page 1',
398 \ ' Xtab1',
399 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200400 \ '> Xtab3'], a, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200401
402 %bwipe!
403 endfor
404
405 let &mouse = save_mouse
406 let &term = save_term
407 let &ttymouse = save_ttymouse
408endfunc
Bram Moolenaare3e38282019-04-15 20:55:31 +0200409
410func Test_xterm_mouse_drag_to_move_tab()
411 let save_mouse = &mouse
412 let save_term = &term
413 let save_ttymouse = &ttymouse
414 " Set 'mousetime' to 1 to avoid recognizing a double-click in the loop
415 set mouse=a term=xterm mousetime=1
416 let row = 1
417
Bram Moolenaard0621d82019-05-02 21:12:19 +0200418 for ttymouse_val in s:test_ttymouse
Bram Moolenaar49452192019-04-17 16:27:02 +0200419 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200420 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaare3e38282019-04-15 20:55:31 +0200421 e Xtab1
422 tabnew Xtab2
423
424 let a = split(execute(':tabs'), "\n")
425 call assert_equal(['Tab page 1',
426 \ ' Xtab1',
427 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200428 \ '> Xtab2'], a, msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200429 redraw
430
431 " Click in tab2 and drag it to tab1.
432 " Check getcharmod() to verify that click is not
433 " interpreted as a spurious double-click.
434 call MouseLeftClick(row, 10)
Bram Moolenaar49452192019-04-17 16:27:02 +0200435 call assert_equal(0, getcharmod(), msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200436 for col in [9, 8, 7, 6]
437 call MouseLeftDrag(row, col)
438 endfor
439 call MouseLeftRelease(row, col)
440 let a = split(execute(':tabs'), "\n")
441 call assert_equal(['Tab page 1',
442 \ '> Xtab2',
443 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200444 \ ' Xtab1'], a, msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200445
Bram Moolenaar7f279762019-04-15 21:48:22 +0200446 " brief sleep to avoid causing a double-click
447 sleep 20m
Bram Moolenaare3e38282019-04-15 20:55:31 +0200448 %bwipe!
449 endfor
450
451 let &mouse = save_mouse
452 let &term = save_term
453 let &ttymouse = save_ttymouse
454 set mousetime&
455endfunc
456
457func Test_xterm_mouse_double_click_to_create_tab()
458 let save_mouse = &mouse
459 let save_term = &term
460 let save_ttymouse = &ttymouse
461 " Set 'mousetime' to a small value, so that double-click works but we don't
462 " have to wait long to avoid a triple-click.
463 set mouse=a term=xterm mousetime=100
464 let row = 1
465 let col = 10
466
Bram Moolenaard0621d82019-05-02 21:12:19 +0200467 let round = 0
468 for ttymouse_val in s:test_ttymouse
Bram Moolenaar49452192019-04-17 16:27:02 +0200469 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200470 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaare3e38282019-04-15 20:55:31 +0200471 e Xtab1
472 tabnew Xtab2
473
Bram Moolenaard0621d82019-05-02 21:12:19 +0200474 if round > 0
475 " We need to sleep, or else the first MouseLeftClick() will be
476 " interpreted as a spurious triple-click.
477 sleep 100m
478 endif
479 let round += 1
480
Bram Moolenaare3e38282019-04-15 20:55:31 +0200481 let a = split(execute(':tabs'), "\n")
482 call assert_equal(['Tab page 1',
483 \ ' Xtab1',
484 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200485 \ '> Xtab2'], a, msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200486
487 redraw
488 call MouseLeftClick(row, col)
489 " Check getcharmod() to verify that first click is not
490 " interpreted as a spurious double-click.
Bram Moolenaar49452192019-04-17 16:27:02 +0200491 call assert_equal(0, getcharmod(), msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200492 call MouseLeftRelease(row, col)
493 call MouseLeftClick(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200494 call assert_equal(32, getcharmod(), msg) " double-click
Bram Moolenaare3e38282019-04-15 20:55:31 +0200495 call MouseLeftRelease(row, col)
496 let a = split(execute(':tabs'), "\n")
497 call assert_equal(['Tab page 1',
498 \ ' Xtab1',
499 \ 'Tab page 2',
500 \ '> [No Name]',
501 \ 'Tab page 3',
Bram Moolenaar49452192019-04-17 16:27:02 +0200502 \ ' Xtab2'], a, msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200503
Bram Moolenaare3e38282019-04-15 20:55:31 +0200504 %bwipe!
505 endfor
506
507 let &mouse = save_mouse
508 let &term = save_term
509 let &ttymouse = save_ttymouse
510 set mousetime&
511endfunc
Bram Moolenaar696d6372019-04-17 16:33:46 +0200512
513func Test_xterm_mouse_click_in_fold_columns()
514 new
515 let save_mouse = &mouse
516 let save_term = &term
517 let save_ttymouse = &ttymouse
518 let save_foldcolumn = &foldcolumn
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200519 set mouse=a term=xterm foldcolumn=3 ttymouse=xterm2
Bram Moolenaar696d6372019-04-17 16:33:46 +0200520
521 " Create 2 nested folds.
522 call setline(1, range(1, 7))
523 2,6fold
524 norm! zR
525 4,5fold
526 call assert_equal([-1, -1, -1, 4, 4, -1, -1],
527 \ map(range(1, 7), 'foldclosed(v:val)'))
528
529 " Click in "+" of inner fold in foldcolumn should open it.
530 redraw
531 let row = 4
532 let col = 2
533 call MouseLeftClick(row, col)
534 call MouseLeftRelease(row, col)
535 call assert_equal([-1, -1, -1, -1, -1, -1, -1],
536 \ map(range(1, 7), 'foldclosed(v:val)'))
537
538 " Click in "-" of outer fold in foldcolumn should close it.
539 redraw
540 let row = 2
541 let col = 1
542 call MouseLeftClick(row, col)
543 call MouseLeftRelease(row, col)
544 call assert_equal([-1, 2, 2, 2, 2, 2, -1],
545 \ map(range(1, 7), 'foldclosed(v:val)'))
546 norm! zR
547
548 " Click in "|" of inner fold in foldcolumn should close it.
549 redraw
550 let row = 5
551 let col = 2
552 call MouseLeftClick(row, col)
553 call MouseLeftRelease(row, col)
554 call assert_equal([-1, -1, -1, 4, 4, -1, -1],
555 \ map(range(1, 7), 'foldclosed(v:val)'))
556
557 let &foldcolumn = save_foldcolumn
558 let &ttymouse = save_ttymouse
559 let &term = save_term
560 let &mouse = save_mouse
561 bwipe!
562endfunc