0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

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 #11483,
            closes #11482)
This commit is contained in:
zeertzjq
2022-11-01 18:35:27 +00:00
committed by Bram Moolenaar
parent 873f41a018
commit 8e0ccb6bc2
5 changed files with 49 additions and 30 deletions

View File

@@ -179,18 +179,6 @@ get_fpos_of_mouse(pos_T *mpos)
} }
#endif #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. * Do the appropriate action for the current mouse click in the current mode.
* Not used for Command-line mode. * Not used for Command-line mode.
@@ -236,6 +224,7 @@ do_mouse(
int fixindent) // PUT_FIXINDENT if fixing indent necessary int fixindent) // PUT_FIXINDENT if fixing indent necessary
{ {
static int do_always = FALSE; // ignore 'mouse' setting next time 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 which_button; // MOUSE_LEFT, _MIDDLE or _RIGHT
int is_click = FALSE; // If FALSE it's a drag or release event 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. // Ignore drag and release events if we didn't get a click.
if (is_click) if (is_click)
mouse_got_click = TRUE; got_click = TRUE;
else else
{ {
if (!mouse_got_click) // didn't get click, ignore if (!got_click) // didn't get click, ignore
return FALSE; 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) if (in_tab_line)
{ {
in_tab_line = FALSE; in_tab_line = FALSE;
@@ -371,7 +360,7 @@ do_mouse(
if (count > 1) if (count > 1)
stuffnumReadbuff(count); stuffnumReadbuff(count);
stuffcharReadbuff(Ctrl_T); stuffcharReadbuff(Ctrl_T);
mouse_got_click = FALSE; // ignore drag&release now got_click = FALSE; // ignore drag&release now
return FALSE; return FALSE;
} }
@@ -652,7 +641,7 @@ do_mouse(
} }
# ifdef FEAT_MENU # ifdef FEAT_MENU
show_popupmenu(); show_popupmenu();
mouse_got_click = FALSE; // ignore release events got_click = FALSE; // ignore release events
# endif # endif
return (jump_flags & CURSOR_MOVED) != 0; return (jump_flags & CURSOR_MOVED) != 0;
#else #else
@@ -709,7 +698,7 @@ do_mouse(
// next mouse click. // next mouse click.
if (!is_drag && oap != NULL && oap->op_type != OP_NOP) if (!is_drag && oap != NULL && oap->op_type != OP_NOP)
{ {
mouse_got_click = FALSE; got_click = FALSE;
oap->motion_type = MCHAR; oap->motion_type = MCHAR;
} }
@@ -908,7 +897,7 @@ do_mouse(
do_cmdline_cmd((char_u *)".cc"); do_cmdline_cmd((char_u *)".cc");
else // location list window else // location list window
do_cmdline_cmd((char_u *)".ll"); do_cmdline_cmd((char_u *)".ll");
mouse_got_click = FALSE; // ignore drag&release now got_click = FALSE; // ignore drag&release now
} }
#endif #endif
@@ -920,7 +909,7 @@ do_mouse(
if (State & MODE_INSERT) if (State & MODE_INSERT)
stuffcharReadbuff(Ctrl_O); stuffcharReadbuff(Ctrl_O);
stuffcharReadbuff(Ctrl_RSB); 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 // 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'); 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. * Move the cursor to the specified row and column on the screen.
* Change current window if necessary. Returns an integer with the * Change current window if necessary. Returns an integer with the
@@ -1556,7 +1556,6 @@ jump_to_mouse(
#endif #endif
static int prev_row = -1; static int prev_row = -1;
static int prev_col = -1; static int prev_col = -1;
static win_T *dragwin = NULL; // window being dragged
static int did_drag = FALSE; // drag was noticed static int did_drag = FALSE; // drag was noticed
win_T *wp, *old_curwin; win_T *wp, *old_curwin;

View File

@@ -1,7 +1,6 @@
/* mouse.c */ /* mouse.c */
void mouse_set_vert_scroll_step(long step); void mouse_set_vert_scroll_step(long step);
void mouse_set_hor_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); int do_mouse(oparg_T *oap, int c, int dir, long count, int fixindent);
void ins_mouse(int c); void ins_mouse(int c);
void ins_mousescroll(int dir); void ins_mousescroll(int dir);
@@ -13,6 +12,7 @@ void del_mouse_termcode(int n);
void setmouse(void); void setmouse(void);
int mouse_has(int c); int mouse_has(int c);
int mouse_model_popup(void); int mouse_model_popup(void);
void reset_dragwin(void);
int jump_to_mouse(int flags, int *inclusive, int which_button); int jump_to_mouse(int flags, int *inclusive, int which_button);
void nv_mousescroll(cmdarg_T *cap); void nv_mousescroll(cmdarg_T *cap);
void nv_mouse(cmdarg_T *cap); void nv_mouse(cmdarg_T *cap);

View File

@@ -562,11 +562,7 @@ func Test_term_mouse_drag_window_separator()
call MouseLeftClick(row, col) call MouseLeftClick(row, col)
let row -= 1 let row -= 1
call MouseLeftDrag(row, col) 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) call assert_equal(rowseparator - 1, winheight(0) + 1, msg)
endif
let row += 1 let row += 1
call MouseLeftDrag(row, col) call MouseLeftDrag(row, col)
call assert_equal(rowseparator, winheight(0) + 1, msg) call assert_equal(rowseparator, winheight(0) + 1, msg)
@@ -779,6 +775,28 @@ func Test_term_mouse_drag_to_move_tab()
\ 'Tab page 2', \ 'Tab page 2',
\ ' Xtab1'], a, msg) \ ' 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 " Click elsewhere so that click in next iteration is not
" interpreted as unwanted double-click. " interpreted as unwanted double-click.
call MouseLeftClick(row, 11) call MouseLeftClick(row, 11)

View File

@@ -695,6 +695,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
825,
/**/ /**/
824, 824,
/**/ /**/

View File

@@ -4269,7 +4269,7 @@ leave_tabpage(
return FAIL; return FAIL;
} }
reset_mouse_got_click(); reset_dragwin();
#if defined(FEAT_GUI) #if defined(FEAT_GUI)
// Remove the scrollbars. They may be added back later. // Remove the scrollbars. They may be added back later.
if (gui.in_use) 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 // If there was a click in a window, it won't be usable for a following
// drag. // drag.
reset_mouse_got_click(); reset_dragwin();
// The tabpage line may have appeared or disappeared, may need to resize // 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 // the frames for that. When the Vim window was resized need to update