blob: d8827565e51b068520342f0ae133f02c0f67387c [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 Moolenaar3fbd2d72019-04-11 23:56:16 +020010" Helper function to emit a terminal escape code.
11func TerminalEscapeCode(code_xterm, code_sgr, row, col, m)
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +020012 if &ttymouse ==# 'xterm2'
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020013 " need to use byte encoding here.
14 let str = list2str([a:code_xterm, a:col + 0x20, a:row + 0x20])
15 if has('iconv')
16 let bytes = iconv(str, 'utf-8', 'latin1')
17 else
18 " Hopefully the numbers are not too big.
19 let bytes = str
20 endif
21 call feedkeys("\<Esc>[M" .. bytes, 'Lx!')
22 elseif &ttymouse ==# 'sgr'
23 call feedkeys(printf("\<Esc>[<%d;%d;%d%s", a:code_sgr, a:col, a:row, a:m), 'Lx!')
24 endif
25endfunc
26
27func MouseLeftClick(row, col)
28 call TerminalEscapeCode(0x20, 0, a:row, a:col, 'M')
29endfunc
30
Bram Moolenaarc1b81602019-04-27 19:11:35 +020031func MouseMiddleClick(row, col)
32 call TerminalEscapeCode(0x21, 1, a:row, a:col, 'M')
33endfunc
34
Bram Moolenaar1ee36d62019-05-01 23:13:56 +020035func MouseCtrlLeftClick(row, col)
36 let ctrl = 0x10
37 call TerminalEscapeCode(0x20 + ctrl, 0 + ctrl, a:row, a:col, 'M')
38endfunc
39
40func MouseCtrlRightClick(row, col)
41 let ctrl = 0x10
42 call TerminalEscapeCode(0x22 + ctrl, 2 + ctrl, a:row, a:col, 'M')
43endfunc
44
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020045func MouseLeftRelease(row, col)
46 call TerminalEscapeCode(0x23, 3, a:row, a:col, 'm')
47endfunc
48
Bram Moolenaarc1b81602019-04-27 19:11:35 +020049func MouseMiddleRelease(row, col)
50 call TerminalEscapeCode(0x23, 3, a:row, a:col, 'm')
51endfunc
52
Bram Moolenaar1ee36d62019-05-01 23:13:56 +020053func MouseRightRelease(row, col)
54 call TerminalEscapeCode(0x23, 3, a:row, a:col, 'm')
55endfunc
56
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020057func MouseLeftDrag(row, col)
58 call TerminalEscapeCode(0x43, 0x20, a:row, a:col, 'M')
59endfunc
60
61func MouseWheelUp(row, col)
62 call TerminalEscapeCode(0x40, 0x40, a:row, a:col, 'M')
63endfunc
64
65func MouseWheelDown(row, col)
66 call TerminalEscapeCode(0x41, 0x41, a:row, a:col, 'M')
67endfunc
68
Bram Moolenaarc1b81602019-04-27 19:11:35 +020069func Test_xterm_mouse_left_click()
Bram Moolenaar905dd902019-04-07 14:21:47 +020070 new
71 let save_mouse = &mouse
72 let save_term = &term
73 let save_ttymouse = &ttymouse
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020074 set mouse=a term=xterm
Bram Moolenaar905dd902019-04-07 14:21:47 +020075 call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer'])
Bram Moolenaar905dd902019-04-07 14:21:47 +020076
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +020077 for ttymouse_val in ['xterm2', 'sgr']
Bram Moolenaar49452192019-04-17 16:27:02 +020078 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +020079 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020080 go
Bram Moolenaar49452192019-04-17 16:27:02 +020081 call assert_equal([0, 1, 1, 0], getpos('.'), msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020082 let row = 2
83 let col = 6
84 call MouseLeftClick(row, col)
85 call MouseLeftRelease(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +020086 call assert_equal([0, 2, 6, 0], getpos('.'), msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020087 endfor
Bram Moolenaar905dd902019-04-07 14:21:47 +020088
89 let &mouse = save_mouse
90 let &term = save_term
91 let &ttymouse = save_ttymouse
92 bwipe!
93endfunc
94
Bram Moolenaar1ee36d62019-05-01 23:13:56 +020095" Test that <C-LeftMouse> jumps to help tag and <C-RightMouse> jumps back.
96func Test_xterm_mouse_ctrl_click()
97 let save_mouse = &mouse
98 let save_term = &term
99 let save_ttymouse = &ttymouse
100 set mouse=a term=xterm
101
102 for ttymouse_val in ['xterm2', 'sgr']
103 let msg = 'ttymouse=' .. ttymouse_val
104 exe 'set ttymouse=' .. ttymouse_val
105 help
106 /usr_02.txt
107 norm! zt
108 let row = 1
109 let col = 1
110 call MouseCtrlLeftClick(row, col)
111 call MouseLeftRelease(row, col)
112 call assert_match('usr_02.txt$', bufname('%'), msg)
113 call assert_equal('*usr_02.txt*', expand('<cWORD>'))
114
115 call MouseCtrlRightClick(row, col)
116 call MouseLeftRelease(row, col)
117 call assert_match('help.txt$', bufname('%'), msg)
118 call assert_equal('|usr_02.txt|', expand('<cWORD>'))
119
120 helpclose
121 endfor
122
123 let &mouse = save_mouse
124 let &term = save_term
125 let &ttymouse = save_ttymouse
126endfunc
127
Bram Moolenaarc1b81602019-04-27 19:11:35 +0200128func Test_xterm_mouse_middle_click()
Bram Moolenaar564344a2019-04-28 13:00:12 +0200129 if !WorkingClipboard()
130 throw 'Skipped: No working clipboard'
131 endif
132
Bram Moolenaarc1b81602019-04-27 19:11:35 +0200133 new
134 let save_mouse = &mouse
135 let save_term = &term
136 let save_ttymouse = &ttymouse
137 let save_quotestar = @*
138 let @* = 'abc'
139 set mouse=a term=xterm
140
141 for ttymouse_val in ['xterm2', 'sgr']
142 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200143 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaarc1b81602019-04-27 19:11:35 +0200144 call setline(1, ['123456789', '123456789'])
145
146 " Middle-click in the middle of the line pastes text where clicked.
147 let row = 1
148 let col = 6
149 call MouseMiddleClick(row, col)
150 call MouseMiddleRelease(row, col)
151 call assert_equal(['12345abc6789', '123456789'], getline(1, '$'), msg)
152
153 " Middle-click beyond end of the line pastes text at the end of the line.
154 let col = 20
155 call MouseMiddleClick(row, col)
156 call MouseMiddleRelease(row, col)
157 call assert_equal(['12345abc6789abc', '123456789'], getline(1, '$'), msg)
158
159 " Middle-click beyond the last line pastes in the last line.
160 let row = 5
161 let col = 3
162 call MouseMiddleClick(row, col)
163 call MouseMiddleRelease(row, col)
164 call assert_equal(['12345abc6789abc', '12abc3456789'], getline(1, '$'), msg)
165 endfor
166
167 let &mouse = save_mouse
168 let &term = save_term
169 let &ttymouse = save_ttymouse
170 let @* = save_quotestar
171 bwipe!
172endfunc
173
Bram Moolenaar049736f2019-04-07 21:55:07 +0200174func Test_xterm_mouse_wheel()
175 new
176 let save_mouse = &mouse
177 let save_term = &term
178 let save_ttymouse = &ttymouse
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200179 set mouse=a term=xterm
Bram Moolenaar049736f2019-04-07 21:55:07 +0200180 call setline(1, range(1, 100))
181
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200182 for ttymouse_val in ['xterm2', 'sgr']
Bram Moolenaar49452192019-04-17 16:27:02 +0200183 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200184 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200185 go
Bram Moolenaar49452192019-04-17 16:27:02 +0200186 call assert_equal(1, line('w0'), msg)
187 call assert_equal([0, 1, 1, 0], getpos('.'), msg)
Bram Moolenaar049736f2019-04-07 21:55:07 +0200188
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200189 call MouseWheelDown(1, 1)
Bram Moolenaar49452192019-04-17 16:27:02 +0200190 call assert_equal(4, line('w0'), msg)
191 call assert_equal([0, 4, 1, 0], getpos('.'), msg)
Bram Moolenaar049736f2019-04-07 21:55:07 +0200192
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200193 call MouseWheelDown(1, 1)
Bram Moolenaar49452192019-04-17 16:27:02 +0200194 call assert_equal(7, line('w0'), msg)
195 call assert_equal([0, 7, 1, 0], getpos('.'), msg)
Bram Moolenaar049736f2019-04-07 21:55:07 +0200196
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200197 call MouseWheelUp(1, 1)
Bram Moolenaar49452192019-04-17 16:27:02 +0200198 call assert_equal(4, line('w0'), msg)
199 call assert_equal([0, 7, 1, 0], getpos('.'), msg)
Bram Moolenaar049736f2019-04-07 21:55:07 +0200200
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200201 call MouseWheelUp(1, 1)
Bram Moolenaar49452192019-04-17 16:27:02 +0200202 call assert_equal(1, line('w0'), msg)
203 call assert_equal([0, 7, 1, 0], getpos('.'), msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200204 endfor
Bram Moolenaar049736f2019-04-07 21:55:07 +0200205
206 let &mouse = save_mouse
207 let &term = save_term
208 let &ttymouse = save_ttymouse
209 bwipe!
210endfunc
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200211
212func Test_xterm_mouse_drag_window_separator()
213 let save_mouse = &mouse
214 let save_term = &term
215 let save_ttymouse = &ttymouse
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200216 set mouse=a term=xterm
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200217
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200218 for ttymouse_val in ['xterm2', 'sgr']
Bram Moolenaar49452192019-04-17 16:27:02 +0200219 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200220 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200221
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200222 " Split horizontally and test dragging the horizontal window separator.
223 split
224 let rowseparator = winheight(0) + 1
225 let row = rowseparator
226 let col = 1
Bram Moolenaarc8b3dda2019-04-12 21:42:52 +0200227
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200228 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
229 if ttymouse_val !=# 'xterm2' || row <= 223
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200230 call MouseLeftClick(row, col)
231 let row -= 1
232 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200233 call assert_equal(rowseparator - 1, winheight(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200234 let row += 1
235 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200236 call assert_equal(rowseparator, winheight(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200237 call MouseLeftRelease(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200238 call assert_equal(rowseparator, winheight(0) + 1, msg)
Bram Moolenaarc8b3dda2019-04-12 21:42:52 +0200239 endif
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200240 bwipe!
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200241
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200242 " Split vertically and test dragging the vertical window separator.
243 vsplit
244 let colseparator = winwidth(0) + 1
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200245 let row = 1
246 let col = colseparator
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200247
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200248 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
249 if ttymouse_val !=# 'xterm2' || col <= 223
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200250 call MouseLeftClick(row, col)
251 let col -= 1
252 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200253 call assert_equal(colseparator - 1, winwidth(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200254 let col += 1
255 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200256 call assert_equal(colseparator, winwidth(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200257 call MouseLeftRelease(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200258 call assert_equal(colseparator, winwidth(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200259 endif
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200260 bwipe!
261 endfor
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200262
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200263 let &mouse = save_mouse
264 let &term = save_term
265 let &ttymouse = save_ttymouse
266endfunc
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200267
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200268func Test_xterm_mouse_drag_statusline()
269 let save_mouse = &mouse
270 let save_term = &term
271 let save_ttymouse = &ttymouse
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200272 let save_laststatus = &laststatus
273 set mouse=a term=xterm laststatus=2
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200274
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200275 for ttymouse_val in ['xterm2', 'sgr']
Bram Moolenaar49452192019-04-17 16:27:02 +0200276 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200277 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200278
Bram Moolenaar49452192019-04-17 16:27:02 +0200279 call assert_equal(1, &cmdheight, msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200280 let rowstatusline = winheight(0) + 1
281 let row = rowstatusline
282 let col = 1
Bram Moolenaarc8b3dda2019-04-12 21:42:52 +0200283
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200284 if ttymouse_val ==# 'xterm2' && row > 223
285 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
Bram Moolenaarc8b3dda2019-04-12 21:42:52 +0200286 continue
287 endif
288
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200289 call MouseLeftClick(row, col)
290 let row -= 1
291 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200292 call assert_equal(2, &cmdheight, msg)
293 call assert_equal(rowstatusline - 1, winheight(0) + 1, msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200294 let row += 1
295 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200296 call assert_equal(1, &cmdheight, msg)
297 call assert_equal(rowstatusline, winheight(0) + 1, msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200298 call MouseLeftRelease(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200299 call assert_equal(1, &cmdheight, msg)
300 call assert_equal(rowstatusline, winheight(0) + 1, msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200301 endfor
302
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200303 let &mouse = save_mouse
304 let &term = save_term
305 let &ttymouse = save_ttymouse
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200306 let &laststatus = save_laststatus
307endfunc
308
309func Test_xterm_mouse_click_tab()
310 let save_mouse = &mouse
311 let save_term = &term
312 let save_ttymouse = &ttymouse
313 set mouse=a term=xterm
314 let row = 1
315
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200316 for ttymouse_val in ['xterm2', 'sgr']
Bram Moolenaar49452192019-04-17 16:27:02 +0200317 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200318 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200319 e Xfoo
320 tabnew Xbar
321
322 let a = split(execute(':tabs'), "\n")
323 call assert_equal(['Tab page 1',
324 \ ' Xfoo',
325 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200326 \ '> Xbar'], a, msg)
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200327
328 " Test clicking on tab names in the tabline at the top.
329 let col = 2
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200330 redraw
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200331 call MouseLeftClick(row, col)
332 call MouseLeftRelease(row, col)
333 let a = split(execute(':tabs'), "\n")
334 call assert_equal(['Tab page 1',
335 \ '> Xfoo',
336 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200337 \ ' Xbar'], a, msg)
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200338
339 let col = 9
340 call MouseLeftClick(row, col)
341 call MouseLeftRelease(row, col)
342 let a = split(execute(':tabs'), "\n")
343 call assert_equal(['Tab page 1',
344 \ ' Xfoo',
345 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200346 \ '> Xbar'], a, msg)
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200347
348 %bwipe!
349 endfor
350
351 let &mouse = save_mouse
352 let &term = save_term
353 let &ttymouse = save_ttymouse
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200354endfunc
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200355
356func Test_xterm_mouse_click_X_to_close_tab()
357 let save_mouse = &mouse
358 let save_term = &term
359 let save_ttymouse = &ttymouse
360 set mouse=a term=xterm
361 let row = 1
362 let col = &columns
363
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200364 for ttymouse_val in ['xterm2', 'sgr']
365 if ttymouse_val ==# 'xterm2' && col > 223
366 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200367 continue
368 endif
Bram Moolenaar49452192019-04-17 16:27:02 +0200369 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200370 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200371 e Xtab1
372 tabnew Xtab2
373 tabnew Xtab3
374 tabn 2
375
376 let a = split(execute(':tabs'), "\n")
377 call assert_equal(['Tab page 1',
378 \ ' Xtab1',
379 \ 'Tab page 2',
380 \ '> Xtab2',
381 \ 'Tab page 3',
Bram Moolenaar49452192019-04-17 16:27:02 +0200382 \ ' Xtab3'], a, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200383
384 " Click on "X" in tabline to close current tab i.e. Xtab2.
385 redraw
386 call MouseLeftClick(row, col)
387 call MouseLeftRelease(row, col)
388 let a = split(execute(':tabs'), "\n")
389 call assert_equal(['Tab page 1',
390 \ ' Xtab1',
391 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200392 \ '> Xtab3'], a, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200393
394 %bwipe!
395 endfor
396
397 let &mouse = save_mouse
398 let &term = save_term
399 let &ttymouse = save_ttymouse
400endfunc
Bram Moolenaare3e38282019-04-15 20:55:31 +0200401
402func Test_xterm_mouse_drag_to_move_tab()
403 let save_mouse = &mouse
404 let save_term = &term
405 let save_ttymouse = &ttymouse
406 " Set 'mousetime' to 1 to avoid recognizing a double-click in the loop
407 set mouse=a term=xterm mousetime=1
408 let row = 1
409
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200410 for ttymouse_val in ['xterm2', 'sgr']
Bram Moolenaar49452192019-04-17 16:27:02 +0200411 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200412 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaare3e38282019-04-15 20:55:31 +0200413 e Xtab1
414 tabnew Xtab2
415
416 let a = split(execute(':tabs'), "\n")
417 call assert_equal(['Tab page 1',
418 \ ' Xtab1',
419 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200420 \ '> Xtab2'], a, msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200421 redraw
422
423 " Click in tab2 and drag it to tab1.
424 " Check getcharmod() to verify that click is not
425 " interpreted as a spurious double-click.
426 call MouseLeftClick(row, 10)
Bram Moolenaar49452192019-04-17 16:27:02 +0200427 call assert_equal(0, getcharmod(), msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200428 for col in [9, 8, 7, 6]
429 call MouseLeftDrag(row, col)
430 endfor
431 call MouseLeftRelease(row, col)
432 let a = split(execute(':tabs'), "\n")
433 call assert_equal(['Tab page 1',
434 \ '> Xtab2',
435 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200436 \ ' Xtab1'], a, msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200437
Bram Moolenaar7f279762019-04-15 21:48:22 +0200438 " brief sleep to avoid causing a double-click
439 sleep 20m
Bram Moolenaare3e38282019-04-15 20:55:31 +0200440 %bwipe!
441 endfor
442
443 let &mouse = save_mouse
444 let &term = save_term
445 let &ttymouse = save_ttymouse
446 set mousetime&
447endfunc
448
449func Test_xterm_mouse_double_click_to_create_tab()
450 let save_mouse = &mouse
451 let save_term = &term
452 let save_ttymouse = &ttymouse
453 " Set 'mousetime' to a small value, so that double-click works but we don't
454 " have to wait long to avoid a triple-click.
455 set mouse=a term=xterm mousetime=100
456 let row = 1
457 let col = 10
458
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200459 for ttymouse_val in ['xterm2', 'sgr']
Bram Moolenaar49452192019-04-17 16:27:02 +0200460 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200461 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaare3e38282019-04-15 20:55:31 +0200462 e Xtab1
463 tabnew Xtab2
464
465 let a = split(execute(':tabs'), "\n")
466 call assert_equal(['Tab page 1',
467 \ ' Xtab1',
468 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200469 \ '> Xtab2'], a, msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200470
471 redraw
472 call MouseLeftClick(row, col)
473 " Check getcharmod() to verify that first click is not
474 " interpreted as a spurious double-click.
Bram Moolenaar49452192019-04-17 16:27:02 +0200475 call assert_equal(0, getcharmod(), msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200476 call MouseLeftRelease(row, col)
477 call MouseLeftClick(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200478 call assert_equal(32, getcharmod(), msg) " double-click
Bram Moolenaare3e38282019-04-15 20:55:31 +0200479 call MouseLeftRelease(row, col)
480 let a = split(execute(':tabs'), "\n")
481 call assert_equal(['Tab page 1',
482 \ ' Xtab1',
483 \ 'Tab page 2',
484 \ '> [No Name]',
485 \ 'Tab page 3',
Bram Moolenaar49452192019-04-17 16:27:02 +0200486 \ ' Xtab2'], a, msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200487
488 if ttymouse_val !=# 'sgr'
489 " We need to sleep, or else MouseLeftClick() in next loop
490 " iteration will be interpreted as a spurious triple-click.
491 sleep 100m
492 endif
493 %bwipe!
494 endfor
495
496 let &mouse = save_mouse
497 let &term = save_term
498 let &ttymouse = save_ttymouse
499 set mousetime&
500endfunc
Bram Moolenaar696d6372019-04-17 16:33:46 +0200501
502func Test_xterm_mouse_click_in_fold_columns()
503 new
504 let save_mouse = &mouse
505 let save_term = &term
506 let save_ttymouse = &ttymouse
507 let save_foldcolumn = &foldcolumn
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200508 set mouse=a term=xterm foldcolumn=3 ttymouse=xterm2
Bram Moolenaar696d6372019-04-17 16:33:46 +0200509
510 " Create 2 nested folds.
511 call setline(1, range(1, 7))
512 2,6fold
513 norm! zR
514 4,5fold
515 call assert_equal([-1, -1, -1, 4, 4, -1, -1],
516 \ map(range(1, 7), 'foldclosed(v:val)'))
517
518 " Click in "+" of inner fold in foldcolumn should open it.
519 redraw
520 let row = 4
521 let col = 2
522 call MouseLeftClick(row, col)
523 call MouseLeftRelease(row, col)
524 call assert_equal([-1, -1, -1, -1, -1, -1, -1],
525 \ map(range(1, 7), 'foldclosed(v:val)'))
526
527 " Click in "-" of outer fold in foldcolumn should close it.
528 redraw
529 let row = 2
530 let col = 1
531 call MouseLeftClick(row, col)
532 call MouseLeftRelease(row, col)
533 call assert_equal([-1, 2, 2, 2, 2, 2, -1],
534 \ map(range(1, 7), 'foldclosed(v:val)'))
535 norm! zR
536
537 " Click in "|" of inner fold in foldcolumn should close it.
538 redraw
539 let row = 5
540 let col = 2
541 call MouseLeftClick(row, col)
542 call MouseLeftRelease(row, col)
543 call assert_equal([-1, -1, -1, 4, 4, -1, -1],
544 \ map(range(1, 7), 'foldclosed(v:val)'))
545
546 let &foldcolumn = save_foldcolumn
547 let &ttymouse = save_ttymouse
548 let &term = save_term
549 let &mouse = save_mouse
550 bwipe!
551endfunc