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 8*3fbd2d7cSBram Moolenaar" Helper function to emit a terminal escape code. 9*3fbd2d7cSBram Moolenaarfunc TerminalEscapeCode(code_xterm, code_sgr, row, col, m) 10*3fbd2d7cSBram Moolenaar if &ttymouse ==# 'xterm' 11*3fbd2d7cSBram Moolenaar " need to use byte encoding here. 12*3fbd2d7cSBram Moolenaar let str = list2str([a:code_xterm, a:col + 0x20, a:row + 0x20]) 13*3fbd2d7cSBram Moolenaar if has('iconv') 14*3fbd2d7cSBram Moolenaar let bytes = iconv(str, 'utf-8', 'latin1') 15*3fbd2d7cSBram Moolenaar else 16*3fbd2d7cSBram Moolenaar " Hopefully the numbers are not too big. 17*3fbd2d7cSBram Moolenaar let bytes = str 18*3fbd2d7cSBram Moolenaar endif 19*3fbd2d7cSBram Moolenaar call feedkeys("\<Esc>[M" .. bytes, 'Lx!') 20*3fbd2d7cSBram Moolenaar elseif &ttymouse ==# 'sgr' 21*3fbd2d7cSBram Moolenaar call feedkeys(printf("\<Esc>[<%d;%d;%d%s", a:code_sgr, a:col, a:row, a:m), 'Lx!') 22*3fbd2d7cSBram Moolenaar endif 23*3fbd2d7cSBram Moolenaarendfunc 24*3fbd2d7cSBram Moolenaar 25*3fbd2d7cSBram Moolenaarfunc MouseLeftClick(row, col) 26*3fbd2d7cSBram Moolenaar call TerminalEscapeCode(0x20, 0, a:row, a:col, 'M') 27*3fbd2d7cSBram Moolenaarendfunc 28*3fbd2d7cSBram Moolenaar 29*3fbd2d7cSBram Moolenaarfunc MouseLeftRelease(row, col) 30*3fbd2d7cSBram Moolenaar call TerminalEscapeCode(0x23, 3, a:row, a:col, 'm') 31*3fbd2d7cSBram Moolenaarendfunc 32*3fbd2d7cSBram Moolenaar 33*3fbd2d7cSBram Moolenaarfunc MouseLeftDrag(row, col) 34*3fbd2d7cSBram Moolenaar call TerminalEscapeCode(0x43, 0x20, a:row, a:col, 'M') 35*3fbd2d7cSBram Moolenaarendfunc 36*3fbd2d7cSBram Moolenaar 37*3fbd2d7cSBram Moolenaarfunc MouseWheelUp(row, col) 38*3fbd2d7cSBram Moolenaar call TerminalEscapeCode(0x40, 0x40, a:row, a:col, 'M') 39*3fbd2d7cSBram Moolenaarendfunc 40*3fbd2d7cSBram Moolenaar 41*3fbd2d7cSBram Moolenaarfunc MouseWheelDown(row, col) 42*3fbd2d7cSBram Moolenaar call TerminalEscapeCode(0x41, 0x41, a:row, a:col, 'M') 43*3fbd2d7cSBram Moolenaarendfunc 44*3fbd2d7cSBram Moolenaar 45905dd905SBram Moolenaarfunc Test_xterm_mouse_click() 46905dd905SBram Moolenaar new 47905dd905SBram Moolenaar let save_mouse = &mouse 48905dd905SBram Moolenaar let save_term = &term 49905dd905SBram Moolenaar let save_ttymouse = &ttymouse 50*3fbd2d7cSBram Moolenaar set mouse=a term=xterm 51905dd905SBram Moolenaar call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer']) 52905dd905SBram Moolenaar 53*3fbd2d7cSBram Moolenaar for ttymouse_val in ['xterm', 'sgr'] 54*3fbd2d7cSBram Moolenaar exe 'set ttymouse=' . ttymouse_val 55*3fbd2d7cSBram Moolenaar go 56*3fbd2d7cSBram Moolenaar call assert_equal([0, 1, 1, 0], getpos('.')) 57*3fbd2d7cSBram Moolenaar let row = 2 58*3fbd2d7cSBram Moolenaar let col = 6 59*3fbd2d7cSBram Moolenaar call MouseLeftClick(row, col) 60*3fbd2d7cSBram Moolenaar call MouseLeftRelease(row, col) 61905dd905SBram Moolenaar call assert_equal([0, 2, 6, 0], getpos('.')) 62*3fbd2d7cSBram Moolenaar endfor 63905dd905SBram Moolenaar 64905dd905SBram Moolenaar let &mouse = save_mouse 65905dd905SBram Moolenaar let &term = save_term 66905dd905SBram Moolenaar let &ttymouse = save_ttymouse 67905dd905SBram Moolenaar bwipe! 68905dd905SBram Moolenaarendfunc 69905dd905SBram Moolenaar 70049736faSBram Moolenaarfunc Test_xterm_mouse_wheel() 71049736faSBram Moolenaar new 72049736faSBram Moolenaar let save_mouse = &mouse 73049736faSBram Moolenaar let save_term = &term 74049736faSBram Moolenaar let save_ttymouse = &ttymouse 75*3fbd2d7cSBram Moolenaar set mouse=a term=xterm 76049736faSBram Moolenaar call setline(1, range(1, 100)) 77049736faSBram Moolenaar 78*3fbd2d7cSBram Moolenaar for ttymouse_val in ['xterm', 'sgr'] 79*3fbd2d7cSBram Moolenaar exe 'set ttymouse=' . ttymouse_val 80049736faSBram Moolenaar go 81049736faSBram Moolenaar call assert_equal(1, line('w0')) 82049736faSBram Moolenaar call assert_equal([0, 1, 1, 0], getpos('.')) 83*3fbd2d7cSBram Moolenaar 84*3fbd2d7cSBram Moolenaar call MouseWheelDown(1, 1) 85049736faSBram Moolenaar call assert_equal(4, line('w0')) 86049736faSBram Moolenaar call assert_equal([0, 4, 1, 0], getpos('.')) 87*3fbd2d7cSBram Moolenaar 88*3fbd2d7cSBram Moolenaar call MouseWheelDown(1, 1) 89049736faSBram Moolenaar call assert_equal(7, line('w0')) 90049736faSBram Moolenaar call assert_equal([0, 7, 1, 0], getpos('.')) 91049736faSBram Moolenaar 92*3fbd2d7cSBram Moolenaar call MouseWheelUp(1, 1) 93049736faSBram Moolenaar call assert_equal(4, line('w0')) 94049736faSBram Moolenaar call assert_equal([0, 7, 1, 0], getpos('.')) 95*3fbd2d7cSBram Moolenaar 96*3fbd2d7cSBram Moolenaar call MouseWheelUp(1, 1) 97049736faSBram Moolenaar call assert_equal(1, line('w0')) 98049736faSBram Moolenaar call assert_equal([0, 7, 1, 0], getpos('.')) 99*3fbd2d7cSBram Moolenaar endfor 100049736faSBram Moolenaar 101049736faSBram Moolenaar let &mouse = save_mouse 102049736faSBram Moolenaar let &term = save_term 103049736faSBram Moolenaar let &ttymouse = save_ttymouse 104049736faSBram Moolenaar bwipe! 105049736faSBram Moolenaarendfunc 1063fb01a53SBram Moolenaar 1073fb01a53SBram Moolenaarfunc Test_xterm_mouse_drag_window_separator() 1083fb01a53SBram Moolenaar let save_mouse = &mouse 1093fb01a53SBram Moolenaar let save_term = &term 1103fb01a53SBram Moolenaar let save_ttymouse = &ttymouse 111*3fbd2d7cSBram Moolenaar set mouse=a term=xterm 112*3fbd2d7cSBram Moolenaar 113*3fbd2d7cSBram Moolenaar for ttymouse_val in ['xterm', 'sgr'] 114*3fbd2d7cSBram Moolenaar exe 'set ttymouse=' . ttymouse_val 1153fb01a53SBram Moolenaar 1163fb01a53SBram Moolenaar " Split horizontally and test dragging the horizontal window separator. 1173fb01a53SBram Moolenaar split 1183fb01a53SBram Moolenaar let rowseparator = winheight(0) + 1 1193fb01a53SBram Moolenaar let row = rowseparator 1203fb01a53SBram Moolenaar let col = 1 121*3fbd2d7cSBram Moolenaar call MouseLeftClick(row, col) 1223fb01a53SBram Moolenaar 1233fb01a53SBram Moolenaar let row -= 1 124*3fbd2d7cSBram Moolenaar call MouseLeftDrag(row, col) 1253fb01a53SBram Moolenaar call assert_equal(rowseparator - 1, winheight(0) + 1) 1263fb01a53SBram Moolenaar let row += 1 127*3fbd2d7cSBram Moolenaar call MouseLeftDrag(row, col) 1283fb01a53SBram Moolenaar call assert_equal(rowseparator, winheight(0) + 1) 129*3fbd2d7cSBram Moolenaar call MouseLeftRelease(row, col) 1303fb01a53SBram Moolenaar call assert_equal(rowseparator, winheight(0) + 1) 1313fb01a53SBram Moolenaar 1323fb01a53SBram Moolenaar bwipe! 1333fb01a53SBram Moolenaar 1343fb01a53SBram Moolenaar " Split vertically and test dragging the vertical window separator. 1353fb01a53SBram Moolenaar vsplit 1363fb01a53SBram Moolenaar let colseparator = winwidth(0) + 1 1373fb01a53SBram Moolenaar 1383fb01a53SBram Moolenaar let row = 1 1393fb01a53SBram Moolenaar let col = colseparator 140*3fbd2d7cSBram Moolenaar call MouseLeftClick(row, col) 1413fb01a53SBram Moolenaar let col -= 1 142*3fbd2d7cSBram Moolenaar call MouseLeftDrag(row, col) 1433fb01a53SBram Moolenaar call assert_equal(colseparator - 1, winwidth(0) + 1) 1443fb01a53SBram Moolenaar let col += 1 145*3fbd2d7cSBram Moolenaar call MouseLeftDrag(row, col) 1463fb01a53SBram Moolenaar call assert_equal(colseparator, winwidth(0) + 1) 147*3fbd2d7cSBram Moolenaar call MouseLeftRelease(row, col) 1483fb01a53SBram Moolenaar call assert_equal(colseparator, winwidth(0) + 1) 1493fb01a53SBram Moolenaar 1503fb01a53SBram Moolenaar bwipe! 151*3fbd2d7cSBram Moolenaar endfor 152*3fbd2d7cSBram Moolenaar 153*3fbd2d7cSBram Moolenaar let &mouse = save_mouse 154*3fbd2d7cSBram Moolenaar let &term = save_term 155*3fbd2d7cSBram Moolenaar let &ttymouse = save_ttymouse 156*3fbd2d7cSBram Moolenaarendfunc 157*3fbd2d7cSBram Moolenaar 158*3fbd2d7cSBram Moolenaarfunc Test_xterm_mouse_drag_statusline() 159*3fbd2d7cSBram Moolenaar let save_mouse = &mouse 160*3fbd2d7cSBram Moolenaar let save_term = &term 161*3fbd2d7cSBram Moolenaar let save_ttymouse = &ttymouse 162*3fbd2d7cSBram Moolenaar set mouse=a term=xterm 163*3fbd2d7cSBram Moolenaar 164*3fbd2d7cSBram Moolenaar for ttymouse_val in ['xterm', 'sgr'] 165*3fbd2d7cSBram Moolenaar exe 'set ttymouse=' . ttymouse_val 166*3fbd2d7cSBram Moolenaar 167*3fbd2d7cSBram Moolenaar call assert_equal(1, &cmdheight) 168*3fbd2d7cSBram Moolenaar let rowstatusline = winheight(0) + 1 169*3fbd2d7cSBram Moolenaar let row = rowstatusline 170*3fbd2d7cSBram Moolenaar let col = 1 171*3fbd2d7cSBram Moolenaar call MouseLeftClick(row, col) 172*3fbd2d7cSBram Moolenaar let row -= 1 173*3fbd2d7cSBram Moolenaar call MouseLeftDrag(row, col) 174*3fbd2d7cSBram Moolenaar call assert_equal(2, &cmdheight) 175*3fbd2d7cSBram Moolenaar call assert_equal(rowstatusline - 1, winheight(0) + 1) 176*3fbd2d7cSBram Moolenaar let row += 1 177*3fbd2d7cSBram Moolenaar call MouseLeftDrag(row, col) 178*3fbd2d7cSBram Moolenaar call assert_equal(1, &cmdheight) 179*3fbd2d7cSBram Moolenaar call assert_equal(rowstatusline, winheight(0) + 1) 180*3fbd2d7cSBram Moolenaar call MouseLeftRelease(row, col) 181*3fbd2d7cSBram Moolenaar call assert_equal(1, &cmdheight) 182*3fbd2d7cSBram Moolenaar call assert_equal(rowstatusline, winheight(0) + 1) 183*3fbd2d7cSBram Moolenaar endfor 184*3fbd2d7cSBram Moolenaar 1853fb01a53SBram Moolenaar let &mouse = save_mouse 1863fb01a53SBram Moolenaar let &term = save_term 1873fb01a53SBram Moolenaar let &ttymouse = save_ttymouse 1883fb01a53SBram Moolenaarendfunc 189