From 2b475cb5cc2196a32085fbbdfd7357cbb02a1cb0 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Mon, 11 Sep 2023 08:29:33 +0800 Subject: [PATCH] fix(mouse): click on 'statuscolumn' with 'rightleft' (#25090) --- src/nvim/mouse.c | 14 ++++++++++++-- test/functional/ui/statuscolumn_spec.lua | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/nvim/mouse.c b/src/nvim/mouse.c index 76ac191a68..b8c80cadf5 100644 --- a/src/nvim/mouse.c +++ b/src/nvim/mouse.c @@ -220,7 +220,10 @@ static int get_fpos_of_mouse(pos_T *mpos) // compute the position in the buffer line from the posn on the screen bool below_buffer = mouse_comp_pos(wp, &row, &col, &mpos->lnum); - if (!below_buffer && *wp->w_p_stc != NUL && mouse_col < win_col_off(wp)) { + if (!below_buffer && *wp->w_p_stc != NUL + && (wp->w_p_rl + ? wincol >= wp->w_width_inner - win_col_off(wp) + : wincol < win_col_off(wp))) { return MOUSE_STATUSCOL; } @@ -675,6 +678,10 @@ popupexit: click_col = mouse_col; } + if (in_statuscol && wp->w_p_rl) { + click_col = wp->w_width_inner - click_col - 1; + } + if (click_defs != NULL) { switch (click_defs[click_col].type) { case kStlClickDisabled: @@ -1254,7 +1261,10 @@ retnomove: 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_statuscol = !below_window && !on_status_line && !on_sep_line && !on_winbar - && *wp->w_p_stc != NUL && col < win_col_off(wp); + && *wp->w_p_stc != NUL + && (wp->w_p_rl + ? col >= wp->w_width_inner - win_col_off(wp) + : col < win_col_off(wp)); // The rightmost character of the status line might be a vertical // separator character if there is no connecting window to the right. diff --git a/test/functional/ui/statuscolumn_spec.lua b/test/functional/ui/statuscolumn_spec.lua index ee235cd6b5..742976cbe2 100644 --- a/test/functional/ui/statuscolumn_spec.lua +++ b/test/functional/ui/statuscolumn_spec.lua @@ -532,6 +532,24 @@ describe('statuscolumn', function() eq('0 3 r 7', eval("g:testvar")) meths.input_mouse('right', 'press', '', 0, 3, 0) eq('0 4 r 7', eval("g:testvar")) + + command('rightbelow vsplit') + meths.input_mouse('left', 'press', '', 0, 0, 27) + eq('0 1 l 4', eval("g:testvar")) + meths.input_mouse('right', 'press', '', 0, 3, 27) + eq('0 1 r 7', eval("g:testvar")) + command('setlocal rightleft') + meths.input_mouse('left', 'press', '', 0, 0, 52) + eq('0 1 l 4', eval("g:testvar")) + meths.input_mouse('right', 'press', '', 0, 3, 52) + eq('0 1 r 7', eval("g:testvar")) + command('wincmd H') + meths.input_mouse('left', 'press', '', 0, 0, 25) + eq('0 1 l 4', eval("g:testvar")) + meths.input_mouse('right', 'press', '', 0, 3, 25) + eq('0 1 r 7', eval("g:testvar")) + command('close') + command('set laststatus=2 winbar=%f') command('let g:testvar = ""') -- Check that winbar click doesn't register as statuscolumn click