]> granicus.if.org Git - vim/commitdiff
patch 9.0.0825: cannot drag an entry in the tabpage line v9.0.0825
authorzeertzjq <zeertzjq@outlook.com>
Tue, 1 Nov 2022 18:35:27 +0000 (18:35 +0000)
committerBram Moolenaar <Bram@vim.org>
Tue, 1 Nov 2022 18:35:27 +0000 (18:35 +0000)
Problem:    Cannot drag an entry in the tabpage line.
Solution:   Clear dragwin instead of got_click. (closes #11483,
            closes #11482)

src/mouse.c
src/proto/mouse.pro
src/testdir/test_termcodes.vim
src/version.c
src/window.c

index 40c2159c04ff5780e60a414b9886ead9e6369f73..25e65ed72b23204a5ff9f3ec3de4dbbb7683fe46 100644 (file)
@@ -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;
index 65976892a52fd201087485302d1cf7a8482a94b4..7ce470c6c0195e865c4ef95b1eaca3754857eece 100644 (file)
@@ -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);
index cb9897e49326b8c15b839e7e35b0ff11323ec1d6..0b2365e23bc513e2876c94d903bc335d4ec80a18 100644 (file)
@@ -562,11 +562,7 @@ func Test_term_mouse_drag_window_separator()
       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)
index 5d1a2fb37ac1add18b1e126b2e56a53d06391916..c1875adc7b3b75df2319f4fa2536b47cef6503cb 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    825,
 /**/
     824,
 /**/
index b4e8e94be306e8cd254c0e02618f07248963e145..996a8aabc5ff2b5c0b961d714dce239b8bfb551f 100644 (file)
@@ -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