Patch 8.0.1211
Problem: Cannot reorder tab pages with drag & drop.
Solution: Support drag & drop for GTK and MS-Windows. (Ken Takata, Masamichi
Abe)
Files: src/gui_gtk_x11.c, src/gui_w32.c
*** ../vim-8.0.1210/src/gui_gtk_x11.c 2017-09-09 23:00:49.381581228 +0200
--- src/gui_gtk_x11.c 2017-10-22 15:27:26.709921034 +0200
***************
*** 3567,3574 ****
gpointer data UNUSED)
{
if (!ignore_tabline_evt)
- {
send_tabline_event(idx + 1);
}
}
--- 3567,3595 ----
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,3663 ****
--- 3679,3687 ----
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,4106 ****
--- 4117,4135 ----
# 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. */
*** ../vim-8.0.1210/src/gui_w32.c 2017-09-26 14:46:00.467725346 +0200
--- src/gui_w32.c 2017-10-22 15:22:23.148030111 +0200
***************
*** 8151,8156 ****
--- 8151,8184 ----
# 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,8164 ****
--- 8186,8258 ----
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
*** ../vim-8.0.1210/src/version.c 2017-10-22 14:44:13.931751620 +0200
--- src/version.c 2017-10-22 15:35:45.494485408 +0200
***************
*** 763,764 ****
--- 763,766 ----
{ /* Add new patch number below this line */
+ /**/
+ 1211,
/**/
--
Windows
M!uqoms
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.