forked from aniani/vim
patch 9.0.0911: with 'smoothscroll' set mouse click position may be wrong
Problem: With 'smoothscroll' set mouse click position may be wrong. Solution: Adjust computations for w_skipcol. (Yee Cheng Chin, closes #11514)
This commit is contained in:
parent
c934bfa1b7
commit
e6392b1021
23
src/mouse.c
23
src/mouse.c
@ -3034,14 +3034,29 @@ mouse_comp_pos(
|
|||||||
row -= win->w_topfill;
|
row -= win->w_topfill;
|
||||||
else
|
else
|
||||||
row -= diff_check_fill(win, lnum);
|
row -= diff_check_fill(win, lnum);
|
||||||
count = plines_win_nofill(win, lnum, TRUE);
|
count = plines_win_nofill(win, lnum, FALSE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
count = plines_win(win, lnum, TRUE);
|
count = plines_win(win, lnum, FALSE);
|
||||||
if (plines_cache != NULL && cache_idx < Rows)
|
if (plines_cache != NULL && cache_idx < Rows)
|
||||||
plines_cache[cache_idx] = count;
|
plines_cache[cache_idx] = count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (win->w_skipcol > 0 && lnum == win->w_topline)
|
||||||
|
{
|
||||||
|
// Adjust for 'smoothscroll' clipping the top screen lines.
|
||||||
|
// A similar formula is used in curs_columns().
|
||||||
|
int width1 = win->w_width - win_col_off(win);
|
||||||
|
int skip_lines = 0;
|
||||||
|
if (win->w_skipcol > width1)
|
||||||
|
skip_lines = (win->w_skipcol - width1)
|
||||||
|
/ (width1 + win_col_off2(win)) + 1;
|
||||||
|
else if (win->w_skipcol > 0)
|
||||||
|
skip_lines = 1;
|
||||||
|
count -= skip_lines;
|
||||||
|
}
|
||||||
|
|
||||||
if (count > row)
|
if (count > row)
|
||||||
break; // Position is in this buffer line.
|
break; // Position is in this buffer line.
|
||||||
#ifdef FEAT_FOLDING
|
#ifdef FEAT_FOLDING
|
||||||
@ -3063,7 +3078,9 @@ mouse_comp_pos(
|
|||||||
if (col < off)
|
if (col < off)
|
||||||
col = off;
|
col = off;
|
||||||
col += row * (win->w_width - off);
|
col += row * (win->w_width - off);
|
||||||
// add skip column (for long wrapping line)
|
|
||||||
|
// Add skip column for the topline.
|
||||||
|
if (lnum == win->w_topline)
|
||||||
col += win->w_skipcol;
|
col += win->w_skipcol;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
source check.vim
|
source check.vim
|
||||||
source screendump.vim
|
source screendump.vim
|
||||||
|
source mouse.vim
|
||||||
|
|
||||||
func Test_reset_scroll()
|
func Test_reset_scroll()
|
||||||
let scr = &l:scroll
|
let scr = &l:scroll
|
||||||
@ -452,5 +453,65 @@ func Test_smoothscroll_cursor_position()
|
|||||||
bwipeout!
|
bwipeout!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" Test that mouse picking is still accurate when we have smooth scrolled lines
|
||||||
|
func Test_smoothscroll_mouse_pos()
|
||||||
|
CheckNotGui
|
||||||
|
CheckUnix
|
||||||
|
|
||||||
|
let save_mouse = &mouse
|
||||||
|
let save_term = &term
|
||||||
|
let save_ttymouse = &ttymouse
|
||||||
|
set mouse=a term=xterm ttymouse=xterm2
|
||||||
|
|
||||||
|
call NewWindow(10, 20)
|
||||||
|
setl smoothscroll wrap
|
||||||
|
" First line will wrap to 3 physical lines. 2nd/3rd lines are short lines.
|
||||||
|
call setline(1, ["abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", "line 2", "line 3"])
|
||||||
|
|
||||||
|
func s:check_mouse_click(row, col, buf_row, buf_col)
|
||||||
|
call MouseLeftClick(a:row, a:col)
|
||||||
|
|
||||||
|
call assert_equal(a:col, wincol())
|
||||||
|
call assert_equal(a:row, winline())
|
||||||
|
call assert_equal(a:buf_row, line('.'))
|
||||||
|
call assert_equal(a:buf_col, col('.'))
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" Check that clicking without scroll works first.
|
||||||
|
call s:check_mouse_click(3, 5, 1, 45)
|
||||||
|
call s:check_mouse_click(4, 1, 2, 1)
|
||||||
|
call s:check_mouse_click(4, 6, 2, 6)
|
||||||
|
call s:check_mouse_click(5, 1, 3, 1)
|
||||||
|
call s:check_mouse_click(5, 6, 3, 6)
|
||||||
|
|
||||||
|
" Smooth scroll, and checks that this didn't mess up mouse clicking
|
||||||
|
exe "normal \<C-E>"
|
||||||
|
call s:check_mouse_click(2, 5, 1, 45)
|
||||||
|
call s:check_mouse_click(3, 1, 2, 1)
|
||||||
|
call s:check_mouse_click(3, 6, 2, 6)
|
||||||
|
call s:check_mouse_click(4, 1, 3, 1)
|
||||||
|
call s:check_mouse_click(4, 6, 3, 6)
|
||||||
|
|
||||||
|
exe "normal \<C-E>"
|
||||||
|
call s:check_mouse_click(1, 5, 1, 45)
|
||||||
|
call s:check_mouse_click(2, 1, 2, 1)
|
||||||
|
call s:check_mouse_click(2, 6, 2, 6)
|
||||||
|
call s:check_mouse_click(3, 1, 3, 1)
|
||||||
|
call s:check_mouse_click(3, 6, 3, 6)
|
||||||
|
|
||||||
|
" Make a new first line 11 physical lines tall so it's taller than window
|
||||||
|
" height, to test overflow calculations with really long lines wrapping.
|
||||||
|
normal gg
|
||||||
|
call setline(1, "12345678901234567890"->repeat(11))
|
||||||
|
exe "normal 6\<C-E>"
|
||||||
|
call s:check_mouse_click(5, 1, 1, 201)
|
||||||
|
call s:check_mouse_click(6, 1, 2, 1)
|
||||||
|
call s:check_mouse_click(7, 1, 3, 1)
|
||||||
|
|
||||||
|
let &mouse = save_mouse
|
||||||
|
let &term = save_term
|
||||||
|
let &ttymouse = save_ttymouse
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@ -695,6 +695,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
911,
|
||||||
/**/
|
/**/
|
||||||
910,
|
910,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user