diff --git a/gtk2_ardour/editor_group_tabs.cc b/gtk2_ardour/editor_group_tabs.cc index 6be0b0803c..fdd4954012 100644 --- a/gtk2_ardour/editor_group_tabs.cc +++ b/gtk2_ardour/editor_group_tabs.cc @@ -53,12 +53,14 @@ EditorGroupTabs::compute_tabs () const if (g != tab.group) { if (tab.group) { tab.to = y; + tab.last_ui_size = (*i)->effective_height (); tabs.push_back (tab); } tab.from = y; tab.group = g; tab.colour = (*i)->color (); + tab.first_ui_size = (*i)->effective_height (); } y += (*i)->effective_height (); diff --git a/gtk2_ardour/group_tabs.cc b/gtk2_ardour/group_tabs.cc index 60eed1c7cf..8f82e856a9 100644 --- a/gtk2_ardour/group_tabs.cc +++ b/gtk2_ardour/group_tabs.cc @@ -114,16 +114,33 @@ GroupTabs::on_motion_notify_event (GdkEventMotion* ev) } if (_drag_from) { + double f = _dragging->from + p - _drag_last; + if (f < _drag_limit) { f = _drag_limit; } + + double const t = _dragging->to - _dragging->last_ui_size; + if (f > t) { + f = t; + } + _dragging->from = f; + } else { + double t = _dragging->to + p - _drag_last; + if (t > _drag_limit) { t = _drag_limit; } + + double const f = _dragging->from + _dragging->first_ui_size; + if (t < f) { + t = f; + } + _dragging->to = t; } diff --git a/gtk2_ardour/group_tabs.h b/gtk2_ardour/group_tabs.h index a4ab3304f6..43b00670e0 100644 --- a/gtk2_ardour/group_tabs.h +++ b/gtk2_ardour/group_tabs.h @@ -41,6 +41,8 @@ protected: double to; Gdk::Color colour; ARDOUR::RouteGroup* group; + double first_ui_size; + double last_ui_size; }; private: diff --git a/gtk2_ardour/mixer_group_tabs.cc b/gtk2_ardour/mixer_group_tabs.cc index a8fe713aa4..7ab162d3c8 100644 --- a/gtk2_ardour/mixer_group_tabs.cc +++ b/gtk2_ardour/mixer_group_tabs.cc @@ -55,12 +55,14 @@ MixerGroupTabs::compute_tabs () const if (g != tab.group) { if (tab.group) { tab.to = x; + tab.last_ui_size = (*i)->get_width (); tabs.push_back (tab); } tab.from = x; tab.group = g; tab.colour = (*i)->color (); + tab.first_ui_size = (*i)->get_width (); } x += (*i)->get_width ();