Now that Location signal(s) are only emitted when the
drag ended, the list can be kept in sync.
This also adds a further optimization to only update the
list once, even when multiple locations have been changed.
Section Markers only need to be updated when an actual
section-marker is modified OR flags change.
This also removes duplicate signal subscriptions and
caches sorted Location list when iterating over section markers.
This allows Ardour to re-open previously shown plugins,
and toggle externalUI.
This worked in the distant past, before Ardour 3.3 introduced
the Ardour Window Manager.
when the surround bus is removed, it (probably erroneously) causes
changes to the I/O routing for the auditioner, which will be
delivered to anyone who cares via an RCConfiguration ParameterChanged
signal. This will be emitted from a non-GUI thread, and so will not
be handled synchronously. The GUI thread will first handle the notification
that the surround bus was deleted, and that will include deleting the
MixerStrip for the surround bus. But another call_slot() request will
be pending to notify the now-deleted MixerStrip about the auditioner change.
Adding invalidator() calls ensures that the deletion of the MixerStrip removes
all of these pending call_slot() requests.
The box outlines a given region, the grab position may be earlier
than the region's position.
Previously this caused a crash (uncaught exception):
```gdb
__cxa_throw () at /lib/x86_64-linux-gnu/libstdc++.so.6
Temporal::timecnt_t::timecnt_t(Temporal::timecnt_t const&, Temporal::timepos_t const&) at ../libs/temporal/timeline.cc:79
RegionMoveDrag::setup_pointer_offset() at ../gtk2_ardour/editor_drag.cc:2226
```
deleting regionviews changed the region selection, but the regionview
ptr had not been removed from the RegionViewList. The selection change signal
caused an iteration over the list, and manipulated the deleted regionview.
The former was incorrectly implemented, and the latter has already been tested more
in real life.
We should likely remove ::remove_time also and use shift() there too, but that
requires testing negative shifts more broadly.