summaryrefslogtreecommitdiff
path: root/gtk2_ardour/editor_routes.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2012-10-27 00:15:45 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2012-10-27 00:15:45 +0000
commitf750aa32070b128f5e61e5abc39855f8654fb0de (patch)
treeb39701cfd73aa93d300a6183bb1447d2b9bc1f94 /gtk2_ardour/editor_routes.cc
parent49f59709d83f66ddda123f63b5a6a6c62fa92adf (diff)
fix serious logic error in re-ordering treeviews after route order keys/RIDs change - fixes major memory corruption bug that overwrote random memory as soon as a track gets deleted and/or user-defined remote IDs are in use
git-svn-id: svn://localhost/ardour2/branches/3.0@13355 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/editor_routes.cc')
-rw-r--r--gtk2_ardour/editor_routes.cc26
1 files changed, 18 insertions, 8 deletions
diff --git a/gtk2_ardour/editor_routes.cc b/gtk2_ardour/editor_routes.cc
index f453caf831..acbbb697f2 100644
--- a/gtk2_ardour/editor_routes.cc
+++ b/gtk2_ardour/editor_routes.cc
@@ -45,6 +45,7 @@
#include "gui_thread.h"
#include "actions.h"
#include "utils.h"
+#include "route_sorter.h"
#include "editor_group_tabs.h"
#include "editor_routes.h"
@@ -961,21 +962,30 @@ EditorRoutes::sync_treeview_from_order_keys (RouteSortOrderKey src)
return;
}
- neworder.assign (rows.size(), 0);
+ OrderKeySortedRoutes sorted_routes;
for (TreeModel::Children::iterator ri = rows.begin(); ri != rows.end(); ++ri, ++old_order) {
boost::shared_ptr<Route> route = (*ri)[_columns.route];
- uint32_t new_order = route->order_key (EditorSort);
-
- DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("EDITOR change order for %1 from %2 to %3\n",
- route->name(), old_order, new_order));
-
- neworder[new_order] = old_order;
+ sorted_routes.push_back (RoutePlusOrderKey (route, old_order, route->order_key (EditorSort)));
+ }
+
+ SortByNewDisplayOrder cmp;
- if (old_order != new_order) {
+ sort (sorted_routes.begin(), sorted_routes.end(), cmp);
+ neworder.assign (sorted_routes.size(), 0);
+
+ uint32_t n = 0;
+
+ for (OrderKeySortedRoutes::iterator sr = sorted_routes.begin(); sr != sorted_routes.end(); ++sr, ++n) {
+
+ neworder[n] = sr->old_display_order;
+
+ if (sr->old_display_order != n) {
changed = true;
}
+ DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("EDITOR change order for %1 from %2 to %3\n",
+ sr->route->name(), sr->old_display_order, n));
}
if (changed) {