1905dd905SBram Moolenaar" Tests for decoding escape sequences sent by the terminal.
2905dd905SBram Moolenaar
3905dd905SBram Moolenaar" This only works for Unix in a terminal
4905dd905SBram Moolenaarif has('gui_running') || !has('unix')
5905dd905SBram Moolenaar  finish
6905dd905SBram Moolenaarendif
7905dd905SBram Moolenaar
8564344acSBram Moolenaarsource shared.vim
9564344acSBram Moolenaar
10*d0621d85SBram Moolenaar" xterm2 and sgr always work, urxvt is optional.
11*d0621d85SBram Moolenaarlet s:test_ttymouse = ['xterm2', 'sgr']
12*d0621d85SBram Moolenaarif has('mouse_urxvt')
13*d0621d85SBram Moolenaar  call add(s:test_ttymouse, 'urxvt')
14*d0621d85SBram Moolenaarendif
15*d0621d85SBram Moolenaar
163fbd2d7cSBram Moolenaar" Helper function to emit a terminal escape code.
17*d0621d85SBram Moolenaarfunc TerminalEscapeCode(code, row, col, m)
182b00b9b0SBram Moolenaar  if &ttymouse ==# 'xterm2'
193fbd2d7cSBram Moolenaar    " need to use byte encoding here.
20*d0621d85SBram Moolenaar    let str = list2str([a:code + 0x20, a:col + 0x20, a:row + 0x20])
213fbd2d7cSBram Moolenaar    if has('iconv')
223fbd2d7cSBram Moolenaar      let bytes = iconv(str, 'utf-8', 'latin1')
233fbd2d7cSBram Moolenaar    else
243fbd2d7cSBram Moolenaar      " Hopefully the numbers are not too big.
253fbd2d7cSBram Moolenaar      let bytes = str
263fbd2d7cSBram Moolenaar    endif
273fbd2d7cSBram Moolenaar    call feedkeys("\<Esc>[M" .. bytes, 'Lx!')
283fbd2d7cSBram Moolenaar  elseif &ttymouse ==# 'sgr'
29*d0621d85SBram Moolenaar    call feedkeys(printf("\<Esc>[<%d;%d;%d%s", a:code, a:col, a:row, a:m), 'Lx!')
30*d0621d85SBram Moolenaar  elseif &ttymouse ==# 'urxvt'
31*d0621d85SBram Moolenaar    call feedkeys(printf("\<Esc>[%d;%d;%dM", a:code + 0x20, a:col, a:row), 'Lx!')
323fbd2d7cSBram Moolenaar  endif
333fbd2d7cSBram Moolenaarendfunc
343fbd2d7cSBram Moolenaar
353fbd2d7cSBram Moolenaarfunc MouseLeftClick(row, col)
36*d0621d85SBram Moolenaar  call TerminalEscapeCode(0, a:row, a:col, 'M')
373fbd2d7cSBram Moolenaarendfunc
383fbd2d7cSBram Moolenaar
39c1b8160bSBram Moolenaarfunc MouseMiddleClick(row, col)
40*d0621d85SBram Moolenaar  call TerminalEscapeCode(1, a:row, a:col, 'M')
41c1b8160bSBram Moolenaarendfunc
42c1b8160bSBram Moolenaar
431ee36d6fSBram Moolenaarfunc MouseCtrlLeftClick(row, col)
441ee36d6fSBram Moolenaar  let ctrl = 0x10
45*d0621d85SBram Moolenaar  call TerminalEscapeCode(0 + ctrl, a:row, a:col, 'M')
461ee36d6fSBram Moolenaarendfunc
471ee36d6fSBram Moolenaar
481ee36d6fSBram Moolenaarfunc MouseCtrlRightClick(row, col)
491ee36d6fSBram Moolenaar  let ctrl = 0x10
50*d0621d85SBram Moolenaar  call TerminalEscapeCode(2 + ctrl, a:row, a:col, 'M')
511ee36d6fSBram Moolenaarendfunc
521ee36d6fSBram Moolenaar
533fbd2d7cSBram Moolenaarfunc MouseLeftRelease(row, col)
54*d0621d85SBram Moolenaar  call TerminalEscapeCode(3, a:row, a:col, 'm')
553fbd2d7cSBram Moolenaarendfunc
563fbd2d7cSBram Moolenaar
57c1b8160bSBram Moolenaarfunc MouseMiddleRelease(row, col)
58*d0621d85SBram Moolenaar  call TerminalEscapeCode(3, a:row, a:col, 'm')
59c1b8160bSBram Moolenaarendfunc
60c1b8160bSBram Moolenaar
611ee36d6fSBram Moolenaarfunc MouseRightRelease(row, col)
62*d0621d85SBram Moolenaar  call TerminalEscapeCode(3, a:row, a:col, 'm')
631ee36d6fSBram Moolenaarendfunc
641ee36d6fSBram Moolenaar
653fbd2d7cSBram Moolenaarfunc MouseLeftDrag(row, col)
66*d0621d85SBram Moolenaar  call TerminalEscapeCode(0x20, a:row, a:col, 'M')
673fbd2d7cSBram Moolenaarendfunc
683fbd2d7cSBram Moolenaar
693fbd2d7cSBram Moolenaarfunc MouseWheelUp(row, col)
70*d0621d85SBram Moolenaar  call TerminalEscapeCode(0x40, a:row, a:col, 'M')
713fbd2d7cSBram Moolenaarendfunc
723fbd2d7cSBram Moolenaar
733fbd2d7cSBram Moolenaarfunc MouseWheelDown(row, col)
74*d0621d85SBram Moolenaar  call TerminalEscapeCode(0x41, a:row, a:col, 'M')
753fbd2d7cSBram Moolenaarendfunc
763fbd2d7cSBram Moolenaar
77c1b8160bSBram Moolenaarfunc Test_xterm_mouse_left_click()
78905dd905SBram Moolenaar  new
79905dd905SBram Moolenaar  let save_mouse = &mouse
80905dd905SBram Moolenaar  let save_term = &term
81905dd905SBram Moolenaar  let save_ttymouse = &ttymouse
823fbd2d7cSBram Moolenaar  set mouse=a term=xterm
83905dd905SBram Moolenaar  call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer'])
84905dd905SBram Moolenaar
85*d0621d85SBram Moolenaar  for ttymouse_val in s:test_ttymouse
864945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
871ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
883fbd2d7cSBram Moolenaar    go
894945219bSBram Moolenaar    call assert_equal([0, 1, 1, 0], getpos('.'), msg)
903fbd2d7cSBram Moolenaar    let row = 2
913fbd2d7cSBram Moolenaar    let col = 6
923fbd2d7cSBram Moolenaar    call MouseLeftClick(row, col)
933fbd2d7cSBram Moolenaar    call MouseLeftRelease(row, col)
944945219bSBram Moolenaar    call assert_equal([0, 2, 6, 0], getpos('.'), msg)
953fbd2d7cSBram Moolenaar  endfor
96905dd905SBram Moolenaar
97905dd905SBram Moolenaar  let &mouse = save_mouse
98905dd905SBram Moolenaar  let &term = save_term
99905dd905SBram Moolenaar  let &ttymouse = save_ttymouse
100905dd905SBram Moolenaar  bwipe!
101905dd905SBram Moolenaarendfunc
102905dd905SBram Moolenaar
1031ee36d6fSBram Moolenaar" Test that <C-LeftMouse> jumps to help tag and <C-RightMouse> jumps back.
1041ee36d6fSBram Moolenaarfunc Test_xterm_mouse_ctrl_click()
1051ee36d6fSBram Moolenaar  let save_mouse = &mouse
1061ee36d6fSBram Moolenaar  let save_term = &term
1071ee36d6fSBram Moolenaar  let save_ttymouse = &ttymouse
1081ee36d6fSBram Moolenaar  set mouse=a term=xterm
1091ee36d6fSBram Moolenaar
110*d0621d85SBram Moolenaar  for ttymouse_val in s:test_ttymouse
1111ee36d6fSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
1121ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
1131ee36d6fSBram Moolenaar    help
1141ee36d6fSBram Moolenaar    /usr_02.txt
1151ee36d6fSBram Moolenaar    norm! zt
1161ee36d6fSBram Moolenaar    let row = 1
1171ee36d6fSBram Moolenaar    let col = 1
1181ee36d6fSBram Moolenaar    call MouseCtrlLeftClick(row, col)
1191ee36d6fSBram Moolenaar    call MouseLeftRelease(row, col)
1201ee36d6fSBram Moolenaar    call assert_match('usr_02.txt$', bufname('%'), msg)
1211ee36d6fSBram Moolenaar    call assert_equal('*usr_02.txt*', expand('<cWORD>'))
1221ee36d6fSBram Moolenaar
1231ee36d6fSBram Moolenaar    call MouseCtrlRightClick(row, col)
1241ee36d6fSBram Moolenaar    call MouseLeftRelease(row, col)
1251ee36d6fSBram Moolenaar    call assert_match('help.txt$', bufname('%'), msg)
1261ee36d6fSBram Moolenaar    call assert_equal('|usr_02.txt|', expand('<cWORD>'))
1271ee36d6fSBram Moolenaar
1281ee36d6fSBram Moolenaar    helpclose
1291ee36d6fSBram Moolenaar  endfor
1301ee36d6fSBram Moolenaar
1311ee36d6fSBram Moolenaar  let &mouse = save_mouse
1321ee36d6fSBram Moolenaar  let &term = save_term
1331ee36d6fSBram Moolenaar  let &ttymouse = save_ttymouse
1341ee36d6fSBram Moolenaarendfunc
1351ee36d6fSBram Moolenaar
136c1b8160bSBram Moolenaarfunc Test_xterm_mouse_middle_click()
137564344acSBram Moolenaar  if !WorkingClipboard()
138564344acSBram Moolenaar    throw 'Skipped: No working clipboard'
139564344acSBram Moolenaar  endif
140564344acSBram Moolenaar
141c1b8160bSBram Moolenaar  new
142c1b8160bSBram Moolenaar  let save_mouse = &mouse
143c1b8160bSBram Moolenaar  let save_term = &term
144c1b8160bSBram Moolenaar  let save_ttymouse = &ttymouse
145c1b8160bSBram Moolenaar  let save_quotestar = @*
146c1b8160bSBram Moolenaar  let @* = 'abc'
147c1b8160bSBram Moolenaar  set mouse=a term=xterm
148c1b8160bSBram Moolenaar
149*d0621d85SBram Moolenaar  for ttymouse_val in s:test_ttymouse
150c1b8160bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
1511ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
152c1b8160bSBram Moolenaar    call setline(1, ['123456789', '123456789'])
153c1b8160bSBram Moolenaar
154c1b8160bSBram Moolenaar    " Middle-click in the middle of the line pastes text where clicked.
155c1b8160bSBram Moolenaar    let row = 1
156c1b8160bSBram Moolenaar    let col = 6
157c1b8160bSBram Moolenaar    call MouseMiddleClick(row, col)
158c1b8160bSBram Moolenaar    call MouseMiddleRelease(row, col)
159c1b8160bSBram Moolenaar    call assert_equal(['12345abc6789', '123456789'], getline(1, '$'), msg)
160c1b8160bSBram Moolenaar
161c1b8160bSBram Moolenaar    " Middle-click beyond end of the line pastes text at the end of the line.
162c1b8160bSBram Moolenaar    let col = 20
163c1b8160bSBram Moolenaar    call MouseMiddleClick(row, col)
164c1b8160bSBram Moolenaar    call MouseMiddleRelease(row, col)
165c1b8160bSBram Moolenaar    call assert_equal(['12345abc6789abc', '123456789'], getline(1, '$'), msg)
166c1b8160bSBram Moolenaar
167c1b8160bSBram Moolenaar    " Middle-click beyond the last line pastes in the last line.
168c1b8160bSBram Moolenaar    let row = 5
169c1b8160bSBram Moolenaar    let col = 3
170c1b8160bSBram Moolenaar    call MouseMiddleClick(row, col)
171c1b8160bSBram Moolenaar    call MouseMiddleRelease(row, col)
172c1b8160bSBram Moolenaar    call assert_equal(['12345abc6789abc', '12abc3456789'], getline(1, '$'), msg)
173c1b8160bSBram Moolenaar  endfor
174c1b8160bSBram Moolenaar
175c1b8160bSBram Moolenaar  let &mouse = save_mouse
176c1b8160bSBram Moolenaar  let &term = save_term
177c1b8160bSBram Moolenaar  let &ttymouse = save_ttymouse
178c1b8160bSBram Moolenaar  let @* = save_quotestar
179c1b8160bSBram Moolenaar  bwipe!
180c1b8160bSBram Moolenaarendfunc
181c1b8160bSBram Moolenaar
182049736faSBram Moolenaarfunc Test_xterm_mouse_wheel()
183049736faSBram Moolenaar  new
184049736faSBram Moolenaar  let save_mouse = &mouse
185049736faSBram Moolenaar  let save_term = &term
186049736faSBram Moolenaar  let save_ttymouse = &ttymouse
1873fbd2d7cSBram Moolenaar  set mouse=a term=xterm
188049736faSBram Moolenaar  call setline(1, range(1, 100))
189049736faSBram Moolenaar
190*d0621d85SBram Moolenaar  for ttymouse_val in s:test_ttymouse
1914945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
1921ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
193049736faSBram Moolenaar    go
1944945219bSBram Moolenaar    call assert_equal(1, line('w0'), msg)
1954945219bSBram Moolenaar    call assert_equal([0, 1, 1, 0], getpos('.'), msg)
1963fbd2d7cSBram Moolenaar
1973fbd2d7cSBram Moolenaar    call MouseWheelDown(1, 1)
1984945219bSBram Moolenaar    call assert_equal(4, line('w0'), msg)
1994945219bSBram Moolenaar    call assert_equal([0, 4, 1, 0], getpos('.'), msg)
2003fbd2d7cSBram Moolenaar
2013fbd2d7cSBram Moolenaar    call MouseWheelDown(1, 1)
2024945219bSBram Moolenaar    call assert_equal(7, line('w0'), msg)
2034945219bSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
204049736faSBram Moolenaar
2053fbd2d7cSBram Moolenaar    call MouseWheelUp(1, 1)
2064945219bSBram Moolenaar    call assert_equal(4, line('w0'), msg)
2074945219bSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
2083fbd2d7cSBram Moolenaar
2093fbd2d7cSBram Moolenaar    call MouseWheelUp(1, 1)
2104945219bSBram Moolenaar    call assert_equal(1, line('w0'), msg)
2114945219bSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
2123fbd2d7cSBram Moolenaar  endfor
213049736faSBram Moolenaar
214049736faSBram Moolenaar  let &mouse = save_mouse
215049736faSBram Moolenaar  let &term = save_term
216049736faSBram Moolenaar  let &ttymouse = save_ttymouse
217049736faSBram Moolenaar  bwipe!
218049736faSBram Moolenaarendfunc
2193fb01a53SBram Moolenaar
2203fb01a53SBram Moolenaarfunc Test_xterm_mouse_drag_window_separator()
2213fb01a53SBram Moolenaar  let save_mouse = &mouse
2223fb01a53SBram Moolenaar  let save_term = &term
2233fb01a53SBram Moolenaar  let save_ttymouse = &ttymouse
2243fbd2d7cSBram Moolenaar  set mouse=a term=xterm
2253fbd2d7cSBram Moolenaar
226*d0621d85SBram Moolenaar  for ttymouse_val in s:test_ttymouse
2274945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
2281ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
2293fb01a53SBram Moolenaar
2303fb01a53SBram Moolenaar    " Split horizontally and test dragging the horizontal window separator.
2313fb01a53SBram Moolenaar    split
2323fb01a53SBram Moolenaar    let rowseparator = winheight(0) + 1
2333fb01a53SBram Moolenaar    let row = rowseparator
2343fb01a53SBram Moolenaar    let col = 1
235c8b3ddabSBram Moolenaar
2362b00b9b0SBram Moolenaar    " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
2372b00b9b0SBram Moolenaar    if ttymouse_val !=# 'xterm2' || row <= 223
2383fbd2d7cSBram Moolenaar      call MouseLeftClick(row, col)
2393fb01a53SBram Moolenaar      let row -= 1
2403fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
2414945219bSBram Moolenaar      call assert_equal(rowseparator - 1, winheight(0) + 1, msg)
2423fb01a53SBram Moolenaar      let row += 1
2433fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
2444945219bSBram Moolenaar      call assert_equal(rowseparator, winheight(0) + 1, msg)
2453fbd2d7cSBram Moolenaar      call MouseLeftRelease(row, col)
2464945219bSBram Moolenaar      call assert_equal(rowseparator, winheight(0) + 1, msg)
24739f76c6aSBram Moolenaar    endif
2483fb01a53SBram Moolenaar    bwipe!
2493fb01a53SBram Moolenaar
2503fb01a53SBram Moolenaar    " Split vertically and test dragging the vertical window separator.
2513fb01a53SBram Moolenaar    vsplit
2523fb01a53SBram Moolenaar    let colseparator = winwidth(0) + 1
2533fb01a53SBram Moolenaar    let row = 1
2543fb01a53SBram Moolenaar    let col = colseparator
25539f76c6aSBram Moolenaar
2562b00b9b0SBram Moolenaar    " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
2572b00b9b0SBram Moolenaar    if ttymouse_val !=# 'xterm2' || col <= 223
2583fbd2d7cSBram Moolenaar      call MouseLeftClick(row, col)
2593fb01a53SBram Moolenaar      let col -= 1
2603fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
2614945219bSBram Moolenaar      call assert_equal(colseparator - 1, winwidth(0) + 1, msg)
2623fb01a53SBram Moolenaar      let col += 1
2633fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
2644945219bSBram Moolenaar      call assert_equal(colseparator, winwidth(0) + 1, msg)
2653fbd2d7cSBram Moolenaar      call MouseLeftRelease(row, col)
2664945219bSBram Moolenaar      call assert_equal(colseparator, winwidth(0) + 1, msg)
26739f76c6aSBram Moolenaar    endif
2683fb01a53SBram Moolenaar    bwipe!
2693fbd2d7cSBram Moolenaar  endfor
2703fbd2d7cSBram Moolenaar
2713fbd2d7cSBram Moolenaar  let &mouse = save_mouse
2723fbd2d7cSBram Moolenaar  let &term = save_term
2733fbd2d7cSBram Moolenaar  let &ttymouse = save_ttymouse
2743fbd2d7cSBram Moolenaarendfunc
2753fbd2d7cSBram Moolenaar
2763fbd2d7cSBram Moolenaarfunc Test_xterm_mouse_drag_statusline()
2773fbd2d7cSBram Moolenaar  let save_mouse = &mouse
2783fbd2d7cSBram Moolenaar  let save_term = &term
2793fbd2d7cSBram Moolenaar  let save_ttymouse = &ttymouse
280ca57ab54SBram Moolenaar  let save_laststatus = &laststatus
281ca57ab54SBram Moolenaar  set mouse=a term=xterm laststatus=2
2823fbd2d7cSBram Moolenaar
283*d0621d85SBram Moolenaar  for ttymouse_val in s:test_ttymouse
2844945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
2851ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
2863fbd2d7cSBram Moolenaar
2874945219bSBram Moolenaar    call assert_equal(1, &cmdheight, msg)
2883fbd2d7cSBram Moolenaar    let rowstatusline = winheight(0) + 1
2893fbd2d7cSBram Moolenaar    let row = rowstatusline
2903fbd2d7cSBram Moolenaar    let col = 1
291c8b3ddabSBram Moolenaar
2922b00b9b0SBram Moolenaar    if ttymouse_val ==# 'xterm2' && row > 223
2932b00b9b0SBram Moolenaar      " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
294c8b3ddabSBram Moolenaar      continue
295c8b3ddabSBram Moolenaar    endif
296c8b3ddabSBram Moolenaar
2973fbd2d7cSBram Moolenaar    call MouseLeftClick(row, col)
2983fbd2d7cSBram Moolenaar    let row -= 1
2993fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
3004945219bSBram Moolenaar    call assert_equal(2, &cmdheight, msg)
3014945219bSBram Moolenaar    call assert_equal(rowstatusline - 1, winheight(0) + 1, msg)
3023fbd2d7cSBram Moolenaar    let row += 1
3033fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
3044945219bSBram Moolenaar    call assert_equal(1, &cmdheight, msg)
3054945219bSBram Moolenaar    call assert_equal(rowstatusline, winheight(0) + 1, msg)
3063fbd2d7cSBram Moolenaar    call MouseLeftRelease(row, col)
3074945219bSBram Moolenaar    call assert_equal(1, &cmdheight, msg)
3084945219bSBram Moolenaar    call assert_equal(rowstatusline, winheight(0) + 1, msg)
3093fbd2d7cSBram Moolenaar  endfor
3103fbd2d7cSBram Moolenaar
3113fb01a53SBram Moolenaar  let &mouse = save_mouse
3123fb01a53SBram Moolenaar  let &term = save_term
3133fb01a53SBram Moolenaar  let &ttymouse = save_ttymouse
314ca57ab54SBram Moolenaar  let &laststatus = save_laststatus
315ca57ab54SBram Moolenaarendfunc
316ca57ab54SBram Moolenaar
317ca57ab54SBram Moolenaarfunc Test_xterm_mouse_click_tab()
318ca57ab54SBram Moolenaar  let save_mouse = &mouse
319ca57ab54SBram Moolenaar  let save_term = &term
320ca57ab54SBram Moolenaar  let save_ttymouse = &ttymouse
321ca57ab54SBram Moolenaar  set mouse=a term=xterm
322ca57ab54SBram Moolenaar  let row = 1
323ca57ab54SBram Moolenaar
324*d0621d85SBram Moolenaar  for ttymouse_val in s:test_ttymouse
3254945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
3261ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
327ca57ab54SBram Moolenaar    e Xfoo
328ca57ab54SBram Moolenaar    tabnew Xbar
329ca57ab54SBram Moolenaar
330ca57ab54SBram Moolenaar    let a = split(execute(':tabs'), "\n")
331ca57ab54SBram Moolenaar    call assert_equal(['Tab page 1',
332ca57ab54SBram Moolenaar        \              '    Xfoo',
333ca57ab54SBram Moolenaar        \              'Tab page 2',
3344945219bSBram Moolenaar        \              '>   Xbar'], a, msg)
335ca57ab54SBram Moolenaar
336ca57ab54SBram Moolenaar    " Test clicking on tab names in the tabline at the top.
337ca57ab54SBram Moolenaar    let col = 2
33839f76c6aSBram Moolenaar    redraw
339ca57ab54SBram Moolenaar    call MouseLeftClick(row, col)
340ca57ab54SBram Moolenaar    call MouseLeftRelease(row, col)
341ca57ab54SBram Moolenaar    let a = split(execute(':tabs'), "\n")
342ca57ab54SBram Moolenaar    call assert_equal(['Tab page 1',
343ca57ab54SBram Moolenaar        \              '>   Xfoo',
344ca57ab54SBram Moolenaar        \              'Tab page 2',
3454945219bSBram Moolenaar        \              '    Xbar'], a, msg)
346ca57ab54SBram Moolenaar
347ca57ab54SBram Moolenaar    let col = 9
348ca57ab54SBram Moolenaar    call MouseLeftClick(row, col)
349ca57ab54SBram Moolenaar    call MouseLeftRelease(row, col)
350ca57ab54SBram Moolenaar    let a = split(execute(':tabs'), "\n")
351ca57ab54SBram Moolenaar    call assert_equal(['Tab page 1',
352ca57ab54SBram Moolenaar        \              '    Xfoo',
353ca57ab54SBram Moolenaar        \              'Tab page 2',
3544945219bSBram Moolenaar        \              '>   Xbar'], a, msg)
355ca57ab54SBram Moolenaar
356ca57ab54SBram Moolenaar    %bwipe!
357ca57ab54SBram Moolenaar  endfor
358ca57ab54SBram Moolenaar
359ca57ab54SBram Moolenaar  let &mouse = save_mouse
360ca57ab54SBram Moolenaar  let &term = save_term
361ca57ab54SBram Moolenaar  let &ttymouse = save_ttymouse
3623fb01a53SBram Moolenaarendfunc
36339f76c6aSBram Moolenaar
36439f76c6aSBram Moolenaarfunc Test_xterm_mouse_click_X_to_close_tab()
36539f76c6aSBram Moolenaar  let save_mouse = &mouse
36639f76c6aSBram Moolenaar  let save_term = &term
36739f76c6aSBram Moolenaar  let save_ttymouse = &ttymouse
36839f76c6aSBram Moolenaar  set mouse=a term=xterm
36939f76c6aSBram Moolenaar  let row = 1
37039f76c6aSBram Moolenaar  let col = &columns
37139f76c6aSBram Moolenaar
372*d0621d85SBram Moolenaar  for ttymouse_val in s:test_ttymouse
3732b00b9b0SBram Moolenaar    if ttymouse_val ==# 'xterm2' && col > 223
3742b00b9b0SBram Moolenaar      " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
37539f76c6aSBram Moolenaar      continue
37639f76c6aSBram Moolenaar    endif
3774945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
3781ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
37939f76c6aSBram Moolenaar    e Xtab1
38039f76c6aSBram Moolenaar    tabnew Xtab2
38139f76c6aSBram Moolenaar    tabnew Xtab3
38239f76c6aSBram Moolenaar    tabn 2
38339f76c6aSBram Moolenaar
38439f76c6aSBram Moolenaar    let a = split(execute(':tabs'), "\n")
38539f76c6aSBram Moolenaar    call assert_equal(['Tab page 1',
38639f76c6aSBram Moolenaar        \              '    Xtab1',
38739f76c6aSBram Moolenaar        \              'Tab page 2',
38839f76c6aSBram Moolenaar        \              '>   Xtab2',
38939f76c6aSBram Moolenaar        \              'Tab page 3',
3904945219bSBram Moolenaar        \              '    Xtab3'], a, msg)
39139f76c6aSBram Moolenaar
39239f76c6aSBram Moolenaar    " Click on "X" in tabline to close current tab i.e. Xtab2.
39339f76c6aSBram Moolenaar    redraw
39439f76c6aSBram Moolenaar    call MouseLeftClick(row, col)
39539f76c6aSBram Moolenaar    call MouseLeftRelease(row, col)
39639f76c6aSBram Moolenaar    let a = split(execute(':tabs'), "\n")
39739f76c6aSBram Moolenaar    call assert_equal(['Tab page 1',
39839f76c6aSBram Moolenaar        \              '    Xtab1',
39939f76c6aSBram Moolenaar        \              'Tab page 2',
4004945219bSBram Moolenaar        \              '>   Xtab3'], a, msg)
40139f76c6aSBram Moolenaar
40239f76c6aSBram Moolenaar    %bwipe!
40339f76c6aSBram Moolenaar  endfor
40439f76c6aSBram Moolenaar
40539f76c6aSBram Moolenaar  let &mouse = save_mouse
40639f76c6aSBram Moolenaar  let &term = save_term
40739f76c6aSBram Moolenaar  let &ttymouse = save_ttymouse
40839f76c6aSBram Moolenaarendfunc
409e3e3828fSBram Moolenaar
410e3e3828fSBram Moolenaarfunc Test_xterm_mouse_drag_to_move_tab()
411e3e3828fSBram Moolenaar  let save_mouse = &mouse
412e3e3828fSBram Moolenaar  let save_term = &term
413e3e3828fSBram Moolenaar  let save_ttymouse = &ttymouse
414e3e3828fSBram Moolenaar  " Set 'mousetime' to 1 to avoid recognizing a double-click in the loop
415e3e3828fSBram Moolenaar  set mouse=a term=xterm mousetime=1
416e3e3828fSBram Moolenaar  let row = 1
417e3e3828fSBram Moolenaar
418*d0621d85SBram Moolenaar  for ttymouse_val in s:test_ttymouse
4194945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
4201ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
421e3e3828fSBram Moolenaar    e Xtab1
422e3e3828fSBram Moolenaar    tabnew Xtab2
423e3e3828fSBram Moolenaar
424e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
425e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
426e3e3828fSBram Moolenaar        \              '    Xtab1',
427e3e3828fSBram Moolenaar        \              'Tab page 2',
4284945219bSBram Moolenaar        \              '>   Xtab2'], a, msg)
429e3e3828fSBram Moolenaar    redraw
430e3e3828fSBram Moolenaar
431e3e3828fSBram Moolenaar    " Click in tab2 and drag it to tab1.
432e3e3828fSBram Moolenaar    " Check getcharmod() to verify that click is not
433e3e3828fSBram Moolenaar    " interpreted as a spurious double-click.
434e3e3828fSBram Moolenaar    call MouseLeftClick(row, 10)
4354945219bSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
436e3e3828fSBram Moolenaar    for col in [9, 8, 7, 6]
437e3e3828fSBram Moolenaar      call MouseLeftDrag(row, col)
438e3e3828fSBram Moolenaar    endfor
439e3e3828fSBram Moolenaar    call MouseLeftRelease(row, col)
440e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
441e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
442e3e3828fSBram Moolenaar        \              '>   Xtab2',
443e3e3828fSBram Moolenaar        \              'Tab page 2',
4444945219bSBram Moolenaar        \              '    Xtab1'], a, msg)
445e3e3828fSBram Moolenaar
4467f279765SBram Moolenaar    " brief sleep to avoid causing a double-click
4477f279765SBram Moolenaar    sleep 20m
448e3e3828fSBram Moolenaar    %bwipe!
449e3e3828fSBram Moolenaar  endfor
450e3e3828fSBram Moolenaar
451e3e3828fSBram Moolenaar  let &mouse = save_mouse
452e3e3828fSBram Moolenaar  let &term = save_term
453e3e3828fSBram Moolenaar  let &ttymouse = save_ttymouse
454e3e3828fSBram Moolenaar  set mousetime&
455e3e3828fSBram Moolenaarendfunc
456e3e3828fSBram Moolenaar
457e3e3828fSBram Moolenaarfunc Test_xterm_mouse_double_click_to_create_tab()
458e3e3828fSBram Moolenaar  let save_mouse = &mouse
459e3e3828fSBram Moolenaar  let save_term = &term
460e3e3828fSBram Moolenaar  let save_ttymouse = &ttymouse
461e3e3828fSBram Moolenaar  " Set 'mousetime' to a small value, so that double-click works but we don't
462e3e3828fSBram Moolenaar  " have to wait long to avoid a triple-click.
463e3e3828fSBram Moolenaar  set mouse=a term=xterm mousetime=100
464e3e3828fSBram Moolenaar  let row = 1
465e3e3828fSBram Moolenaar  let col = 10
466e3e3828fSBram Moolenaar
467*d0621d85SBram Moolenaar  let round = 0
468*d0621d85SBram Moolenaar  for ttymouse_val in s:test_ttymouse
4694945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
4701ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
471e3e3828fSBram Moolenaar    e Xtab1
472e3e3828fSBram Moolenaar    tabnew Xtab2
473e3e3828fSBram Moolenaar
474*d0621d85SBram Moolenaar    if round > 0
475*d0621d85SBram Moolenaar      " We need to sleep, or else the first MouseLeftClick() will be
476*d0621d85SBram Moolenaar      " interpreted as a spurious triple-click.
477*d0621d85SBram Moolenaar      sleep 100m
478*d0621d85SBram Moolenaar    endif
479*d0621d85SBram Moolenaar    let round += 1
480*d0621d85SBram Moolenaar
481e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
482e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
483e3e3828fSBram Moolenaar        \              '    Xtab1',
484e3e3828fSBram Moolenaar        \              'Tab page 2',
4854945219bSBram Moolenaar        \              '>   Xtab2'], a, msg)
486e3e3828fSBram Moolenaar
487e3e3828fSBram Moolenaar    redraw
488e3e3828fSBram Moolenaar    call MouseLeftClick(row, col)
489e3e3828fSBram Moolenaar    " Check getcharmod() to verify that first click is not
490e3e3828fSBram Moolenaar    " interpreted as a spurious double-click.
4914945219bSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
492e3e3828fSBram Moolenaar    call MouseLeftRelease(row, col)
493e3e3828fSBram Moolenaar    call MouseLeftClick(row, col)
4944945219bSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
495e3e3828fSBram Moolenaar    call MouseLeftRelease(row, col)
496e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
497e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
498e3e3828fSBram Moolenaar        \              '    Xtab1',
499e3e3828fSBram Moolenaar        \              'Tab page 2',
500e3e3828fSBram Moolenaar        \              '>   [No Name]',
501e3e3828fSBram Moolenaar        \              'Tab page 3',
5024945219bSBram Moolenaar        \              '    Xtab2'], a, msg)
503e3e3828fSBram Moolenaar
504e3e3828fSBram Moolenaar    %bwipe!
505e3e3828fSBram Moolenaar  endfor
506e3e3828fSBram Moolenaar
507e3e3828fSBram Moolenaar  let &mouse = save_mouse
508e3e3828fSBram Moolenaar  let &term = save_term
509e3e3828fSBram Moolenaar  let &ttymouse = save_ttymouse
510e3e3828fSBram Moolenaar  set mousetime&
511e3e3828fSBram Moolenaarendfunc
512696d6377SBram Moolenaar
513696d6377SBram Moolenaarfunc Test_xterm_mouse_click_in_fold_columns()
514696d6377SBram Moolenaar  new
515696d6377SBram Moolenaar  let save_mouse = &mouse
516696d6377SBram Moolenaar  let save_term = &term
517696d6377SBram Moolenaar  let save_ttymouse = &ttymouse
518696d6377SBram Moolenaar  let save_foldcolumn = &foldcolumn
5192b00b9b0SBram Moolenaar  set mouse=a term=xterm foldcolumn=3 ttymouse=xterm2
520696d6377SBram Moolenaar
521696d6377SBram Moolenaar  " Create 2 nested folds.
522696d6377SBram Moolenaar  call setline(1, range(1, 7))
523696d6377SBram Moolenaar  2,6fold
524696d6377SBram Moolenaar  norm! zR
525696d6377SBram Moolenaar  4,5fold
526696d6377SBram Moolenaar  call assert_equal([-1, -1, -1, 4, 4, -1, -1],
527696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
528696d6377SBram Moolenaar
529696d6377SBram Moolenaar  " Click in "+" of inner fold in foldcolumn should open it.
530696d6377SBram Moolenaar  redraw
531696d6377SBram Moolenaar  let row = 4
532696d6377SBram Moolenaar  let col = 2
533696d6377SBram Moolenaar  call MouseLeftClick(row, col)
534696d6377SBram Moolenaar  call MouseLeftRelease(row, col)
535696d6377SBram Moolenaar  call assert_equal([-1, -1, -1, -1, -1, -1, -1],
536696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
537696d6377SBram Moolenaar
538696d6377SBram Moolenaar  " Click in "-" of outer fold in foldcolumn should close it.
539696d6377SBram Moolenaar  redraw
540696d6377SBram Moolenaar  let row = 2
541696d6377SBram Moolenaar  let col = 1
542696d6377SBram Moolenaar  call MouseLeftClick(row, col)
543696d6377SBram Moolenaar  call MouseLeftRelease(row, col)
544696d6377SBram Moolenaar  call assert_equal([-1, 2, 2, 2, 2, 2, -1],
545696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
546696d6377SBram Moolenaar  norm! zR
547696d6377SBram Moolenaar
548696d6377SBram Moolenaar  " Click in "|" of inner fold in foldcolumn should close it.
549696d6377SBram Moolenaar  redraw
550696d6377SBram Moolenaar  let row = 5
551696d6377SBram Moolenaar  let col = 2
552696d6377SBram Moolenaar  call MouseLeftClick(row, col)
553696d6377SBram Moolenaar  call MouseLeftRelease(row, col)
554696d6377SBram Moolenaar  call assert_equal([-1, -1, -1, 4, 4, -1, -1],
555696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
556696d6377SBram Moolenaar
557696d6377SBram Moolenaar  let &foldcolumn = save_foldcolumn
558696d6377SBram Moolenaar  let &ttymouse = save_ttymouse
559696d6377SBram Moolenaar  let &term = save_term
560696d6377SBram Moolenaar  let &mouse = save_mouse
561696d6377SBram Moolenaar  bwipe!
562696d6377SBram Moolenaarendfunc
563