From 810da1a7023ec87e3fa644499a655740c01baaf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Linse?= Date: Mon, 27 Sep 2021 14:03:18 +0200 Subject: [PATCH] fix(mouse): correct dragged position in composed layout --- src/nvim/mouse.c | 7 +- test/functional/ui/float_spec.lua | 127 ++++++++++++++++++++++++++++++ test/functional/ui/mouse_spec.lua | 63 +++++++++++++++ 3 files changed, 196 insertions(+), 1 deletion(-) diff --git a/src/nvim/mouse.c b/src/nvim/mouse.c index cf463fd40a..cd9f5fc83e 100644 --- a/src/nvim/mouse.c +++ b/src/nvim/mouse.c @@ -236,6 +236,11 @@ retnomove: redraw_curbuf_later(INVERTED); // delete the inversion } + if (grid == 0) { + row -= curwin->w_grid_alloc.comp_row+curwin->w_grid.row_offset; + col -= curwin->w_grid_alloc.comp_col+curwin->w_grid.col_offset; + } + // When clicking beyond the end of the window, scroll the screen. // Scroll by however many rows outside the window we are. if (row < 0) { @@ -476,7 +481,7 @@ win_T *mouse_find_win(int *gridp, int *rowp, int *colp) static win_T *mouse_find_grid_win(int *gridp, int *rowp, int *colp) { if (*gridp == msg_grid.handle) { - // rowp += msg_grid_pos; // PVS: dead store #11612 + *rowp += msg_grid_pos; *gridp = DEFAULT_GRID_HANDLE; } else if (*gridp > 1) { win_T *wp = get_win_by_grid_handle(*gridp); diff --git a/test/functional/ui/float_spec.lua b/test/functional/ui/float_spec.lua index e57c63bb0f..6c2c4b398a 100644 --- a/test/functional/ui/float_spec.lua +++ b/test/functional/ui/float_spec.lua @@ -46,6 +46,7 @@ describe('float window', function() [24] = {foreground = Screen.colors.Black, background = Screen.colors.Grey80}; [25] = {blend = 100, background = Screen.colors.Gray0}; [26] = {blend = 80, background = Screen.colors.Gray0}; + [27] = {background = Screen.colors.LightGray}; } it('behavior', function() @@ -6174,6 +6175,132 @@ describe('float window', function() end) end) + it("left drag changes visual selection in float window", function() + local buf = meths.create_buf(false,false) + meths.buf_set_lines(buf, 0, -1, true, {'foo', 'bar'}) + meths.open_win(buf, false, {relative='editor', width=20, height=3, row=2, col=5}) + if multigrid then + screen:expect{grid=[[ + ## grid 1 + [2:----------------------------------------]| + [2:----------------------------------------]| + [2:----------------------------------------]| + [2:----------------------------------------]| + [2:----------------------------------------]| + [2:----------------------------------------]| + [3:----------------------------------------]| + ## grid 2 + ^ | + {0:~ }| + {0:~ }| + {0:~ }| + {0:~ }| + {0:~ }| + ## grid 3 + | + ## grid 5 + {1:foo }| + {1:bar }| + {2:~ }| + ]], float_pos={ + [5] = {{id = 1002}, "NW", 1, 2, 5, true, 50}; + }, win_viewport={ + [2] = {win = {id = 1000}, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1}; + [5] = {win = {id = 1002}, topline = 0, botline = 3, curline = 0, curcol = 0, linecount = 2}; + }} + meths.input_mouse('left', 'press', '', 5, 0, 0) + screen:expect{grid=[[ + ## grid 1 + [2:----------------------------------------]| + [2:----------------------------------------]| + [2:----------------------------------------]| + [2:----------------------------------------]| + [2:----------------------------------------]| + [2:----------------------------------------]| + [3:----------------------------------------]| + ## grid 2 + | + {0:~ }| + {0:~ }| + {0:~ }| + {0:~ }| + {0:~ }| + ## grid 3 + | + ## grid 5 + {1:^foo }| + {1:bar }| + {2:~ }| + ]], float_pos={ + [5] = {{id = 1002}, "NW", 1, 2, 5, true, 50}; + }, win_viewport={ + [2] = {win = {id = 1000}, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1}; + [5] = {win = {id = 1002}, topline = 0, botline = 3, curline = 0, curcol = 0, linecount = 2}; + }} + meths.input_mouse('left', 'drag', '', 5, 1, 2) + screen:expect{grid=[[ + ## grid 1 + [2:----------------------------------------]| + [2:----------------------------------------]| + [2:----------------------------------------]| + [2:----------------------------------------]| + [2:----------------------------------------]| + [2:----------------------------------------]| + [3:----------------------------------------]| + ## grid 2 + | + {0:~ }| + {0:~ }| + {0:~ }| + {0:~ }| + {0:~ }| + ## grid 3 + {3:-- VISUAL --} | + ## grid 5 + {27:foo}{1: }| + {27:ba}{1:^r }| + {2:~ }| + ]], float_pos={ + [5] = {{id = 1002}, "NW", 1, 2, 5, true, 50}; + }, win_viewport={ + [2] = {win = {id = 1000}, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1}; + [5] = {win = {id = 1002}, topline = 0, botline = 3, curline = 1, curcol = 2, linecount = 2}; + }} + else + screen:expect{grid=[[ + ^ | + {0:~ }| + {0:~ }{1:foo }{0: }| + {0:~ }{1:bar }{0: }| + {0:~ }{2:~ }{0: }| + {0:~ }| + | + ]]} + + meths.input_mouse('left', 'press', '', 0, 2, 5) + screen:expect{grid=[[ + | + {0:~ }| + {0:~ }{1:^foo }{0: }| + {0:~ }{1:bar }{0: }| + {0:~ }{2:~ }{0: }| + {0:~ }| + | + ]]} + + meths.input_mouse('left', 'drag', '', 0, 3, 7) + screen:expect{grid=[[ + | + {0:~ }| + {0:~ }{27:foo}{1: }{0: }| + {0:~ }{27:ba}{1:^r }{0: }| + {0:~ }{2:~ }{0: }| + {0:~ }| + {3:-- VISUAL --} | + ]]} + end + end) + it("'winblend' option", function() screen:try_resize(50,9) screen:set_default_attr_ids({ diff --git a/test/functional/ui/mouse_spec.lua b/test/functional/ui/mouse_spec.lua index d3fe38ef52..baacef358f 100644 --- a/test/functional/ui/mouse_spec.lua +++ b/test/functional/ui/mouse_spec.lua @@ -585,6 +585,69 @@ describe('ui/mouse/input', function() ]]) end) + it('left drag changes visual selection in split layout', function() + screen:try_resize(53,14) + command('set mouse=a') + command('vsplit') + command('wincmd l') + command('below split') + command('enew') + feed('ifoo\nbar') + + screen:expect{grid=[[ + testing {4:│}testing | + mouse {4:│}mouse | + support and selection {4:│}support and selection | + {0:~ }{4:│}{0:~ }| + {0:~ }{4:│}{0:~ }| + {0:~ }{4:│[No Name] [+] }| + {0:~ }{4:│}foo{0:$} | + {0:~ }{4:│}ba^r{0:$} | + {0:~ }{4:│}{0:~ }| + {0:~ }{4:│}{0:~ }| + {0:~ }{4:│}{0:~ }| + {0:~ }{4:│}{0:~ }| + {4:[No Name] [+] }{5:[No Name] [+] }| + | + ]]} + + meths.input_mouse('left', 'press', '', 0, 6, 27) + screen:expect{grid=[[ + testing {4:│}testing | + mouse {4:│}mouse | + support and selection {4:│}support and selection | + {0:~ }{4:│}{0:~ }| + {0:~ }{4:│}{0:~ }| + {0:~ }{4:│[No Name] [+] }| + {0:~ }{4:│}^foo{0:$} | + {0:~ }{4:│}bar{0:$} | + {0:~ }{4:│}{0:~ }| + {0:~ }{4:│}{0:~ }| + {0:~ }{4:│}{0:~ }| + {0:~ }{4:│}{0:~ }| + {4:[No Name] [+] }{5:[No Name] [+] }| + | + ]]} + meths.input_mouse('left', 'drag', '', 0, 7, 30) + + screen:expect{grid=[[ + testing {4:│}testing | + mouse {4:│}mouse | + support and selection {4:│}support and selection | + {0:~ }{4:│}{0:~ }| + {0:~ }{4:│}{0:~ }| + {0:~ }{4:│[No Name] [+] }| + {0:~ }{4:│}{1:foo}{3:$} | + {0:~ }{4:│}{1:bar}{0:^$} | + {0:~ }{4:│}{0:~ }| + {0:~ }{4:│}{0:~ }| + {0:~ }{4:│}{0:~ }| + {0:~ }{4:│}{0:~ }| + {4:[No Name] [+] }{5:[No Name] [+] }| + {2:-- VISUAL --} | + ]]} + end) + it('two clicks will select the word and enter VISUAL', function() feed('<2,2><2,2>') screen:expect([[