vim-patch:9.0.2177: Wrong cursor position when dragging out of window (#26661)

Problem:  Wrong cursor position when dragging out of window.
Solution: Don't use ScreenCols[] when mouse is not in current window.

closes: vim/vim#13717

ec14924368
This commit is contained in:
zeertzjq 2023-12-20 05:58:48 +08:00 committed by GitHub
parent a61d8b615c
commit c95845f3df
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 8 deletions

View File

@ -1849,13 +1849,13 @@ static void mouse_check_grid(colnr_T *vcolp, int *flagsp)
int click_col = mouse_col; int click_col = mouse_col;
// XXX: this doesn't change click_grid if it is 1, even with multigrid // 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); if (mouse_find_win(&click_grid, &click_row, &click_col) != curwin
// Only use vcols[] after the window was redrawn. Mainly matters // Only use vcols[] after the window was redrawn. Mainly matters
// for tests, a user would not click before redrawing. // for tests, a user would not click before redrawing.
if (wp == NULL || wp->w_redr_type != 0) { || curwin->w_redr_type != 0) {
return; return;
} }
ScreenGrid *gp = &wp->w_grid; ScreenGrid *gp = &curwin->w_grid;
int start_row = 0; int start_row = 0;
int start_col = 0; int start_col = 0;
grid_adjust(&gp, &start_row, &start_col); grid_adjust(&gp, &start_row, &start_col);
@ -1891,12 +1891,12 @@ static void mouse_check_grid(colnr_T *vcolp, int *flagsp)
if (eol_vcol < 0) { if (eol_vcol < 0) {
// Empty line or whole line before w_leftcol, // Empty line or whole line before w_leftcol,
// with columns before buffer text // with columns before buffer text
eol_vcol = wp->w_leftcol - 1; eol_vcol = curwin->w_leftcol - 1;
} }
*vcolp = eol_vcol + (int)(off - off_r); *vcolp = eol_vcol + (int)(off - off_r);
} else { } else {
// Empty line or whole line before w_leftcol // Empty line or whole line before w_leftcol
*vcolp = click_col - start_col + wp->w_leftcol; *vcolp = click_col - start_col + curwin->w_leftcol;
} }
} else if (col_from_screen >= 0) { } else if (col_from_screen >= 0) {
// Use the virtual column from vcols[], it is accurate also after // Use the virtual column from vcols[], it is accurate also after

View File

@ -1589,6 +1589,41 @@ func Test_Visual_r_CTRL_C()
call feedkeys("\<c-v>$gr\<c-c>", 'tx') call feedkeys("\<c-v>$gr\<c-c>", 'tx')
call assert_equal([''], getline(1, 1)) call assert_equal([''], getline(1, 1))
bw! bw!
endfu endfunc
func Test_visual_drag_out_of_window()
rightbelow vnew
call setline(1, '123456789')
set mouse=a
func ClickExpr(off)
call Ntest_setmouse(1, getwininfo(win_getid())[0].wincol + a:off)
return "\<LeftMouse>"
endfunc
func DragExpr(off)
call Ntest_setmouse(1, getwininfo(win_getid())[0].wincol + a:off)
return "\<LeftDrag>"
endfunc
nnoremap <expr> <F2> ClickExpr(5)
nnoremap <expr> <F3> DragExpr(-1)
redraw
call feedkeys("\<F2>\<F3>\<LeftRelease>", 'tx')
call assert_equal([1, 6], [col('.'), col('v')])
call feedkeys("\<Esc>", 'tx')
nnoremap <expr> <F2> ClickExpr(6)
nnoremap <expr> <F3> DragExpr(-2)
redraw
call feedkeys("\<F2>\<F3>\<LeftRelease>", 'tx')
call assert_equal([1, 7], [col('.'), col('v')])
call feedkeys("\<Esc>", 'tx')
nunmap <F2>
nunmap <F3>
delfunc ClickExpr
delfunc DragExpr
set mouse&
bwipe!
endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab