Permalink
Browse files

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)
  • Loading branch information...
brammool committed Oct 22, 2017
1 parent f8e8c06 commit ca05aa24af88836f8aa792360b3780589f294981
Showing with 126 additions and 1 deletion.
  1. +30 −1 src/gui_gtk_x11.c
  2. +94 −0 src/gui_w32.c
  3. +2 −0 src/version.c
View
@@ -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. */
View
@@ -8151,14 +8151,108 @@ 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,
UINT uMsg,
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
View
@@ -761,6 +761,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1211,
/**/
1210,
/**/

0 comments on commit ca05aa2

Please sign in to comment.