diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-10-22 15:36:14 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-10-22 15:36:14 +0200 |
commit | ca05aa24af88836f8aa792360b3780589f294981 (patch) | |
tree | ce6adba1fb6d37113612655d77136f10b83cd505 | |
parent | f8e8c0643b1cd97db11912bc4f773e1328a0da02 (diff) |
patch 8.0.1211: cannot reorder tab pages with drag & dropv8.0.1211
Problem: Cannot reorder tab pages with drag & drop.
Solution: Support drag & drop for GTK and MS-Windows. (Ken Takata, Masamichi
Abe)
-rw-r--r-- | src/gui_gtk_x11.c | 31 | ||||
-rw-r--r-- | src/gui_w32.c | 94 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 126 insertions, 1 deletions
diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c index 9225375a10..9be54b90e0 100644 --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -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. */ diff --git a/src/gui_w32.c b/src/gui_w32.c index c5564cd2ac..64acc76527 100644 --- a/src/gui_w32.c +++ b/src/gui_w32.c @@ -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 diff --git a/src/version.c b/src/version.c index 6ab48f1798..f913633c7a 100644 --- a/src/version.c +++ b/src/version.c @@ -762,6 +762,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1211, +/**/ 1210, /**/ 1209, |