blob: 578dacf96233ad20a99c3a7bd22b58b3f91f37bd [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 Moolenaar3fbd2d72019-04-11 23:56:16 +02008" Helper function to emit a terminal escape code.
9func TerminalEscapeCode(code_xterm, code_sgr, row, col, m)
10 if &ttymouse ==# 'xterm'
11 " need to use byte encoding here.
12 let str = list2str([a:code_xterm, a:col + 0x20, a:row + 0x20])
13 if has('iconv')
14 let bytes = iconv(str, 'utf-8', 'latin1')
15 else
16 " Hopefully the numbers are not too big.
17 let bytes = str
18 endif
19 call feedkeys("\<Esc>[M" .. bytes, 'Lx!')
20 elseif &ttymouse ==# 'sgr'
21 call feedkeys(printf("\<Esc>[<%d;%d;%d%s", a:code_sgr, a:col, a:row, a:m), 'Lx!')
22 endif
23endfunc
24
25func MouseLeftClick(row, col)
26 call TerminalEscapeCode(0x20, 0, a:row, a:col, 'M')
27endfunc
28
29func MouseLeftRelease(row, col)
30 call TerminalEscapeCode(0x23, 3, a:row, a:col, 'm')
31endfunc
32
33func MouseLeftDrag(row, col)
34 call TerminalEscapeCode(0x43, 0x20, a:row, a:col, 'M')
35endfunc
36
37func MouseWheelUp(row, col)
38 call TerminalEscapeCode(0x40, 0x40, a:row, a:col, 'M')
39endfunc
40
41func MouseWheelDown(row, col)
42 call TerminalEscapeCode(0x41, 0x41, a:row, a:col, 'M')
43endfunc
44
Bram Moolenaar905dd902019-04-07 14:21:47 +020045func Test_xterm_mouse_click()
46 new
47 let save_mouse = &mouse
48 let save_term = &term
49 let save_ttymouse = &ttymouse
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020050 set mouse=a term=xterm
Bram Moolenaar905dd902019-04-07 14:21:47 +020051 call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer'])
Bram Moolenaar905dd902019-04-07 14:21:47 +020052
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020053 for ttymouse_val in ['xterm', 'sgr']
Bram Moolenaar49452192019-04-17 16:27:02 +020054 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020055 exe 'set ttymouse=' . ttymouse_val
56 go
Bram Moolenaar49452192019-04-17 16:27:02 +020057 call assert_equal([0, 1, 1, 0], getpos('.'), msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020058 let row = 2
59 let col = 6
60 call MouseLeftClick(row, col)
61 call MouseLeftRelease(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +020062 call assert_equal([0, 2, 6, 0], getpos('.'), msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020063 endfor
Bram Moolenaar905dd902019-04-07 14:21:47 +020064
65 let &mouse = save_mouse
66 let &term = save_term
67 let &ttymouse = save_ttymouse
68 bwipe!
69endfunc
70
Bram Moolenaar049736f2019-04-07 21:55:07 +020071func Test_xterm_mouse_wheel()
72 new
73 let save_mouse = &mouse
74 let save_term = &term
75 let save_ttymouse = &ttymouse
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020076 set mouse=a term=xterm
Bram Moolenaar049736f2019-04-07 21:55:07 +020077 call setline(1, range(1, 100))
78
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020079 for ttymouse_val in ['xterm', 'sgr']
Bram Moolenaar49452192019-04-17 16:27:02 +020080 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020081 exe 'set ttymouse=' . ttymouse_val
82 go
Bram Moolenaar49452192019-04-17 16:27:02 +020083 call assert_equal(1, line('w0'), msg)
84 call assert_equal([0, 1, 1, 0], getpos('.'), msg)
Bram Moolenaar049736f2019-04-07 21:55:07 +020085
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020086 call MouseWheelDown(1, 1)
Bram Moolenaar49452192019-04-17 16:27:02 +020087 call assert_equal(4, line('w0'), msg)
88 call assert_equal([0, 4, 1, 0], getpos('.'), msg)
Bram Moolenaar049736f2019-04-07 21:55:07 +020089
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020090 call MouseWheelDown(1, 1)
Bram Moolenaar49452192019-04-17 16:27:02 +020091 call assert_equal(7, line('w0'), msg)
92 call assert_equal([0, 7, 1, 0], getpos('.'), msg)
Bram Moolenaar049736f2019-04-07 21:55:07 +020093
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020094 call MouseWheelUp(1, 1)
Bram Moolenaar49452192019-04-17 16:27:02 +020095 call assert_equal(4, line('w0'), msg)
96 call assert_equal([0, 7, 1, 0], getpos('.'), msg)
Bram Moolenaar049736f2019-04-07 21:55:07 +020097
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020098 call MouseWheelUp(1, 1)
Bram Moolenaar49452192019-04-17 16:27:02 +020099 call assert_equal(1, line('w0'), msg)
100 call assert_equal([0, 7, 1, 0], getpos('.'), msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200101 endfor
Bram Moolenaar049736f2019-04-07 21:55:07 +0200102
103 let &mouse = save_mouse
104 let &term = save_term
105 let &ttymouse = save_ttymouse
106 bwipe!
107endfunc
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200108
109func Test_xterm_mouse_drag_window_separator()
110 let save_mouse = &mouse
111 let save_term = &term
112 let save_ttymouse = &ttymouse
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200113 set mouse=a term=xterm
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200114
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200115 for ttymouse_val in ['xterm', 'sgr']
Bram Moolenaar49452192019-04-17 16:27:02 +0200116 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200117 exe 'set ttymouse=' . ttymouse_val
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200118
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200119 " Split horizontally and test dragging the horizontal window separator.
120 split
121 let rowseparator = winheight(0) + 1
122 let row = rowseparator
123 let col = 1
Bram Moolenaarc8b3dda2019-04-12 21:42:52 +0200124
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200125 " When 'ttymouse' is 'xterm', row/col bigger than 223 are not supported.
126 if ttymouse_val !=# 'xterm' || row <= 223
127 call MouseLeftClick(row, col)
128 let row -= 1
129 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200130 call assert_equal(rowseparator - 1, winheight(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200131 let row += 1
132 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200133 call assert_equal(rowseparator, winheight(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200134 call MouseLeftRelease(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200135 call assert_equal(rowseparator, winheight(0) + 1, msg)
Bram Moolenaarc8b3dda2019-04-12 21:42:52 +0200136 endif
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200137 bwipe!
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200138
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200139 " Split vertically and test dragging the vertical window separator.
140 vsplit
141 let colseparator = winwidth(0) + 1
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200142 let row = 1
143 let col = colseparator
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200144
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200145 " When 'ttymouse' is 'xterm', row/col bigger than 223 are not supported.
146 if ttymouse_val !=# 'xterm' || col <= 223
147 call MouseLeftClick(row, col)
148 let col -= 1
149 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200150 call assert_equal(colseparator - 1, winwidth(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200151 let col += 1
152 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200153 call assert_equal(colseparator, winwidth(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200154 call MouseLeftRelease(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200155 call assert_equal(colseparator, winwidth(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200156 endif
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200157 bwipe!
158 endfor
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200159
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200160 let &mouse = save_mouse
161 let &term = save_term
162 let &ttymouse = save_ttymouse
163endfunc
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200164
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200165func Test_xterm_mouse_drag_statusline()
166 let save_mouse = &mouse
167 let save_term = &term
168 let save_ttymouse = &ttymouse
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200169 let save_laststatus = &laststatus
170 set mouse=a term=xterm laststatus=2
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200171
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200172 for ttymouse_val in ['xterm', 'sgr']
Bram Moolenaar49452192019-04-17 16:27:02 +0200173 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200174 exe 'set ttymouse=' . ttymouse_val
175
Bram Moolenaar49452192019-04-17 16:27:02 +0200176 call assert_equal(1, &cmdheight, msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200177 let rowstatusline = winheight(0) + 1
178 let row = rowstatusline
179 let col = 1
Bram Moolenaarc8b3dda2019-04-12 21:42:52 +0200180
181 if ttymouse_val ==# 'xterm' && row > 223
182 " When 'ttymouse' is 'xterm', row/col bigger than 223 are not supported.
183 continue
184 endif
185
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200186 call MouseLeftClick(row, col)
187 let row -= 1
188 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200189 call assert_equal(2, &cmdheight, msg)
190 call assert_equal(rowstatusline - 1, winheight(0) + 1, msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200191 let row += 1
192 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200193 call assert_equal(1, &cmdheight, msg)
194 call assert_equal(rowstatusline, winheight(0) + 1, msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200195 call MouseLeftRelease(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200196 call assert_equal(1, &cmdheight, msg)
197 call assert_equal(rowstatusline, winheight(0) + 1, msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200198 endfor
199
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200200 let &mouse = save_mouse
201 let &term = save_term
202 let &ttymouse = save_ttymouse
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200203 let &laststatus = save_laststatus
204endfunc
205
206func Test_xterm_mouse_click_tab()
207 let save_mouse = &mouse
208 let save_term = &term
209 let save_ttymouse = &ttymouse
210 set mouse=a term=xterm
211 let row = 1
212
213 for ttymouse_val in ['xterm', 'sgr']
Bram Moolenaar49452192019-04-17 16:27:02 +0200214 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200215 exe 'set ttymouse=' . ttymouse_val
216 e Xfoo
217 tabnew Xbar
218
219 let a = split(execute(':tabs'), "\n")
220 call assert_equal(['Tab page 1',
221 \ ' Xfoo',
222 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200223 \ '> Xbar'], a, msg)
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200224
225 " Test clicking on tab names in the tabline at the top.
226 let col = 2
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200227 redraw
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200228 call MouseLeftClick(row, col)
229 call MouseLeftRelease(row, col)
230 let a = split(execute(':tabs'), "\n")
231 call assert_equal(['Tab page 1',
232 \ '> Xfoo',
233 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200234 \ ' Xbar'], a, msg)
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200235
236 let col = 9
237 call MouseLeftClick(row, col)
238 call MouseLeftRelease(row, col)
239 let a = split(execute(':tabs'), "\n")
240 call assert_equal(['Tab page 1',
241 \ ' Xfoo',
242 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200243 \ '> Xbar'], a, msg)
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200244
245 %bwipe!
246 endfor
247
248 let &mouse = save_mouse
249 let &term = save_term
250 let &ttymouse = save_ttymouse
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200251endfunc
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200252
253func Test_xterm_mouse_click_X_to_close_tab()
254 let save_mouse = &mouse
255 let save_term = &term
256 let save_ttymouse = &ttymouse
257 set mouse=a term=xterm
258 let row = 1
259 let col = &columns
260
261 for ttymouse_val in ['xterm', 'sgr']
262 if ttymouse_val ==# 'xterm' && col > 223
263 " When 'ttymouse' is 'xterm', row/col bigger than 223 are not supported.
264 continue
265 endif
Bram Moolenaar49452192019-04-17 16:27:02 +0200266 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200267 exe 'set ttymouse=' . ttymouse_val
268 e Xtab1
269 tabnew Xtab2
270 tabnew Xtab3
271 tabn 2
272
273 let a = split(execute(':tabs'), "\n")
274 call assert_equal(['Tab page 1',
275 \ ' Xtab1',
276 \ 'Tab page 2',
277 \ '> Xtab2',
278 \ 'Tab page 3',
Bram Moolenaar49452192019-04-17 16:27:02 +0200279 \ ' Xtab3'], a, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200280
281 " Click on "X" in tabline to close current tab i.e. Xtab2.
282 redraw
283 call MouseLeftClick(row, col)
284 call MouseLeftRelease(row, col)
285 let a = split(execute(':tabs'), "\n")
286 call assert_equal(['Tab page 1',
287 \ ' Xtab1',
288 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200289 \ '> Xtab3'], a, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200290
291 %bwipe!
292 endfor
293
294 let &mouse = save_mouse
295 let &term = save_term
296 let &ttymouse = save_ttymouse
297endfunc
Bram Moolenaare3e38282019-04-15 20:55:31 +0200298
299func Test_xterm_mouse_drag_to_move_tab()
300 let save_mouse = &mouse
301 let save_term = &term
302 let save_ttymouse = &ttymouse
303 " Set 'mousetime' to 1 to avoid recognizing a double-click in the loop
304 set mouse=a term=xterm mousetime=1
305 let row = 1
306
307 for ttymouse_val in ['xterm', 'sgr']
Bram Moolenaar49452192019-04-17 16:27:02 +0200308 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaare3e38282019-04-15 20:55:31 +0200309 exe 'set ttymouse=' . ttymouse_val
310 e Xtab1
311 tabnew Xtab2
312
313 let a = split(execute(':tabs'), "\n")
314 call assert_equal(['Tab page 1',
315 \ ' Xtab1',
316 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200317 \ '> Xtab2'], a, msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200318 redraw
319
320 " Click in tab2 and drag it to tab1.
321 " Check getcharmod() to verify that click is not
322 " interpreted as a spurious double-click.
323 call MouseLeftClick(row, 10)
Bram Moolenaar49452192019-04-17 16:27:02 +0200324 call assert_equal(0, getcharmod(), msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200325 for col in [9, 8, 7, 6]
326 call MouseLeftDrag(row, col)
327 endfor
328 call MouseLeftRelease(row, col)
329 let a = split(execute(':tabs'), "\n")
330 call assert_equal(['Tab page 1',
331 \ '> Xtab2',
332 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200333 \ ' Xtab1'], a, msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200334
Bram Moolenaar7f279762019-04-15 21:48:22 +0200335 " brief sleep to avoid causing a double-click
336 sleep 20m
Bram Moolenaare3e38282019-04-15 20:55:31 +0200337 %bwipe!
338 endfor
339
340 let &mouse = save_mouse
341 let &term = save_term
342 let &ttymouse = save_ttymouse
343 set mousetime&
344endfunc
345
346func Test_xterm_mouse_double_click_to_create_tab()
347 let save_mouse = &mouse
348 let save_term = &term
349 let save_ttymouse = &ttymouse
350 " Set 'mousetime' to a small value, so that double-click works but we don't
351 " have to wait long to avoid a triple-click.
352 set mouse=a term=xterm mousetime=100
353 let row = 1
354 let col = 10
355
356 for ttymouse_val in ['xterm', 'sgr']
Bram Moolenaar49452192019-04-17 16:27:02 +0200357 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaare3e38282019-04-15 20:55:31 +0200358 exe 'set ttymouse=' . ttymouse_val
359 e Xtab1
360 tabnew Xtab2
361
362 let a = split(execute(':tabs'), "\n")
363 call assert_equal(['Tab page 1',
364 \ ' Xtab1',
365 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200366 \ '> Xtab2'], a, msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200367
368 redraw
369 call MouseLeftClick(row, col)
370 " Check getcharmod() to verify that first click is not
371 " interpreted as a spurious double-click.
Bram Moolenaar49452192019-04-17 16:27:02 +0200372 call assert_equal(0, getcharmod(), msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200373 call MouseLeftRelease(row, col)
374 call MouseLeftClick(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200375 call assert_equal(32, getcharmod(), msg) " double-click
Bram Moolenaare3e38282019-04-15 20:55:31 +0200376 call MouseLeftRelease(row, col)
377 let a = split(execute(':tabs'), "\n")
378 call assert_equal(['Tab page 1',
379 \ ' Xtab1',
380 \ 'Tab page 2',
381 \ '> [No Name]',
382 \ 'Tab page 3',
Bram Moolenaar49452192019-04-17 16:27:02 +0200383 \ ' Xtab2'], a, msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200384
385 if ttymouse_val !=# 'sgr'
386 " We need to sleep, or else MouseLeftClick() in next loop
387 " iteration will be interpreted as a spurious triple-click.
388 sleep 100m
389 endif
390 %bwipe!
391 endfor
392
393 let &mouse = save_mouse
394 let &term = save_term
395 let &ttymouse = save_ttymouse
396 set mousetime&
397endfunc
Bram Moolenaar696d6372019-04-17 16:33:46 +0200398
399func Test_xterm_mouse_click_in_fold_columns()
400 new
401 let save_mouse = &mouse
402 let save_term = &term
403 let save_ttymouse = &ttymouse
404 let save_foldcolumn = &foldcolumn
405 set mouse=a term=xterm foldcolumn=3
406
407 " Create 2 nested folds.
408 call setline(1, range(1, 7))
409 2,6fold
410 norm! zR
411 4,5fold
412 call assert_equal([-1, -1, -1, 4, 4, -1, -1],
413 \ map(range(1, 7), 'foldclosed(v:val)'))
414
415 " Click in "+" of inner fold in foldcolumn should open it.
416 redraw
417 let row = 4
418 let col = 2
419 call MouseLeftClick(row, col)
420 call MouseLeftRelease(row, col)
421 call assert_equal([-1, -1, -1, -1, -1, -1, -1],
422 \ map(range(1, 7), 'foldclosed(v:val)'))
423
424 " Click in "-" of outer fold in foldcolumn should close it.
425 redraw
426 let row = 2
427 let col = 1
428 call MouseLeftClick(row, col)
429 call MouseLeftRelease(row, col)
430 call assert_equal([-1, 2, 2, 2, 2, 2, -1],
431 \ map(range(1, 7), 'foldclosed(v:val)'))
432 norm! zR
433
434 " Click in "|" of inner fold in foldcolumn should close it.
435 redraw
436 let row = 5
437 let col = 2
438 call MouseLeftClick(row, col)
439 call MouseLeftRelease(row, col)
440 call assert_equal([-1, -1, -1, 4, 4, -1, -1],
441 \ map(range(1, 7), 'foldclosed(v:val)'))
442
443 let &foldcolumn = save_foldcolumn
444 let &ttymouse = save_ttymouse
445 let &term = save_term
446 let &mouse = save_mouse
447 bwipe!
448endfunc