1515545e1SBram Moolenaar" Helper functions for generating mouse events 2515545e1SBram Moolenaar 3515545e1SBram Moolenaar" xterm2 and sgr always work, urxvt is optional. 4515545e1SBram Moolenaarlet g:Ttymouse_values = ['xterm2', 'sgr'] 5515545e1SBram Moolenaarif has('mouse_urxvt') 6515545e1SBram Moolenaar call add(g:Ttymouse_values, 'urxvt') 7515545e1SBram Moolenaarendif 8515545e1SBram Moolenaar 9515545e1SBram Moolenaar" dec doesn't support all the functionality 10515545e1SBram Moolenaarif has('mouse_dec') 11515545e1SBram Moolenaar let g:Ttymouse_dec = ['dec'] 12515545e1SBram Moolenaarelse 13515545e1SBram Moolenaar let g:Ttymouse_dec = [] 14515545e1SBram Moolenaarendif 15515545e1SBram Moolenaar 16515545e1SBram Moolenaar" netterm only supports left click 17515545e1SBram Moolenaarif has('mouse_netterm') 18515545e1SBram Moolenaar let g:Ttymouse_netterm = ['netterm'] 19515545e1SBram Moolenaarelse 20515545e1SBram Moolenaar let g:Ttymouse_netterm = [] 21515545e1SBram Moolenaarendif 22515545e1SBram Moolenaar 23515545e1SBram Moolenaar" Helper function to emit a terminal escape code. 24515545e1SBram Moolenaarfunc TerminalEscapeCode(code, row, col, m) 25515545e1SBram Moolenaar if &ttymouse ==# 'xterm2' 26515545e1SBram Moolenaar " need to use byte encoding here. 27515545e1SBram Moolenaar let str = list2str([a:code + 0x20, a:col + 0x20, a:row + 0x20]) 28515545e1SBram Moolenaar if has('iconv') 29515545e1SBram Moolenaar let bytes = str->iconv('utf-8', 'latin1') 30515545e1SBram Moolenaar else 31515545e1SBram Moolenaar " Hopefully the numbers are not too big. 32515545e1SBram Moolenaar let bytes = str 33515545e1SBram Moolenaar endif 34515545e1SBram Moolenaar return "\<Esc>[M" .. bytes 35515545e1SBram Moolenaar elseif &ttymouse ==# 'sgr' 36515545e1SBram Moolenaar return printf("\<Esc>[<%d;%d;%d%s", a:code, a:col, a:row, a:m) 37515545e1SBram Moolenaar elseif &ttymouse ==# 'urxvt' 38515545e1SBram Moolenaar return printf("\<Esc>[%d;%d;%dM", a:code + 0x20, a:col, a:row) 39515545e1SBram Moolenaar endif 40515545e1SBram Moolenaarendfunc 41515545e1SBram Moolenaar 42515545e1SBram Moolenaarfunc DecEscapeCode(code, down, row, col) 43515545e1SBram Moolenaar return printf("\<Esc>[%d;%d;%d;%d&w", a:code, a:down, a:row, a:col) 44515545e1SBram Moolenaarendfunc 45515545e1SBram Moolenaar 46515545e1SBram Moolenaarfunc NettermEscapeCode(row, col) 47515545e1SBram Moolenaar return printf("\<Esc>}%d,%d\r", a:row, a:col) 48515545e1SBram Moolenaarendfunc 49515545e1SBram Moolenaar 50515545e1SBram Moolenaarfunc MouseLeftClickCode(row, col) 51515545e1SBram Moolenaar if &ttymouse ==# 'dec' 52515545e1SBram Moolenaar return DecEscapeCode(2, 4, a:row, a:col) 53515545e1SBram Moolenaar elseif &ttymouse ==# 'netterm' 54515545e1SBram Moolenaar return NettermEscapeCode(a:row, a:col) 55515545e1SBram Moolenaar else 56515545e1SBram Moolenaar return TerminalEscapeCode(0, a:row, a:col, 'M') 57515545e1SBram Moolenaar endif 58515545e1SBram Moolenaarendfunc 59515545e1SBram Moolenaar 60515545e1SBram Moolenaarfunc MouseLeftClick(row, col) 61515545e1SBram Moolenaar call feedkeys(MouseLeftClickCode(a:row, a:col), 'Lx!') 62515545e1SBram Moolenaarendfunc 63515545e1SBram Moolenaar 64515545e1SBram Moolenaarfunc MouseMiddleClickCode(row, col) 65515545e1SBram Moolenaar if &ttymouse ==# 'dec' 66515545e1SBram Moolenaar return DecEscapeCode(4, 2, a:row, a:col) 67515545e1SBram Moolenaar else 68515545e1SBram Moolenaar return TerminalEscapeCode(1, a:row, a:col, 'M') 69515545e1SBram Moolenaar endif 70515545e1SBram Moolenaarendfunc 71515545e1SBram Moolenaar 72515545e1SBram Moolenaarfunc MouseMiddleClick(row, col) 73515545e1SBram Moolenaar call feedkeys(MouseMiddleClickCode(a:row, a:col), 'Lx!') 74515545e1SBram Moolenaarendfunc 75515545e1SBram Moolenaar 76515545e1SBram Moolenaarfunc MouseRightClickCode(row, col) 77515545e1SBram Moolenaar if &ttymouse ==# 'dec' 78515545e1SBram Moolenaar return DecEscapeCode(6, 1, a:row, a:col) 79515545e1SBram Moolenaar else 80515545e1SBram Moolenaar return TerminalEscapeCode(2, a:row, a:col, 'M') 81515545e1SBram Moolenaar endif 82515545e1SBram Moolenaarendfunc 83515545e1SBram Moolenaar 84515545e1SBram Moolenaarfunc MouseRightClick(row, col) 85515545e1SBram Moolenaar call feedkeys(MouseRightClickCode(a:row, a:col), 'Lx!') 86515545e1SBram Moolenaarendfunc 87515545e1SBram Moolenaar 88515545e1SBram Moolenaarfunc MouseCtrlLeftClickCode(row, col) 89515545e1SBram Moolenaar let ctrl = 0x10 90515545e1SBram Moolenaar return TerminalEscapeCode(0 + ctrl, a:row, a:col, 'M') 91515545e1SBram Moolenaarendfunc 92515545e1SBram Moolenaar 93515545e1SBram Moolenaarfunc MouseCtrlLeftClick(row, col) 94515545e1SBram Moolenaar call feedkeys(MouseCtrlLeftClickCode(a:row, a:col), 'Lx!') 95515545e1SBram Moolenaarendfunc 96515545e1SBram Moolenaar 97515545e1SBram Moolenaarfunc MouseCtrlRightClickCode(row, col) 98515545e1SBram Moolenaar let ctrl = 0x10 99515545e1SBram Moolenaar return TerminalEscapeCode(2 + ctrl, a:row, a:col, 'M') 100515545e1SBram Moolenaarendfunc 101515545e1SBram Moolenaar 102515545e1SBram Moolenaarfunc MouseCtrlRightClick(row, col) 103515545e1SBram Moolenaar call feedkeys(MouseCtrlRightClickCode(a:row, a:col), 'Lx!') 104515545e1SBram Moolenaarendfunc 105515545e1SBram Moolenaar 106*2764d06aSBram Moolenaarfunc MouseAltLeftClickCode(row, col) 107*2764d06aSBram Moolenaar let alt = 0x8 108*2764d06aSBram Moolenaar return TerminalEscapeCode(0 + alt, a:row, a:col, 'M') 109*2764d06aSBram Moolenaarendfunc 110*2764d06aSBram Moolenaar 111*2764d06aSBram Moolenaarfunc MouseAltLeftClick(row, col) 112*2764d06aSBram Moolenaar call feedkeys(MouseAltLeftClickCode(a:row, a:col), 'Lx!') 113*2764d06aSBram Moolenaarendfunc 114*2764d06aSBram Moolenaar 115*2764d06aSBram Moolenaarfunc MouseAltRightClickCode(row, col) 116*2764d06aSBram Moolenaar let alt = 0x8 117*2764d06aSBram Moolenaar return TerminalEscapeCode(2 + alt, a:row, a:col, 'M') 118*2764d06aSBram Moolenaarendfunc 119*2764d06aSBram Moolenaar 120*2764d06aSBram Moolenaarfunc MouseAltRightClick(row, col) 121*2764d06aSBram Moolenaar call feedkeys(MouseAltRightClickCode(a:row, a:col), 'Lx!') 122*2764d06aSBram Moolenaarendfunc 123*2764d06aSBram Moolenaar 124515545e1SBram Moolenaarfunc MouseLeftReleaseCode(row, col) 125515545e1SBram Moolenaar if &ttymouse ==# 'dec' 126515545e1SBram Moolenaar return DecEscapeCode(3, 0, a:row, a:col) 127515545e1SBram Moolenaar elseif &ttymouse ==# 'netterm' 128515545e1SBram Moolenaar return '' 129515545e1SBram Moolenaar else 130515545e1SBram Moolenaar return TerminalEscapeCode(3, a:row, a:col, 'm') 131515545e1SBram Moolenaar endif 132515545e1SBram Moolenaarendfunc 133515545e1SBram Moolenaar 134515545e1SBram Moolenaarfunc MouseLeftRelease(row, col) 135515545e1SBram Moolenaar call feedkeys(MouseLeftReleaseCode(a:row, a:col), 'Lx!') 136515545e1SBram Moolenaarendfunc 137515545e1SBram Moolenaar 138515545e1SBram Moolenaarfunc MouseMiddleReleaseCode(row, col) 139515545e1SBram Moolenaar if &ttymouse ==# 'dec' 140515545e1SBram Moolenaar return DecEscapeCode(5, 0, a:row, a:col) 141515545e1SBram Moolenaar else 142515545e1SBram Moolenaar return TerminalEscapeCode(3, a:row, a:col, 'm') 143515545e1SBram Moolenaar endif 144515545e1SBram Moolenaarendfunc 145515545e1SBram Moolenaar 146515545e1SBram Moolenaarfunc MouseMiddleRelease(row, col) 147515545e1SBram Moolenaar call feedkeys(MouseMiddleReleaseCode(a:row, a:col), 'Lx!') 148515545e1SBram Moolenaarendfunc 149515545e1SBram Moolenaar 150515545e1SBram Moolenaarfunc MouseRightReleaseCode(row, col) 151515545e1SBram Moolenaar if &ttymouse ==# 'dec' 152515545e1SBram Moolenaar return DecEscapeCode(7, 0, a:row, a:col) 153515545e1SBram Moolenaar else 154515545e1SBram Moolenaar return TerminalEscapeCode(3, a:row, a:col, 'm') 155515545e1SBram Moolenaar endif 156515545e1SBram Moolenaarendfunc 157515545e1SBram Moolenaar 158515545e1SBram Moolenaarfunc MouseRightRelease(row, col) 159515545e1SBram Moolenaar call feedkeys(MouseRightReleaseCode(a:row, a:col), 'Lx!') 160515545e1SBram Moolenaarendfunc 161515545e1SBram Moolenaar 162515545e1SBram Moolenaarfunc MouseLeftDragCode(row, col) 163515545e1SBram Moolenaar if &ttymouse ==# 'dec' 164515545e1SBram Moolenaar return DecEscapeCode(1, 4, a:row, a:col) 165515545e1SBram Moolenaar else 166515545e1SBram Moolenaar return TerminalEscapeCode(0x20, a:row, a:col, 'M') 167515545e1SBram Moolenaar endif 168515545e1SBram Moolenaarendfunc 169515545e1SBram Moolenaar 170515545e1SBram Moolenaarfunc MouseLeftDrag(row, col) 171515545e1SBram Moolenaar call feedkeys(MouseLeftDragCode(a:row, a:col), 'Lx!') 172515545e1SBram Moolenaarendfunc 173515545e1SBram Moolenaar 174515545e1SBram Moolenaarfunc MouseWheelUpCode(row, col) 175515545e1SBram Moolenaar return TerminalEscapeCode(0x40, a:row, a:col, 'M') 176515545e1SBram Moolenaarendfunc 177515545e1SBram Moolenaar 178515545e1SBram Moolenaarfunc MouseWheelUp(row, col) 179515545e1SBram Moolenaar call feedkeys(MouseWheelUpCode(a:row, a:col), 'Lx!') 180515545e1SBram Moolenaarendfunc 181515545e1SBram Moolenaar 182515545e1SBram Moolenaarfunc MouseWheelDownCode(row, col) 183515545e1SBram Moolenaar return TerminalEscapeCode(0x41, a:row, a:col, 'M') 184515545e1SBram Moolenaarendfunc 185515545e1SBram Moolenaar 186515545e1SBram Moolenaarfunc MouseWheelDown(row, col) 187515545e1SBram Moolenaar call feedkeys(MouseWheelDownCode(a:row, a:col), 'Lx!') 188515545e1SBram Moolenaarendfunc 189515545e1SBram Moolenaar 190d58d4f90SBram Moolenaarfunc MouseWheelLeftCode(row, col) 191d58d4f90SBram Moolenaar return TerminalEscapeCode(0x42, a:row, a:col, 'M') 192d58d4f90SBram Moolenaarendfunc 193d58d4f90SBram Moolenaar 194d58d4f90SBram Moolenaarfunc MouseWheelLeft(row, col) 195d58d4f90SBram Moolenaar call feedkeys(MouseWheelLeftCode(a:row, a:col), 'Lx!') 196d58d4f90SBram Moolenaarendfunc 197d58d4f90SBram Moolenaar 198d58d4f90SBram Moolenaarfunc MouseWheelRightCode(row, col) 199d58d4f90SBram Moolenaar return TerminalEscapeCode(0x43, a:row, a:col, 'M') 200d58d4f90SBram Moolenaarendfunc 201d58d4f90SBram Moolenaar 202d58d4f90SBram Moolenaarfunc MouseWheelRight(row, col) 203d58d4f90SBram Moolenaar call feedkeys(MouseWheelRightCode(a:row, a:col), 'Lx!') 204d58d4f90SBram Moolenaarendfunc 205d58d4f90SBram Moolenaar 206515545e1SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab 207