mirror of
https://github.com/neovim/neovim.git
synced 2025-09-20 02:08:17 +00:00
vim-patch:9.0.1919: Wrong curswant when clicking on empty line or with vsplits
Problem: Wrong curswant when clicking on empty line or with vsplits.
Solution: Don't check for ScreenCols[] before the start of the window
and handle empty line properly.
closes: vim/vim#13132
03cd697d63
This commit is contained in:
@@ -1849,56 +1849,55 @@ static void mouse_check_grid(colnr_T *vcolp, int *flagsp)
|
||||
int click_grid = mouse_grid;
|
||||
int click_row = mouse_row;
|
||||
int click_col = mouse_col;
|
||||
int max_row = Rows;
|
||||
int max_col = Columns;
|
||||
bool multigrid = ui_has(kUIMultigrid);
|
||||
|
||||
// XXX: this doesn't change click_grid if it is 1, even with multigrid
|
||||
win_T *wp = mouse_find_win(&click_grid, &click_row, &click_col);
|
||||
// Only use vcols[] after the window was redrawn. Mainly matters
|
||||
// for tests, a user would not click before redrawing.
|
||||
if (wp == NULL || wp->w_redr_type != 0) {
|
||||
return;
|
||||
}
|
||||
ScreenGrid *gp = &wp->w_grid;
|
||||
int start_row = 0;
|
||||
int start_col = 0;
|
||||
grid_adjust(&gp, &start_row, &start_col);
|
||||
if (gp->handle != click_grid) {
|
||||
return;
|
||||
}
|
||||
click_row += start_row;
|
||||
click_col += start_col;
|
||||
|
||||
colnr_T col_from_screen = -1;
|
||||
|
||||
win_T *wp = mouse_find_win(&click_grid, &click_row, &click_col);
|
||||
if (wp && multigrid) {
|
||||
max_row = wp->w_grid_alloc.rows;
|
||||
max_col = wp->w_grid_alloc.cols;
|
||||
}
|
||||
if (gp->chars != NULL
|
||||
&& click_row >= 0 && click_row < gp->rows
|
||||
&& click_col >= 0 && click_col < gp->cols) {
|
||||
const size_t off = gp->line_offset[click_row] + (size_t)click_col;
|
||||
col_from_screen = gp->vcols[off];
|
||||
|
||||
if (wp && mouse_row >= 0 && mouse_row < max_row
|
||||
&& mouse_col >= 0 && mouse_col < max_col) {
|
||||
ScreenGrid *gp = multigrid ? &wp->w_grid_alloc : &default_grid;
|
||||
int use_row = multigrid && mouse_grid == 0 ? click_row : mouse_row;
|
||||
int use_col = multigrid && mouse_grid == 0 ? click_col : mouse_col;
|
||||
|
||||
if (gp->chars != NULL) {
|
||||
const size_t off = gp->line_offset[use_row] + (size_t)use_col;
|
||||
|
||||
// Only use vcols[] after the window was redrawn. Mainly matters
|
||||
// for tests, a user would not click before redrawing.
|
||||
if (wp->w_redr_type == 0) {
|
||||
col_from_screen = gp->vcols[off];
|
||||
}
|
||||
|
||||
if (col_from_screen == MAXCOL) {
|
||||
// When clicking after end of line, still need to set correct curswant
|
||||
size_t off_l = gp->line_offset[use_row];
|
||||
if (gp->vcols[off_l] < MAXCOL) {
|
||||
// Binary search to find last char in line
|
||||
size_t off_r = off;
|
||||
while (off_l < off_r) {
|
||||
size_t off_m = (off_l + off_r + 1) / 2;
|
||||
if (gp->vcols[off_m] < MAXCOL) {
|
||||
off_l = off_m;
|
||||
} else {
|
||||
off_r = off_m - 1;
|
||||
}
|
||||
if (col_from_screen == MAXCOL) {
|
||||
// When clicking after end of line, still need to set correct curswant
|
||||
size_t off_l = gp->line_offset[click_row] + (size_t)start_col;
|
||||
if (gp->vcols[off_l] < MAXCOL) {
|
||||
// Binary search to find last char in line
|
||||
size_t off_r = off;
|
||||
while (off_l < off_r) {
|
||||
size_t off_m = (off_l + off_r + 1) / 2;
|
||||
if (gp->vcols[off_m] < MAXCOL) {
|
||||
off_l = off_m;
|
||||
} else {
|
||||
off_r = off_m - 1;
|
||||
}
|
||||
*vcolp = gp->vcols[off_r] + (int)(off - off_r);
|
||||
} else {
|
||||
// Shouldn't normally happen
|
||||
*vcolp = MAXCOL;
|
||||
}
|
||||
} else if (col_from_screen >= 0) {
|
||||
// Use the virtual column from vcols[], it is accurate also after
|
||||
// concealed characters.
|
||||
*vcolp = col_from_screen;
|
||||
*vcolp = gp->vcols[off_r] + (int)(off - off_r);
|
||||
} else {
|
||||
// Clicking on an empty line
|
||||
*vcolp = click_col - start_col;
|
||||
}
|
||||
} else if (col_from_screen >= 0) {
|
||||
// Use the virtual column from vcols[], it is accurate also after
|
||||
// concealed characters.
|
||||
*vcolp = col_from_screen;
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user