+void
+Script_column::order_grobs (vector<Grob*> grobs)
+{
+ Drul_array<SCM> scripts_drul (SCM_EOL, SCM_EOL);
+ for (vsize i = 0; i < grobs.size (); i++)
+ {
+ Grob *g = grobs[i];
+ Direction d = get_grob_direction (g);
+
+ scripts_drul[d] = scm_cons (g->self_scm (), scripts_drul[d]);
+ }
+
+ Direction d = DOWN;
+ do
+ {
+ SCM ss = scm_reverse_x (scripts_drul[d], SCM_EOL);
+ ss = scm_stable_sort_x (ss, ly_grob_script_priority_less_proc);
+
+ Grob *last = 0;
+ for (SCM s = ss; scm_is_pair (s); s = scm_cdr (s))
+ {
+ Grob *g = unsmob_grob (scm_car (s));
+ if (last)
+ {
+ SCM outside_staff = last->get_property ("outside-staff-priority");
+ if (scm_is_number (outside_staff))
+ {
+ /* we allow the outside-staff-priority ordering to override the
+ script-priority ordering */
+ if (!scm_is_number (g->get_property ("outside-staff-priority")))
+ g->set_property ("outside-staff-priority",
+ scm_from_double (scm_to_double (outside_staff) + 0.1));
+ }
+ else
+ Side_position_interface::add_support (g, last);
+ }
+
+ last = g;
+ }
+ }
+ while (flip (&d) != DOWN);
+}