]> granicus.if.org Git - vim/commitdiff
patch 8.0.1211: cannot reorder tab pages with drag & drop v8.0.1211
authorBram Moolenaar <Bram@vim.org>
Sun, 22 Oct 2017 13:36:14 +0000 (15:36 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 22 Oct 2017 13:36:14 +0000 (15:36 +0200)
Problem:    Cannot reorder tab pages with drag & drop.
Solution:   Support drag & drop for GTK and MS-Windows. (Ken Takata, Masamichi
            Abe)

src/gui_gtk_x11.c
src/gui_w32.c
src/version.c

index 9225375a10f7ce3a13eabad927009d98f61fedcf..9be54b90e080ea9cba96bec70cea43cc93256b02 100644 (file)
@@ -3567,8 +3567,29 @@ on_select_tab(
        gpointer        data UNUSED)
 {
     if (!ignore_tabline_evt)
-    {
        send_tabline_event(idx + 1);
+}
+
+/*
+ * Handle reordering the tabs (using D&D).
+ */
+    static void
+on_tab_reordered(
+       GtkNotebook     *notebook UNUSED,
+# if GTK_CHECK_VERSION(3,0,0)
+       gpointer        *page UNUSED,
+# else
+       GtkNotebookPage *page UNUSED,
+# endif
+       gint            idx,
+       gpointer        data UNUSED)
+{
+    if (!ignore_tabline_evt)
+    {
+       if ((tabpage_index(curtab) - 1) < idx)
+           tabpage_move(idx + 1);
+       else
+           tabpage_move(idx);
     }
 }
 
@@ -3658,6 +3679,9 @@ gui_mch_update_tabline(void)
                    page,
                    event_box,
                    nr++);
+           gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(gui.tabline),
+                   page,
+                   TRUE);
        }
 
        event_box = gtk_notebook_get_tab_label(GTK_NOTEBOOK(gui.tabline), page);
@@ -4093,14 +4117,19 @@ gui_mch_init(void)
 # endif
        gtk_container_add(GTK_CONTAINER(event_box), label);
        gtk_notebook_set_tab_label(GTK_NOTEBOOK(gui.tabline), page, event_box);
+       gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(gui.tabline), page, TRUE);
     }
 
 # if GTK_CHECK_VERSION(3,0,0)
     g_signal_connect(G_OBJECT(gui.tabline), "switch-page",
                     G_CALLBACK(on_select_tab), NULL);
+    g_signal_connect(G_OBJECT(gui.tabline), "page-reordered",
+                    G_CALLBACK(on_tab_reordered), NULL);
 # else
     gtk_signal_connect(GTK_OBJECT(gui.tabline), "switch_page",
                       GTK_SIGNAL_FUNC(on_select_tab), NULL);
+    gtk_signal_connect(GTK_OBJECT(gui.tabline), "page-reordered",
+                      GTK_SIGNAL_FUNC(on_tab_reordered), NULL);
 # endif
 
     /* Create a popup menu for the tab line and connect it. */
index c5564cd2ac129423816c8cee009713d67f47b520..64acc76527998a520b0a8af11a74a1b3d1acab58 100644 (file)
@@ -8151,6 +8151,34 @@ initialise_tabline(void)
 # endif
 }
 
+/*
+ * Get tabpage_T from POINT.
+ */
+    static tabpage_T *
+GetTabFromPoint(
+    HWND    hWnd,
+    POINT   pt)
+{
+    tabpage_T  *ptp = NULL;
+
+    if (gui_mch_showing_tabline())
+    {
+       TCHITTESTINFO htinfo;
+       htinfo.pt = pt;
+       /* ignore if a window under cusor is not tabcontrol. */
+       if (s_tabhwnd == hWnd)
+       {
+           int idx = TabCtrl_HitTest(s_tabhwnd, &htinfo);
+           if (idx != -1)
+               ptp = find_tabpage(idx + 1);
+       }
+    }
+    return ptp;
+}
+
+static POINT       s_pt = {0, 0};
+static HCURSOR      s_hCursor = NULL;
+
     static LRESULT CALLBACK
 tabline_wndproc(
     HWND hwnd,
@@ -8158,7 +8186,73 @@ tabline_wndproc(
     WPARAM wParam,
     LPARAM lParam)
 {
+    POINT      pt;
+    tabpage_T  *tp;
+    RECT       rect;
+    int                nCenter;
+    int                idx0;
+    int                idx1;
+
     HandleMouseHide(uMsg, lParam);
+
+    switch (uMsg)
+    {
+       case WM_LBUTTONDOWN:
+           {
+               s_pt.x = GET_X_LPARAM(lParam);
+               s_pt.y = GET_Y_LPARAM(lParam);
+               SetCapture(hwnd);
+               s_hCursor = GetCursor(); /* backup default cursor */
+               break;
+           }
+       case WM_MOUSEMOVE:
+           if (GetCapture() == hwnd
+                   && ((wParam & MK_LBUTTON)) != 0)
+           {
+               pt.x = GET_X_LPARAM(lParam);
+               pt.y = s_pt.y;
+               if (abs(pt.x - s_pt.x) > GetSystemMetrics(SM_CXDRAG))
+               {
+                   SetCursor(LoadCursor(NULL, IDC_SIZEWE));
+
+                   tp = GetTabFromPoint(hwnd, pt);
+                   if (tp != NULL)
+                   {
+                       idx0 = tabpage_index(curtab) - 1;
+                       idx1 = tabpage_index(tp) - 1;
+
+                       TabCtrl_GetItemRect(hwnd, idx1, &rect);
+                       nCenter = rect.left + (rect.right - rect.left) / 2;
+
+                       /* Check if the mouse cursor goes over the center of
+                        * the next tab to prevent "flickering". */
+                       if ((idx0 < idx1) && (nCenter < pt.x))
+                       {
+                           tabpage_move(idx1 + 1);
+                           update_screen(0);
+                       }
+                       else if ((idx1 < idx0) && (pt.x < nCenter))
+                       {
+                           tabpage_move(idx1);
+                           update_screen(0);
+                       }
+                   }
+               }
+           }
+           break;
+       case WM_LBUTTONUP:
+           {
+               if (GetCapture() == hwnd)
+               {
+                   SetCursor(s_hCursor);
+                   ReleaseCapture();
+               }
+               break;
+           }
+       default:
+           break;
+    }
+
     return CallWindowProc(s_tabline_wndproc, hwnd, uMsg, wParam, lParam);
 }
 #endif
index 6ab48f1798874950395c05f8a8fc85bb76021028..f913633c7ab4d3cfc9b29e329c912c8c9ab11cfa 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1211,
 /**/
     1210,
 /**/