From e09adfdcffe8a94e09d834bb49f42fd725ddd47b Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Fri, 5 Jan 2024 10:59:52 +0800 Subject: [PATCH] fix(terminal): check if mouse on statusline/tabline/winbar/vsep (#26892) --- src/nvim/mouse.c | 4 +- src/nvim/terminal.c | 6 +- test/functional/terminal/mouse_spec.lua | 128 ++++++++++++++++++++++++ 3 files changed, 134 insertions(+), 4 deletions(-) diff --git a/src/nvim/mouse.c b/src/nvim/mouse.c index 7405c8c38b..eeec4e4cd9 100644 --- a/src/nvim/mouse.c +++ b/src/nvim/mouse.c @@ -229,7 +229,7 @@ static int get_fpos_of_mouse(pos_T *mpos) return IN_STATUS_LINE; } - if (winrow == -1 && wp->w_winbar_height != 0) { + if (winrow < 0 && winrow + wp->w_winbar_height >= 0) { return MOUSE_WINBAR; } @@ -1249,7 +1249,7 @@ retnomove: bool below_window = grid == DEFAULT_GRID_HANDLE && row + wp->w_winbar_height >= wp->w_height; on_status_line = below_window && row + wp->w_winbar_height - wp->w_height + 1 == 1; on_sep_line = grid == DEFAULT_GRID_HANDLE && col >= wp->w_width && col - wp->w_width + 1 == 1; - on_winbar = row == -1 && wp->w_winbar_height != 0; + on_winbar = row < 0 && row + wp->w_winbar_height >= 0; on_statuscol = !below_window && !on_status_line && !on_sep_line && !on_winbar && *wp->w_p_stc != NUL && (wp->w_p_rl diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c index dda629ac27..c6a2cb3354 100644 --- a/src/nvim/terminal.c +++ b/src/nvim/terminal.c @@ -1437,8 +1437,10 @@ static bool send_mouse_event(Terminal *term, int c) } int offset; - if (term->forward_mouse && mouse_win->w_buffer->terminal == term - && col >= (offset = win_col_off(mouse_win))) { + if (term->forward_mouse && mouse_win->w_buffer->terminal == term && row >= 0 + && (grid > 1 || row + mouse_win->w_winbar_height < mouse_win->w_height) + && col >= (offset = win_col_off(mouse_win)) + && (grid > 1 || col < mouse_win->w_width)) { // event in the terminal window and mouse events was enabled by the // program. translate and forward the event int button; diff --git a/test/functional/terminal/mouse_spec.lua b/test/functional/terminal/mouse_spec.lua index fd0dd46d71..65d0c8f854 100644 --- a/test/functional/terminal/mouse_spec.lua +++ b/test/functional/terminal/mouse_spec.lua @@ -243,6 +243,134 @@ describe(':terminal mouse', function() {3:-- TERMINAL --} | ]]) end) + + it('will lose focus if statusline is clicked', function() + command('set laststatus=2') + screen:expect([[ + line29 | + line30 | + mouse enabled | + rows: 5, cols: 50 | + {1: } | + ========== | + {3:-- TERMINAL --} | + ]]) + feed('<0,5>') + screen:expect([[ + line29 | + line30 | + mouse enabled | + rows: 5, cols: 50 | + {2:^ } | + ========== | + | + ]]) + feed('<0,4>') + screen:expect([[ + mouse enabled | + rows: 5, cols: 50 | + rows: 4, cols: 50 | + {2:^ } | + ========== | + |*2 + ]]) + end) + + it('will lose focus if right separator is clicked', function() + command('rightbelow vnew | wincmd p | startinsert') + screen:expect([[ + line29 │ | + line30 │{4:~ }| + mouse enabled │{4:~ }| + rows: 5, cols: 24 │{4:~ }| + {1: } │{4:~ }| + ========== ========== | + {3:-- TERMINAL --} | + ]]) + feed('<24,0>') + screen:expect([[ + line29 │ | + line30 │{4:~ }| + mouse enabled │{4:~ }| + rows: 5, cols: 24 │{4:~ }| + {2:^ } │{4:~ }| + ========== ========== | + | + ]]) + feed('<23,0>') + screen:expect([[ + line30 │ | + mouse enabled │{4:~ }| + rows: 5, cols: 24 │{4:~ }| + rows: 5, cols: 23 │{4:~ }| + {2:^ } │{4:~ }| + ========== ========== | + | + ]]) + end) + + it('will lose focus if winbar/tabline is clicked', function() + command('setlocal winbar=WINBAR') + screen:expect([[ + {3:WINBAR }| + line29 | + line30 | + mouse enabled | + rows: 5, cols: 50 | + {1: } | + {3:-- TERMINAL --} | + ]]) + feed('<0,0>') + screen:expect([[ + {3:WINBAR }| + line29 | + line30 | + mouse enabled | + rows: 5, cols: 50 | + {2:^ } | + | + ]]) + command('set showtabline=2 tabline=TABLINE | startinsert') + screen:expect([[ + {1:TABLINE }| + {3:WINBAR }| + mouse enabled | + rows: 5, cols: 50 | + rows: 4, cols: 50 | + {1: } | + {3:-- TERMINAL --} | + ]]) + feed('<0,0>') + screen:expect([[ + {1:TABLINE }| + {3:WINBAR }| + mouse enabled | + rows: 5, cols: 50 | + rows: 4, cols: 50 | + {2:^ } | + | + ]]) + command('setlocal winbar= | startinsert') + screen:expect([[ + {1:TABLINE }| + mouse enabled | + rows: 5, cols: 50 | + rows: 4, cols: 50 | + rows: 5, cols: 50 | + {1: } | + {3:-- TERMINAL --} | + ]]) + feed('<0,0>') + screen:expect([[ + {1:TABLINE }| + mouse enabled | + rows: 5, cols: 50 | + rows: 4, cols: 50 | + rows: 5, cols: 50 | + {2:^ } | + | + ]]) + end) end) describe('with a split window and other buffer', function()