mirror of
https://github.com/neovim/neovim.git
synced 2025-10-02 07:58:35 +00:00
vim-patch:8.1.2304: cannot get the mouse position when getting a mouse click
Problem: Cannot get the mouse position when getting a mouse click.
Solution: Add getmousepos().
db3a205147
This commit is contained in:
@@ -162,6 +162,7 @@ return {
|
||||
getloclist={args={1, 2}},
|
||||
getmarklist={args={0, 1}},
|
||||
getmatches={args={0, 1}},
|
||||
getmousepos={},
|
||||
getpid={},
|
||||
getpos={args=1},
|
||||
getqflist={args={0, 1}},
|
||||
|
@@ -3750,6 +3750,48 @@ static void f_getmatches(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
}
|
||||
}
|
||||
|
||||
// "getmousepos()" function
|
||||
void f_getmousepos(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
{
|
||||
dict_T *d;
|
||||
win_T *wp;
|
||||
int row = mouse_row;
|
||||
int col = mouse_col;
|
||||
int grid = mouse_grid;
|
||||
varnumber_T winid = 0;
|
||||
varnumber_T winrow = 0;
|
||||
varnumber_T wincol = 0;
|
||||
varnumber_T line = 0;
|
||||
varnumber_T column = 0;
|
||||
|
||||
tv_dict_alloc_ret(rettv);
|
||||
d = rettv->vval.v_dict;
|
||||
|
||||
tv_dict_add_nr(d, S_LEN("screenrow"), (varnumber_T)mouse_row + 1);
|
||||
tv_dict_add_nr(d, S_LEN("screencol"), (varnumber_T)mouse_col + 1);
|
||||
|
||||
wp = mouse_find_win(&grid, &row, &col);
|
||||
if (wp != NULL) {
|
||||
int height = wp->w_height + wp->w_status_height;
|
||||
// The height is adjusted by 1 when there is a bottom border. This is not
|
||||
// necessary for a top border since `row` starts at -1 in that case.
|
||||
if (row < height + wp->w_border_adj[2]) {
|
||||
winid = wp->handle;
|
||||
winrow = row + 1 + wp->w_border_adj[0]; // Adjust by 1 for top border
|
||||
wincol = col + 1 + wp->w_border_adj[3]; // Adjust by 1 for left border
|
||||
if (row >= 0 && row < wp->w_height && col >= 0 && col < wp->w_width) {
|
||||
mouse_comp_pos(wp, &row, &col, &line);
|
||||
column = col + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
tv_dict_add_nr(d, S_LEN("winid"), winid);
|
||||
tv_dict_add_nr(d, S_LEN("winrow"), winrow);
|
||||
tv_dict_add_nr(d, S_LEN("wincol"), wincol);
|
||||
tv_dict_add_nr(d, S_LEN("line"), line);
|
||||
tv_dict_add_nr(d, S_LEN("column"), column);
|
||||
}
|
||||
|
||||
/*
|
||||
* "getpid()" function
|
||||
*/
|
||||
|
@@ -363,6 +363,7 @@ bool mouse_comp_pos(win_T *win, int *rowp, int *colp, linenr_T *lnump)
|
||||
bool retval = false;
|
||||
int off;
|
||||
int count;
|
||||
char_u *p;
|
||||
|
||||
if (win->w_p_rl) {
|
||||
col = win->w_width_inner - 1 - col;
|
||||
@@ -407,6 +408,12 @@ bool mouse_comp_pos(win_T *win, int *rowp, int *colp, linenr_T *lnump)
|
||||
col += row * (win->w_width_inner - off);
|
||||
// add skip column (for long wrapping line)
|
||||
col += win->w_skipcol;
|
||||
// limit to text length plus one
|
||||
p = ml_get_buf(win->w_buffer, lnum, false);
|
||||
count = STRLEN(p);
|
||||
if (col > count) {
|
||||
col = count;
|
||||
}
|
||||
}
|
||||
|
||||
if (!win->w_p_wrap) {
|
||||
|
Reference in New Issue
Block a user