diff --git a/src/nvim/mouse.c b/src/nvim/mouse.c index c43d192d76..a4f4a49fcf 100644 --- a/src/nvim/mouse.c +++ b/src/nvim/mouse.c @@ -137,6 +137,8 @@ static void move_tab_to_mouse(void) } } +static bool got_click = false; // got a click some time back + /// Call click definition function for column "col" in the "click_defs" array for button /// "which_button". static void call_click_def_func(StlClickDefinition *click_defs, int col, int which_button) @@ -192,6 +194,8 @@ static void call_click_def_func(StlClickDefinition *click_defs, int col, int whi typval_T rettv; (void)call_vim_function(click_defs[col].func, ARRAY_SIZE(argv), argv, &rettv); tv_clear(&rettv); + // Make sure next click does not register as drag when callback absorbs the release event. + got_click = false; } /// Translate window coordinates to buffer position without any side effects. @@ -248,14 +252,6 @@ static int get_fpos_of_mouse(pos_T *mpos) return IN_BUFFER; } -static bool mouse_got_click = false; ///< got a click some time back - -/// Reset the flag that a mouse click was seen. -void reset_mouse_got_click(void) -{ - mouse_got_click = false; -} - /// Do the appropriate action for the current mouse click in the current mode. /// Not used for Command-line mode. /// @@ -354,13 +350,13 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) // Ignore drag and release events if we didn't get a click. if (is_click) { - mouse_got_click = true; + got_click = true; } else { - if (!mouse_got_click) { // didn't get click, ignore + if (!got_click) { // didn't get click, ignore return false; } if (!is_drag) { // release, reset got_click - mouse_got_click = false; + got_click = false; if (in_tab_line) { in_tab_line = false; return false; @@ -377,7 +373,7 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) stuffnumReadbuff(count); } stuffcharReadbuff(Ctrl_T); - mouse_got_click = false; // ignore drag&release now + got_click = false; // ignore drag&release now return false; } @@ -601,7 +597,7 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent) ui_flush(); // Update before showing popup menu } show_popupmenu(); - mouse_got_click = false; // ignore release events + got_click = false; // ignore release events return (jump_flags & CURSOR_MOVED) != 0; } if (which_button == MOUSE_LEFT @@ -641,7 +637,7 @@ popupexit: // If an operator is pending, ignore all drags and releases until the next mouse click. if (!is_drag && oap != NULL && oap->op_type != OP_NOP) { - mouse_got_click = false; + got_click = false; oap->motion_type = kMTCharWise; } @@ -851,7 +847,7 @@ popupexit: } else { // location list window do_cmdline_cmd(".ll"); } - mouse_got_click = false; // ignore drag&release now + got_click = false; // ignore drag&release now } else if ((mod_mask & MOD_MASK_CTRL) || (curbuf->b_help && (mod_mask & MOD_MASK_MULTI_CLICK) == MOD_MASK_2CLICK)) { // Ctrl-Mouse click (or double click in a help window) jumps to the tag @@ -860,7 +856,7 @@ popupexit: stuffcharReadbuff(Ctrl_O); } stuffcharReadbuff(Ctrl_RSB); - mouse_got_click = false; // ignore drag&release now + got_click = false; // ignore drag&release now } else if ((mod_mask & MOD_MASK_SHIFT)) { // Shift-Mouse click searches for the next occurrence of the word under // the mouse pointer diff --git a/src/nvim/popupmenu.c b/src/nvim/popupmenu.c index 26827464b4..93d5796faf 100644 --- a/src/nvim/popupmenu.c +++ b/src/nvim/popupmenu.c @@ -30,7 +30,6 @@ #include "nvim/memory.h" #include "nvim/menu.h" #include "nvim/message.h" -#include "nvim/mouse.h" #include "nvim/move.h" #include "nvim/option.h" #include "nvim/popupmenu.h" @@ -1163,7 +1162,6 @@ void pum_show_popupmenu(vimmenu_T *menu) // right mouse release: select clicked item, close if any pum_select_mouse_pos(); if (pum_selected >= 0) { - reset_mouse_got_click(); pum_execute_menu(menu, mode); break; } diff --git a/test/functional/ui/statuscolumn_spec.lua b/test/functional/ui/statuscolumn_spec.lua index ddf13c6d13..b2d5e3b2d3 100644 --- a/test/functional/ui/statuscolumn_spec.lua +++ b/test/functional/ui/statuscolumn_spec.lua @@ -592,7 +592,7 @@ describe('statuscolumn', function() eq('0 1 l 11', eval("g:testvar")) end) - it('selecting popupmenu does not drag mouse', function() + it('popupmenu callback does not drag mouse on close', function() screen:try_resize(screen._width, 2) screen:set_default_attr_ids({ [0] = {foreground = Screen.colors.Brown}, @@ -606,6 +606,7 @@ describe('statuscolumn', function() popup PopupStc endfunction ]]) + -- clicking an item does not drag mouse meths.input_mouse('left', 'press', '', 0, 0, 0) screen:expect([[ {0:8 }^aaaaa | @@ -617,6 +618,19 @@ describe('statuscolumn', function() {0:8 }^aaaaa | 0 1 l 8 | ]]) + command('echo') + -- clicking outside to close the menu does not drag mouse + meths.input_mouse('left', 'press', '', 0, 0, 0) + screen:expect([[ + {0:8 }^aaaaa | + {1: Echo } | + ]]) + meths.input_mouse('left', 'press', '', 0, 0, 10) + meths.input_mouse('left', 'release', '', 0, 0, 10) + screen:expect([[ + {0:8 }^aaaaa | + | + ]]) end) end) end