+ list<Marker*>::iterator i = find (sorted.begin(), sorted.end(), m);
+
+ list<Marker*>::iterator prev = sorted.end ();
+ list<Marker*>::iterator next = i;
+ ++next;
+
+ /* Look to see if the previous marker is still behind `m' in time */
+ if (i != sorted.begin()) {
+
+ prev = i;
+ --prev;
+
+ if ((*prev)->position() > m->position()) {
+ /* This marker is no longer in the correct order with the previous one, so
+ * update all the markers in this group.
+ */
+ update_marker_labels (m->get_parent ());
+ return;
+ }
+ }
+
+ /* Look to see if the next marker is still ahead of `m' in time */
+ if (next != sorted.end() && (*next)->position() < m->position()) {
+ /* This marker is no longer in the correct order with the next one, so
+ * update all the markers in this group.
+ */
+ update_marker_labels (m->get_parent ());
+ return;
+ }
+
+ if (prev != sorted.end()) {
+
+ /* Update just the available space between the previous marker and this one */
+
+ double const p = frame_to_pixel (m->position() - (*prev)->position());
+
+ if (m->label_on_left()) {
+ (*prev)->set_right_label_limit (p / 2);
+ } else {
+ (*prev)->set_right_label_limit (p);
+ }
+
+ if ((*prev)->label_on_left ()) {
+ m->set_left_label_limit (p);
+ } else {
+ m->set_left_label_limit (p / 2);
+ }
+ }
+
+ if (next != sorted.end()) {
+
+ /* Update just the available space between this marker and the next */
+
+ double const p = frame_to_pixel ((*next)->position() - m->position());
+
+ if ((*next)->label_on_left()) {
+ m->set_right_label_limit (p / 2);
+ } else {
+ m->set_right_label_limit (p);
+ }
+
+ if (m->label_on_left()) {
+ (*next)->set_left_label_limit (p);
+ } else {
+ (*next)->set_left_label_limit (p / 2);
+ }
+ }
+}
+
+struct MarkerComparator {
+ bool operator() (Marker const * a, Marker const * b) {
+ return a->position() < b->position();
+ }
+};
+
+/** Update all marker labels in all groups */
+void
+Editor::update_marker_labels ()
+{
+ for (std::map<ArdourCanvas::Group *, std::list<Marker *> >::iterator i = _sorted_marker_lists.begin(); i != _sorted_marker_lists.end(); ++i) {
+ update_marker_labels (i->first);
+ }
+}
+
+/** Look at all markers in a group and update label widths */
+void
+Editor::update_marker_labels (ArdourCanvas::Group* group)
+{
+ list<Marker*>& sorted = _sorted_marker_lists[group];
+
+ if (sorted.empty()) {
+ return;
+ }
+
+ /* We sort the list of markers and then set up the space available between each one */
+
+ sorted.sort (MarkerComparator ());
+
+ list<Marker*>::iterator i = sorted.begin ();
+
+ list<Marker*>::iterator prev = sorted.end ();
+ list<Marker*>::iterator next = i;
+ ++next;