From 2f8fb4f28ab92d62e07d1d64a6dd89e0b6eb7253 Mon Sep 17 00:00:00 2001 From: luukvbaal Date: Sun, 13 Apr 2025 23:30:24 +0200 Subject: [PATCH] fix(mouse): mouseclick after conceal_lines is miscalculated #33451 Problem: Computed buffer line for mouse position does not take into account concealed lines on the reached row. Solution: Adjust for concealed lines at the end of the loop computing the buffer position. --- src/nvim/mouse.c | 7 +++++++ test/functional/ui/mouse_spec.lua | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/src/nvim/mouse.c b/src/nvim/mouse.c index 0003d88543..984f746add 100644 --- a/src/nvim/mouse.c +++ b/src/nvim/mouse.c @@ -9,6 +9,7 @@ #include "nvim/buffer_defs.h" #include "nvim/charset.h" #include "nvim/cursor.h" +#include "nvim/decoration.h" #include "nvim/drawscreen.h" #include "nvim/edit.h" #include "nvim/eval.h" @@ -1659,6 +1660,12 @@ bool mouse_comp_pos(win_T *win, int *rowp, int *colp, linenr_T *lnump) lnum++; } + // Mouse row reached, adjust lnum for concealed lines. + while (decor_conceal_line(win, lnum - 1, false)) { + lnum++; + hasFolding(win, lnum, NULL, &lnum); + } + if (!retval) { // Compute the column without wrapping. int off = win_col_off(win) - win_col_off2(win); diff --git a/test/functional/ui/mouse_spec.lua b/test/functional/ui/mouse_spec.lua index 90b3094082..8d7b0cac86 100644 --- a/test/functional/ui/mouse_spec.lua +++ b/test/functional/ui/mouse_spec.lua @@ -2082,4 +2082,12 @@ describe('ui/mouse/input', function() feed('') eq('bar', api.nvim_get_var('menustr')) end) + + it('below a concealed line #33450', function() + api.nvim_set_option_value('conceallevel', 2, {}) + api.nvim_buf_set_extmark(0, api.nvim_create_namespace(''), 1, 0, { conceal_lines = '' }) + api.nvim_input_mouse('right', 'press', '', 0, 1, 0) + api.nvim_input_mouse('right', 'release', '', 0, 1, 0) + eq(3, fn.line('.')) + end) end)