# HG changeset patch # User Bram Moolenaar # Date 1667384335 -3600 # Node ID eb51299c4bfc11e8e41fbaad6ae0d1879d95c84e # Parent 71079a66643105311fd0bbe602d9bf3fe46fc469 patch 9.0.0825: cannot drag an entry in the tabpage line Commit: https://github.com/vim/vim/commit/8e0ccb6bc21a446e5c6375b7fdf200fb53a129da Author: zeertzjq Date: Tue Nov 1 18:35:27 2022 +0000 patch 9.0.0825: cannot drag an entry in the tabpage line Problem: Cannot drag an entry in the tabpage line. Solution: Clear dragwin instead of got_click. (closes https://github.com/vim/vim/issues/11483, closes #11482) diff --git a/src/mouse.c b/src/mouse.c --- a/src/mouse.c +++ b/src/mouse.c @@ -179,18 +179,6 @@ get_fpos_of_mouse(pos_T *mpos) } #endif -static int mouse_got_click = FALSE; // got a click some time back - -/* - * Reset the flag that a mouse click was seen. To be called when switching tab - * page. - */ - 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. @@ -236,6 +224,7 @@ do_mouse( int fixindent) // PUT_FIXINDENT if fixing indent necessary { static int do_always = FALSE; // ignore 'mouse' setting next time + static int got_click = FALSE; // got a click some time back int which_button; // MOUSE_LEFT, _MIDDLE or _RIGHT int is_click = FALSE; // If FALSE it's a drag or release event @@ -347,14 +336,14 @@ do_mouse( // 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 mouse_got_click + if (!is_drag) // release, reset got_click { - mouse_got_click = FALSE; + got_click = FALSE; if (in_tab_line) { in_tab_line = FALSE; @@ -371,7 +360,7 @@ do_mouse( if (count > 1) stuffnumReadbuff(count); stuffcharReadbuff(Ctrl_T); - mouse_got_click = FALSE; // ignore drag&release now + got_click = FALSE; // ignore drag&release now return FALSE; } @@ -652,7 +641,7 @@ do_mouse( } # ifdef FEAT_MENU show_popupmenu(); - mouse_got_click = FALSE; // ignore release events + got_click = FALSE; // ignore release events # endif return (jump_flags & CURSOR_MOVED) != 0; #else @@ -709,7 +698,7 @@ do_mouse( // next mouse click. if (!is_drag && oap != NULL && oap->op_type != OP_NOP) { - mouse_got_click = FALSE; + got_click = FALSE; oap->motion_type = MCHAR; } @@ -908,7 +897,7 @@ do_mouse( do_cmdline_cmd((char_u *)".cc"); else // location list window do_cmdline_cmd((char_u *)".ll"); - mouse_got_click = FALSE; // ignore drag&release now + got_click = FALSE; // ignore drag&release now } #endif @@ -920,7 +909,7 @@ do_mouse( if (State & MODE_INSERT) stuffcharReadbuff(Ctrl_O); stuffcharReadbuff(Ctrl_RSB); - mouse_got_click = FALSE; // ignore drag&release now + got_click = FALSE; // ignore drag&release now } // Shift-Mouse click searches for the next occurrence of the word under @@ -1513,6 +1502,17 @@ mouse_model_popup(void) return (p_mousem[0] == 'p'); } +static win_T *dragwin = NULL; // window being dragged + +/* + * Reset the window being dragged. To be called when switching tab page. + */ + void +reset_dragwin(void) +{ + dragwin = NULL; +} + /* * Move the cursor to the specified row and column on the screen. * Change current window if necessary. Returns an integer with the @@ -1556,7 +1556,6 @@ jump_to_mouse( #endif static int prev_row = -1; static int prev_col = -1; - static win_T *dragwin = NULL; // window being dragged static int did_drag = FALSE; // drag was noticed win_T *wp, *old_curwin; diff --git a/src/proto/mouse.pro b/src/proto/mouse.pro --- a/src/proto/mouse.pro +++ b/src/proto/mouse.pro @@ -1,7 +1,6 @@ /* mouse.c */ void mouse_set_vert_scroll_step(long step); void mouse_set_hor_scroll_step(long step); -void reset_mouse_got_click(void); int do_mouse(oparg_T *oap, int c, int dir, long count, int fixindent); void ins_mouse(int c); void ins_mousescroll(int dir); @@ -13,6 +12,7 @@ void del_mouse_termcode(int n); void setmouse(void); int mouse_has(int c); int mouse_model_popup(void); +void reset_dragwin(void); int jump_to_mouse(int flags, int *inclusive, int which_button); void nv_mousescroll(cmdarg_T *cap); void nv_mouse(cmdarg_T *cap); diff --git a/src/testdir/test_termcodes.vim b/src/testdir/test_termcodes.vim --- a/src/testdir/test_termcodes.vim +++ b/src/testdir/test_termcodes.vim @@ -562,11 +562,7 @@ func Test_term_mouse_drag_window_separat call MouseLeftClick(row, col) let row -= 1 call MouseLeftDrag(row, col) - " FIXME: for unknown reason this test fails, related to calling - " reset_mouse_got_click() earlier. - if ttymouse_val !=# 'xterm2' - call assert_equal(rowseparator - 1, winheight(0) + 1, msg) - endif + call assert_equal(rowseparator - 1, winheight(0) + 1, msg) let row += 1 call MouseLeftDrag(row, col) call assert_equal(rowseparator, winheight(0) + 1, msg) @@ -779,6 +775,28 @@ func Test_term_mouse_drag_to_move_tab() \ 'Tab page 2', \ ' Xtab1'], a, msg) + " Switch to tab1 + tabnext + let a = split(execute(':tabs'), "\n") + call assert_equal(['Tab page 1', + \ ' Xtab2', + \ 'Tab page 2', + \ '> Xtab1'], a, msg) + + " Click in tab2 and drag it to tab1. + " This time it is non-current tab. + call MouseLeftClick(row, 6) + call assert_equal(0, getcharmod(), msg) + for col in [7, 8, 9, 10] + call MouseLeftDrag(row, col) + endfor + call MouseLeftRelease(row, col) + let a = split(execute(':tabs'), "\n") + call assert_equal(['Tab page 1', + \ ' Xtab1', + \ 'Tab page 2', + \ '> Xtab2'], a, msg) + " Click elsewhere so that click in next iteration is not " interpreted as unwanted double-click. call MouseLeftClick(row, 11) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 825, +/**/ 824, /**/ 823, diff --git a/src/window.c b/src/window.c --- a/src/window.c +++ b/src/window.c @@ -4269,7 +4269,7 @@ leave_tabpage( return FAIL; } - reset_mouse_got_click(); + reset_dragwin(); #if defined(FEAT_GUI) // Remove the scrollbars. They may be added back later. if (gui.in_use) @@ -4338,7 +4338,7 @@ enter_tabpage( // If there was a click in a window, it won't be usable for a following // drag. - reset_mouse_got_click(); + reset_dragwin(); // The tabpage line may have appeared or disappeared, may need to resize // the frames for that. When the Vim window was resized need to update