mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 8.0.1211: cannot reorder tab pages with drag & drop
Problem: Cannot reorder tab pages with drag & drop. Solution: Support drag & drop for GTK and MS-Windows. (Ken Takata, Masamichi Abe)
This commit is contained in:
@@ -3567,8 +3567,29 @@ on_select_tab(
|
|||||||
gpointer data UNUSED)
|
gpointer data UNUSED)
|
||||||
{
|
{
|
||||||
if (!ignore_tabline_evt)
|
if (!ignore_tabline_evt)
|
||||||
{
|
|
||||||
send_tabline_event(idx + 1);
|
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,
|
page,
|
||||||
event_box,
|
event_box,
|
||||||
nr++);
|
nr++);
|
||||||
|
gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(gui.tabline),
|
||||||
|
page,
|
||||||
|
TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
event_box = gtk_notebook_get_tab_label(GTK_NOTEBOOK(gui.tabline), page);
|
event_box = gtk_notebook_get_tab_label(GTK_NOTEBOOK(gui.tabline), page);
|
||||||
@@ -4093,14 +4117,19 @@ gui_mch_init(void)
|
|||||||
# endif
|
# endif
|
||||||
gtk_container_add(GTK_CONTAINER(event_box), label);
|
gtk_container_add(GTK_CONTAINER(event_box), label);
|
||||||
gtk_notebook_set_tab_label(GTK_NOTEBOOK(gui.tabline), page, event_box);
|
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)
|
# if GTK_CHECK_VERSION(3,0,0)
|
||||||
g_signal_connect(G_OBJECT(gui.tabline), "switch-page",
|
g_signal_connect(G_OBJECT(gui.tabline), "switch-page",
|
||||||
G_CALLBACK(on_select_tab), NULL);
|
G_CALLBACK(on_select_tab), NULL);
|
||||||
|
g_signal_connect(G_OBJECT(gui.tabline), "page-reordered",
|
||||||
|
G_CALLBACK(on_tab_reordered), NULL);
|
||||||
# else
|
# else
|
||||||
gtk_signal_connect(GTK_OBJECT(gui.tabline), "switch_page",
|
gtk_signal_connect(GTK_OBJECT(gui.tabline), "switch_page",
|
||||||
GTK_SIGNAL_FUNC(on_select_tab), NULL);
|
GTK_SIGNAL_FUNC(on_select_tab), NULL);
|
||||||
|
gtk_signal_connect(GTK_OBJECT(gui.tabline), "page-reordered",
|
||||||
|
GTK_SIGNAL_FUNC(on_tab_reordered), NULL);
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
/* Create a popup menu for the tab line and connect it. */
|
/* Create a popup menu for the tab line and connect it. */
|
||||||
|
@@ -8151,6 +8151,34 @@ initialise_tabline(void)
|
|||||||
# endif
|
# 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
|
static LRESULT CALLBACK
|
||||||
tabline_wndproc(
|
tabline_wndproc(
|
||||||
HWND hwnd,
|
HWND hwnd,
|
||||||
@@ -8158,7 +8186,73 @@ tabline_wndproc(
|
|||||||
WPARAM wParam,
|
WPARAM wParam,
|
||||||
LPARAM lParam)
|
LPARAM lParam)
|
||||||
{
|
{
|
||||||
|
POINT pt;
|
||||||
|
tabpage_T *tp;
|
||||||
|
RECT rect;
|
||||||
|
int nCenter;
|
||||||
|
int idx0;
|
||||||
|
int idx1;
|
||||||
|
|
||||||
HandleMouseHide(uMsg, lParam);
|
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);
|
return CallWindowProc(s_tabline_wndproc, hwnd, uMsg, wParam, lParam);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -761,6 +761,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 */
|
||||||
|
/**/
|
||||||
|
1211,
|
||||||
/**/
|
/**/
|
||||||
1210,
|
1210,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user