A possible method for correctly sizing the editor controls, and a couple buttons...
[ardour.git] / gtk2_ardour / editor.h
1 /*
2     Copyright (C) 2000-2003 Paul Davis 
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18     $Id$
19 */
20
21 #ifndef __ardour_editor_h__
22 #define __ardour_editor_h__
23
24 #include <list>
25 #include <map>
26 #include <set>
27 #include <string>
28 #include <sys/time.h>
29
30 #include <libgnomecanvasmm/canvas.h>
31 #include <libgnomecanvasmm/group.h>
32 #include <libgnomecanvasmm/line.h>
33
34 #include <cmath>
35
36 #include <sndfile.h>
37
38 #include <gtkmm/layout.h>
39 #include <gtkmm/comboboxtext.h>
40
41 #include <gtkmm2ext/selector.h>
42 #include <gtkmm2ext/click_box.h>
43
44 #include <ardour/stateful.h>
45 #include <ardour/session.h>
46 #include <ardour/tempo.h>
47 #include <ardour/location.h>
48 #include <ardour/region.h>
49
50 #include "audio_clock.h"
51 #include "gtk-custom-ruler.h"
52 #include "ardour_dialog.h"
53 #include "public_editor.h"
54 #include "editing.h"
55 #include "enums.h"
56 #include "region_selection.h"
57 #include "canvas.h"
58
59 namespace Gtkmm2ext {
60         class TearOff;
61 }
62
63 namespace LinuxAudioSystems {
64         class AudioEngine;
65 }
66
67 namespace ARDOUR {
68         class DiskStream;
69         class RouteGroup;
70         class Source;
71         class Playlist;
72         class Region;
73         class Location;
74         class TempoSection;
75         class NamedSelection;
76         class Session;
77         class AudioFilter;
78         class Crossfade;
79 }
80
81 namespace LADSPA {
82         class Plugin;
83 }
84
85 class TimeAxisView;
86 class AudioTimeAxisView;
87 class AutomationTimeAxisView;
88 class AudioRegionView;
89 class CrossfadeView;
90 class PluginSelector;
91 class PlaylistSelector;
92 class Marker;
93 class GroupedButtons;
94 class AutomationLine;
95 class UIExportSpecification;
96 class ExportDialog;
97 class Selection;
98 class TimeSelection;
99 class TrackSelection;
100 class AutomationSelection;
101 class MixerStrip;
102 class StreamView;
103 class ControlPoint;
104
105 /* <CMT Additions> */
106 class ImageFrameView;
107 class ImageFrameTimeAxisView;
108 class ImageFrameTimeAxis;
109 class MarkerTimeAxis ;
110 class MarkerView ;
111 class ImageFrameSocketHandler ;
112 class TimeAxisViewItem ;
113 /* </CMT Additions> */
114
115
116 class Editor : public PublicEditor
117 {
118   public:
119         Editor (ARDOUR::AudioEngine&);
120         ~Editor ();
121
122         void             connect_to_session (ARDOUR::Session *);
123         ARDOUR::Session* current_session() const { return session; }
124
125         jack_nframes_t leftmost_position() const { return leftmost_frame; }
126         jack_nframes_t current_page_frames() const {
127                 return (jack_nframes_t) floor (canvas_width * frames_per_unit);
128         }
129
130         void set_snap_to (Editing::SnapType);
131         void set_snap_mode (Editing::SnapMode);
132         void set_snap_threshold (double pixel_distance) {snap_threshold = pixel_distance;}
133
134         void undo (uint32_t n = 1);
135         void redo (uint32_t n = 1);
136
137         XMLNode& get_state ();
138         int set_state (const XMLNode& );
139
140         void set_mouse_mode (Editing::MouseMode, bool force=true);
141         void step_mouse_mode (bool next);
142         Editing::MouseMode current_mouse_mode () { return mouse_mode; }
143
144         void add_imageframe_time_axis(ARDOUR::stringcr_t track_name, void*) ;
145         void add_imageframe_marker_time_axis(ARDOUR::stringcr_t track_name, TimeAxisView* marked_track, void*) ;
146         void connect_to_image_compositor() ;
147         void scroll_timeaxis_to_imageframe_item(const TimeAxisViewItem* item) ;
148         TimeAxisView* get_named_time_axis(ARDOUR::stringcr_t name) ;
149         /* </CMT Additions> */
150
151         void consider_auditioning (ARDOUR::Region&);
152         void hide_a_region (ARDOUR::Region&);
153         void remove_a_region (ARDOUR::Region&);
154
155         /* option editor-access */
156
157         void set_show_waveforms (bool yn);
158         bool show_waveforms() const { return _show_waveforms; }
159
160         void set_show_waveforms_recording (bool yn);
161         bool show_waveforms_recording() const { return _show_waveforms_recording; }
162         
163         /* things that need to be public to be used in the main menubar */
164
165         void new_region_from_selection ();
166         void separate_region_from_selection ();
167         void toggle_playback (bool with_abort);
168
169         /* undo related */
170
171         void set_edit_menu (Gtk::Menu&);
172
173         jack_nframes_t unit_to_frame (double unit) {
174                 return (jack_nframes_t) rint (unit * frames_per_unit);
175         }
176         
177         double frame_to_unit (jack_nframes_t frame) {
178                 return rint ((double) frame / (double) frames_per_unit);
179         }
180
181         double frame_to_unit (double frame) {
182                 return rint (frame / frames_per_unit);
183         }
184
185         /* NOTE: these functions assume that the "pixel" coordinate is
186            the result of using the world->canvas affine transform on a
187            world coordinate. These coordinates already take into
188            account any scrolling carried out by adjusting the
189            xscroll_adjustment.  
190         */
191
192         jack_nframes_t pixel_to_frame (double pixel) {
193                 
194                 /* pixel can be less than zero when motion events
195                    are processed. since we've already run the world->canvas
196                    affine, that means that the location *really* is "off
197                    to the right" and thus really is "before the start".
198                 */
199
200                 if (pixel >= 0) {
201                         return (jack_nframes_t) rint (pixel * frames_per_unit * GNOME_CANVAS(track_canvas.gobj())->pixels_per_unit);
202                 } else {
203                         return 0;
204                 }
205         }
206
207         gulong frame_to_pixel (jack_nframes_t frame) {
208                 return (gulong) rint ((frame / (frames_per_unit *  GNOME_CANVAS(track_canvas.gobj())->pixels_per_unit)));
209         }
210
211         /* selection */
212
213         Selection& get_selection() const { return *selection; }
214         Selection& get_cut_buffer() const { return *cut_buffer; }
215
216         void play_selection ();
217         void select_all_in_track (bool add);
218         void select_all (bool add);
219         void invert_selection_in_track ();
220         void invert_selection ();
221
222         /* tempo */
223
224         void set_show_measures (bool yn);
225         bool show_measures () const { return _show_measures; }
226
227         /* export */
228
229         /* these initiate export ... */
230         
231         void export_session();
232         void export_selection();
233
234         /* this is what actually does it */
235         
236         void export_audiofile (ARDOUR::AudioExportSpecification&);
237
238         /* */
239
240         void add_toplevel_controls (Gtk::Container&);
241
242         void      set_zoom_focus (Editing::ZoomFocus);
243         Editing::ZoomFocus get_zoom_focus () const { return zoom_focus; }
244         gdouble   get_current_zoom () { return frames_per_unit; }
245
246         void temporal_zoom_step (bool coarser);
247
248         /* stuff that AudioTimeAxisView and related classes use */
249
250         PlaylistSelector& playlist_selector() const;
251         void route_name_changed (TimeAxisView *);
252         gdouble        frames_per_unit;
253         jack_nframes_t leftmost_frame;
254         void clear_playlist (ARDOUR::Playlist&);
255
256         TrackViewList* get_valid_views (TimeAxisView*, ARDOUR::RouteGroup* grp = 0);
257
258         Width editor_mixer_strip_width;
259         void show_editor_mixer (bool yn);
260         void set_selected_mixer_strip (TimeAxisView&);
261         void unselect_strip_in_display (TimeAxisView& tv);
262         void select_strip_in_display (TimeAxisView* tv);
263
264         /* nudge is initiated by transport controls owned by ARDOUR_UI */
265
266         void nudge_forward (bool next);
267         void nudge_backward (bool next);
268
269         /* nudge initiated from context menu */
270
271         void nudge_forward_capture_offset ();
272         void nudge_backward_capture_offset ();
273
274         /* playhead/screen stuff */
275         
276         void set_follow_playhead (bool yn);
277         void toggle_follow_playhead ();
278         bool follow_playhead() const { return _follow_playhead; }
279
280         /* xfades */
281
282         void toggle_xfades_active();
283         void toggle_xfade_visibility ();
284         void set_xfade_visibility (bool yn);
285         bool xfade_visibility() const { return _xfade_visibility; }
286
287         /* redirect shared ops menu. caller must free returned menu */
288
289         Gtk::Menu* redirect_menu ();
290
291         /* floating windows/transient */
292
293         void ensure_float (Gtk::Window&);
294
295         void show_window ();
296         
297         void scroll_tracks_down_line ();
298         void scroll_tracks_up_line ();
299
300         bool new_regionviews_display_gain () { return _new_regionviews_show_envelope; }
301         void prepare_for_cleanup ();
302
303         void reposition_x_origin (jack_nframes_t sample);
304
305   protected:
306         void map_transport_state ();
307         void map_position_change (jack_nframes_t);
308
309         void on_realize();
310
311   private:
312         
313         ARDOUR::Session     *session;
314         ARDOUR::AudioEngine& engine;
315         bool                 constructed;
316
317         PlaylistSelector* _playlist_selector;
318
319         enum ItemType {
320                 RegionItem,
321                 StreamItem,
322                 PlayheadCursorItem,
323                 EditCursorItem,
324                 MarkerItem,
325                 MarkerBarItem,
326                 RangeMarkerBarItem,
327                 TransportMarkerBarItem,
328                 SelectionItem,
329                 GainControlPointItem,
330                 GainLineItem,
331                 GainAutomationControlPointItem,
332                 GainAutomationLineItem,
333                 PanAutomationControlPointItem,
334                 PanAutomationLineItem,
335                 RedirectAutomationControlPointItem,
336                 RedirectAutomationLineItem,
337                 MeterMarkerItem,
338                 TempoMarkerItem,
339                 MeterBarItem,
340                 TempoBarItem,
341                 AudioRegionViewNameHighlight,
342                 AudioRegionViewName,
343                 StartSelectionTrimItem,
344                 EndSelectionTrimItem,
345                 AutomationTrackItem,
346                 FadeInItem,
347                 FadeInHandleItem,
348                 FadeOutItem,
349                 FadeOutHandleItem,
350
351                 /* <CMT Additions> */
352                 MarkerViewItem,
353                 MarkerTimeAxisItem,
354                 MarkerViewHandleStartItem,
355                 MarkerViewHandleEndItem,
356                 ImageFrameItem,
357                 ImageFrameTimeAxisItem,
358                 ImageFrameHandleStartItem,
359                 ImageFrameHandleEndItem,
360                 /* </CMT Additions> */
361
362                 CrossfadeViewItem,
363                 
364                 /* don't remove this */
365
366                 NoItem
367         };
368
369         void          set_frames_per_unit (double);
370         void          frames_per_unit_modified ();
371
372         Editing::MouseMode mouse_mode;
373         void      mouse_insert (GdkEventButton *);
374
375         void pane_allocation_handler (Gtk::Allocation&, Gtk::Paned*);
376
377         Gtk::Notebook the_notebook;
378         Gtk::HPaned   edit_pane;
379
380         Gtk::EventBox meter_base;
381         Gtk::HBox     meter_box;
382         Gtk::EventBox marker_base;
383         Gtk::HBox     marker_box;
384         Gtk::VBox     scrollers_rulers_markers_box;
385
386         void location_changed (ARDOUR::Location *);
387         void location_flags_changed (ARDOUR::Location *, void *);
388         void refresh_location_display ();
389         void refresh_location_display_s (ARDOUR::Change);
390         void refresh_location_display_internal (ARDOUR::Locations::LocationList&);
391         void add_new_location (ARDOUR::Location *);
392         void location_gone (ARDOUR::Location *);
393         void remove_marker (ArdourCanvas::Item&, GdkEvent*);
394         gint really_remove_marker (ARDOUR::Location* loc);
395
396         uint32_t location_marker_color;
397         uint32_t location_range_color;
398         uint32_t location_loop_color;
399         uint32_t location_punch_color;
400         uint32_t location_cd_marker_color;
401
402         struct LocationMarkers {
403             Marker* start;
404             Marker* end;
405
406             ~LocationMarkers ();
407
408             void hide();
409             void show ();
410             void set_name (const string&);
411             void set_position (jack_nframes_t start, jack_nframes_t end = 0);
412             void set_color_rgba (uint32_t);
413         };
414
415         LocationMarkers  *find_location_markers (ARDOUR::Location *);
416         ARDOUR::Location* find_location_from_marker (Marker *, bool& is_start);
417
418         typedef std::map<ARDOUR::Location*,LocationMarkers *> LocationMarkerMap;
419         LocationMarkerMap location_markers;
420
421         void hide_marker (ArdourCanvas::Item*, GdkEvent*);
422         void clear_marker_display ();
423         void mouse_add_new_marker (jack_nframes_t where);
424
425         TimeAxisView*      clicked_trackview;
426         AudioTimeAxisView* clicked_audio_trackview;
427         AudioRegionView*   clicked_regionview;
428         AudioRegionView*   latest_regionview;
429         uint32_t           clicked_selection;
430         CrossfadeView*     clicked_crossfadeview;
431         ControlPoint*      clicked_control_point;
432
433         void catch_vanishing_audio_regionview (AudioRegionView *);
434         void set_selected_control_point_from_click (bool add = false, bool with_undo = true, bool no_remove=false);
435         void set_selected_track_from_click (bool add = false, bool with_undo = true, bool no_remove=false);
436         void set_selected_regionview_from_click (bool add = false, bool no_track_remove=false);
437         void set_selected_regionview_from_region_list (ARDOUR::Region& region, bool add = false);
438         bool set_selected_regionview_from_map_event (GdkEventAny*, StreamView*, ARDOUR::Region*);
439         void collect_new_region_view (AudioRegionView *);
440
441         Gtk::Menu track_context_menu;
442         Gtk::Menu track_region_context_menu;
443         Gtk::Menu track_selection_context_menu;
444         Gtk::Menu track_crossfade_context_menu;
445
446         Gtk::MenuItem* region_edit_menu_split_item;
447         Gtk::MenuItem* region_edit_menu_split_multichannel_item;
448         Gtk::Menu * track_region_edit_playlist_menu;
449         Gtk::Menu * track_edit_playlist_submenu;
450         Gtk::Menu * track_selection_edit_playlist_submenu;
451         
452         void popup_track_context_menu (int, int, ItemType, bool, jack_nframes_t);
453         Gtk::Menu* build_track_context_menu (jack_nframes_t);
454         Gtk::Menu* build_track_bus_context_menu (jack_nframes_t);
455         Gtk::Menu* build_track_region_context_menu (jack_nframes_t frame);
456         Gtk::Menu* build_track_crossfade_context_menu (jack_nframes_t);
457         Gtk::Menu* build_track_selection_context_menu (jack_nframes_t);
458         void add_dstream_context_items (Gtk::Menu_Helpers::MenuList&);
459         void add_bus_context_items (Gtk::Menu_Helpers::MenuList&);
460         void add_region_context_items (StreamView*, ARDOUR::Region*, Gtk::Menu_Helpers::MenuList&);
461         void add_crossfade_context_items (StreamView*, ARDOUR::Crossfade*, Gtk::Menu_Helpers::MenuList&, bool many);
462         void add_selection_context_items (Gtk::Menu_Helpers::MenuList&);
463
464         void handle_new_route (ARDOUR::Route&);
465         void handle_new_route_p (ARDOUR::Route*);
466         void remove_route (TimeAxisView *);
467         bool route_removal;
468
469         Gtk::HBox           global_hpacker;
470         Gtk::VBox           global_vpacker;
471         Gtk::VBox           vpacker;
472
473         Gdk::Cursor*          current_canvas_cursor;
474
475         ArdourCanvas::CanvasAA track_canvas;
476         ArdourCanvas::CanvasAA time_canvas;
477
478         ArdourCanvas::Text* first_action_message;
479         ArdourCanvas::Text* verbose_canvas_cursor;
480         bool                 verbose_cursor_visible;
481
482         void session_control_changed (ARDOUR::Session::ControlType);
483         void queue_session_control_changed (ARDOUR::Session::ControlType);
484
485         
486         bool track_canvas_motion (GdkEvent*);
487
488         void set_verbose_canvas_cursor (ARDOUR::stringcr_t, double x, double y);
489         void set_verbose_canvas_cursor_text (ARDOUR::stringcr_t);
490         void show_verbose_canvas_cursor();
491         void hide_verbose_canvas_cursor();
492
493         bool verbose_cursor_on; // so far unused
494
495         void flush_track_canvas ();
496         void flush_time_canvas ();
497
498         Gtk::EventBox      time_canvas_event_box;
499         Gtk::EventBox      track_canvas_event_box;
500         Gtk::EventBox      time_button_event_box;
501
502         ArdourCanvas::Group      *minsec_group;
503         ArdourCanvas::Group      *bbt_group;
504         ArdourCanvas::Group      *smpte_group;
505         ArdourCanvas::Group      *frame_group;
506         ArdourCanvas::Group      *tempo_group;
507         ArdourCanvas::Group      *meter_group;
508         ArdourCanvas::Group      *marker_group;
509         ArdourCanvas::Group      *range_marker_group;
510         ArdourCanvas::Group      *transport_marker_group;
511         
512         enum {
513                 ruler_metric_smpte = 0,
514                 ruler_metric_bbt = 1,
515                 ruler_metric_frames = 2,
516                 ruler_metric_minsec = 3,
517
518                 ruler_time_tempo = 4,
519                 ruler_time_meter = 5,
520                 ruler_time_marker = 6,
521                 ruler_time_range_marker = 7,
522                 ruler_time_transport_marker = 8,
523         };
524
525         static GtkCustomMetric ruler_metrics[4];
526         bool                   ruler_shown[9];
527         bool                   no_ruler_shown_update;
528         
529         gint ruler_button_press (GdkEventButton*);
530         gint ruler_button_release (GdkEventButton*);
531         gint ruler_mouse_motion (GdkEventMotion*);
532
533         gint ruler_pressed_button;
534         Gtk::Widget * ruler_grabbed_widget;
535         
536         void initialize_rulers ();
537         void update_just_smpte ();
538         void update_fixed_rulers ();
539         void update_tempo_based_rulers (); 
540         void popup_ruler_menu (jack_nframes_t where = 0, ItemType type = RegionItem);
541         void update_ruler_visibility ();
542         void ruler_toggled (int);
543         gint ruler_label_button_release (GdkEventButton*);
544         void store_ruler_visibility ();
545         void restore_ruler_visibility ();
546         
547         static gint _metric_get_smpte (GtkCustomRulerMark **, gdouble, gdouble, gint);
548         static gint _metric_get_bbt (GtkCustomRulerMark **, gdouble, gdouble, gint);
549         static gint _metric_get_frames (GtkCustomRulerMark **, gdouble, gdouble, gint);
550         static gint _metric_get_minsec (GtkCustomRulerMark **, gdouble, gdouble, gint);
551         
552         gint metric_get_smpte (GtkCustomRulerMark **, gdouble, gdouble, gint);
553         gint metric_get_bbt (GtkCustomRulerMark **, gdouble, gdouble, gint);
554         gint metric_get_frames (GtkCustomRulerMark **, gdouble, gdouble, gint);
555         gint metric_get_minsec (GtkCustomRulerMark **, gdouble, gdouble, gint);
556
557         GtkWidget          *_smpte_ruler;
558         GtkWidget          *_bbt_ruler;
559         GtkWidget          *_frames_ruler;
560         GtkWidget          *_minsec_ruler;
561         Gtk::Widget        *smpte_ruler;
562         Gtk::Widget        *bbt_ruler;
563         Gtk::Widget        *frames_ruler;
564         Gtk::Widget        *minsec_ruler;
565         static Editor      *ruler_editor;
566
567         static const double timebar_height;
568         guint32 visible_timebars;
569         Gtk::Menu          *editor_ruler_menu;
570         
571         ArdourCanvas::SimpleRect* tempo_bar;
572         ArdourCanvas::SimpleRect* meter_bar;
573         ArdourCanvas::SimpleRect* marker_bar;
574         ArdourCanvas::SimpleRect* range_marker_bar;
575         ArdourCanvas::SimpleRect* transport_marker_bar;
576
577         
578         ArdourCanvas::SimpleLine* tempo_line;
579         ArdourCanvas::SimpleLine* meter_line;
580         ArdourCanvas::SimpleLine* marker_line;
581         ArdourCanvas::SimpleLine* range_marker_line;
582         ArdourCanvas::SimpleLine* transport_marker_line;
583
584         Gtk::Label  minsec_label;
585         Gtk::Label  bbt_label;
586         Gtk::Label  smpte_label;
587         Gtk::Label  frame_label;
588         Gtk::Label  tempo_label;
589         Gtk::Label  meter_label;
590         Gtk::Label  mark_label;
591         Gtk::Label  range_mark_label;
592         Gtk::Label  transport_mark_label;
593         
594
595         Gtk::VBox          time_button_vbox;
596         Gtk::HBox          time_button_hbox;
597
598         struct Cursor {
599             Editor&               editor;
600             ArdourCanvas::Points  points;
601             ArdourCanvas::Line    canvas_item;
602             jack_nframes_t        current_frame;
603             double                length;
604
605             Cursor (Editor&, const string& color, bool (Editor::*)(GdkEvent*,ArdourCanvas::Item*));
606             ~Cursor ();
607
608             void set_position (jack_nframes_t);
609             void set_length (double units);
610             void set_y_axis (double position);
611         };
612
613         friend struct Cursor; /* it needs access to several private
614                                  fields. XXX fix me.
615                               */
616
617         Cursor* playhead_cursor;
618         Cursor* edit_cursor;
619         ArdourCanvas::Group* cursor_group;
620
621         void    cursor_to_next_region_point (Cursor*, ARDOUR::RegionPoint);
622         void    cursor_to_previous_region_point (Cursor*, ARDOUR::RegionPoint);
623         void    cursor_to_region_point (Cursor*, ARDOUR::RegionPoint, int32_t dir);
624         void    cursor_to_selection_start (Cursor *);
625         void    cursor_to_selection_end   (Cursor *);
626
627         ARDOUR::Region* find_next_region (jack_nframes_t, ARDOUR::RegionPoint, int32_t dir, TrackViewList&, TimeAxisView ** = 0);
628
629         vector<jack_nframes_t> region_boundary_cache;
630         void build_region_boundary_cache ();
631
632         Gtk::VBox           trackview_vpacker;
633
634         Gtk::HBox           top_hbox;
635         Gtk::HBox           bottom_hbox;
636         
637         Gtk::Table          edit_packer;
638         Gtk::Frame          edit_frame;
639         Gtk::VScrollbar     edit_vscrollbar;
640
641         Gtk::Adjustment     vertical_adjustment;
642         Gtk::Adjustment     horizontal_adjustment;
643
644         Gtk::Layout         controls_layout;
645         void set_layout_width(Gtk::Requisition *);
646
647         Gtk::HScrollbar     edit_hscrollbar;
648         bool                edit_hscroll_dragging;
649         
650         bool hscrollbar_button_press (GdkEventButton*);
651         bool hscrollbar_button_release (GdkEventButton*);
652         void hscrollbar_allocate (Gtk::Allocation &alloc);
653
654         double canvas_width;
655         double canvas_height;
656
657         bool track_canvas_map_handler (GdkEventAny*);
658         bool time_canvas_map_handler (GdkEventAny*);
659
660         gint edit_controls_button_release (GdkEventButton*);
661         Gtk::Menu *edit_controls_left_menu;
662         Gtk::Menu *edit_controls_right_menu;
663
664         void track_canvas_scroller_realized ();
665         void time_canvas_scroller_realized ();
666
667         Gtk::VBox           track_canvas_vbox;
668         Gtk::VBox           time_canvas_vbox;
669         Gtk::VBox           edit_controls_vbox;
670         Gtk::HBox           edit_controls_hbox;
671
672         void tie_vertical_scrolling ();
673         void canvas_horizontally_scrolled ();
674         void reposition_and_zoom (jack_nframes_t sample, double fpu);
675         gint deferred_reposition_and_zoom (jack_nframes_t sample, double fpu);
676         void end_location_changed (ARDOUR::Location*);
677         bool repos_zoom_queued;
678         bool no_zoom_repos_update;
679         bool no_tempo_map_update;
680
681         struct RegionListDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
682             RegionListDisplayModelColumns() {
683                     add (name);
684                     add (region);
685             }
686             Gtk::TreeModelColumn<Glib::ustring> name;
687             Gtk::TreeModelColumn<ARDOUR::Region*> region;
688         };
689             
690         RegionListDisplayModelColumns    region_list_columns;
691         Gtk::TreeView                    region_list_display;
692         Glib::RefPtr<Gtk::TreeStore>     region_list_model;
693         Glib::RefPtr<Gtk::TreeModelSort> region_list_sort_model;
694         Glib::RefPtr<Gtk::Action>        toggle_full_region_list_action;
695
696         void region_list_selection_changed ();
697
698         Gtk::Menu          *region_list_menu;
699         Gtk::ScrolledWindow region_list_scroller;
700         Gtk::Frame          region_list_frame;
701
702         bool region_list_display_key_press (GdkEventKey *);
703         bool region_list_display_key_release (GdkEventKey *);
704         bool region_list_display_button_press (GdkEventButton *);
705         bool region_list_display_button_release (GdkEventButton *);
706         void region_list_clear ();
707         void region_list_selection_mapover (sigc::slot<void,ARDOUR::Region&>);
708         void build_region_list_menu ();
709
710         Gtk::CheckMenuItem* toggle_auto_regions_item;
711         Gtk::CheckMenuItem* toggle_full_region_list_item;
712
713         Gtk::MenuItem* import_audio_item;
714         Gtk::MenuItem* embed_audio_item;
715
716         bool show_automatic_regions_in_region_list;
717         Editing::RegionListSortType region_list_sort_type;
718
719         void reset_region_list_sort_direction (bool);
720         void reset_region_list_sort_type (Editing::RegionListSortType);
721
722         void toggle_full_region_list ();
723         void toggle_show_auto_regions ();
724
725         int region_list_sorter (Gtk::TreeModel::iterator, Gtk::TreeModel::iterator);
726
727         /* named selections */
728
729         struct NamedSelectionDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
730             NamedSelectionDisplayModelColumns() { 
731                     add (text);
732                     add (selection);
733             }
734             Gtk::TreeModelColumn<Glib::ustring>  text;
735             Gtk::TreeModelColumn<ARDOUR::NamedSelection*>    selection;
736         };
737
738         NamedSelectionDisplayModelColumns named_selection_columns;
739         Glib::RefPtr<Gtk::TreeStore>     named_selection_model;
740
741         Gtk::TreeView          named_selection_display;
742         Gtk::ScrolledWindow named_selection_scroller;
743
744         void name_selection();
745         void named_selection_name_chosen ();
746         void create_named_selection (ARDOUR::stringcr_t);
747         void paste_named_selection (float times);
748
749         void handle_new_named_selection ();
750         void add_named_selection_to_named_selection_display (ARDOUR::NamedSelection&);
751         void redisplay_named_selections ();
752
753         gint named_selection_display_button_press (GdkEventButton *ev);
754         void named_selection_display_selection_changed ();
755
756         /* track views */
757         int track_spacing;
758         TrackViewList  track_views;
759         TimeAxisView     *trackview_by_y_position (double ypos);
760
761         static Gdk::Cursor* cross_hair_cursor;
762         static Gdk::Cursor* trimmer_cursor;
763         static Gdk::Cursor* selector_cursor;
764         static Gdk::Cursor* grabber_cursor;
765         static Gdk::Cursor* zoom_cursor;
766         static Gdk::Cursor* time_fx_cursor;
767         static Gdk::Cursor* fader_cursor;
768         static Gdk::Cursor* speaker_cursor;
769         static Gdk::Cursor* wait_cursor;
770         static Gdk::Cursor* timebar_cursor;
771
772         static void build_cursors ();
773
774         sigc::connection scroll_connection;
775         jack_nframes_t last_update_frame;
776         void center_screen (jack_nframes_t);
777         void center_screen_internal (jack_nframes_t, float);
778         
779         void update_current_screen ();
780         sigc::connection slower_update_connection;
781         void update_slower ();
782         
783         gint show_track_context_menu (GdkEventButton *);
784         void hide_track_context_menu ();
785
786         void session_going_away ();
787
788         jack_nframes_t cut_buffer_start;
789         jack_nframes_t cut_buffer_length;
790
791         bool typed_event (ArdourCanvas::Item*, GdkEvent*, ItemType);
792         bool button_press_handler (ArdourCanvas::Item*, GdkEvent*, ItemType);
793         bool button_release_handler (ArdourCanvas::Item*, GdkEvent*, ItemType);
794         bool motion_handler (ArdourCanvas::Item*, GdkEvent*, ItemType);
795         bool enter_handler (ArdourCanvas::Item*, GdkEvent*, ItemType);
796         bool leave_handler (ArdourCanvas::Item*, GdkEvent*, ItemType);
797         
798         /* KEYMAP HANDLING */
799
800         void register_actions ();
801
802         int ensure_cursor (jack_nframes_t* pos);
803
804         void fake_handle_new_audio_region (ARDOUR::AudioRegion *);
805         void handle_new_audio_region (ARDOUR::AudioRegion *);
806         void fake_handle_audio_region_removed (ARDOUR::AudioRegion *);
807         void handle_audio_region_removed (ARDOUR::AudioRegion *);
808         void add_audio_region_to_region_display (ARDOUR::AudioRegion *);
809         void region_hidden (ARDOUR::Region*);
810         void redisplay_regions ();
811         void insert_into_tmp_audio_regionlist(ARDOUR::AudioRegion *);
812
813         list<ARDOUR::AudioRegion *> tmp_audio_region_list;
814
815         void cut_copy (Editing::CutCopyOp);
816         void cut_copy_points (Editing::CutCopyOp);
817         void cut_copy_regions (Editing::CutCopyOp);
818         void cut_copy_ranges (Editing::CutCopyOp);
819
820         void mouse_paste ();
821         void paste_internal (jack_nframes_t position, float times);
822
823         /* EDITING OPERATIONS */
824         
825         void toggle_region_mute ();
826         void toggle_region_opaque ();
827         void raise_region ();
828         void raise_region_to_top ();
829         void lower_region ();
830         void lower_region_to_bottom ();
831         void split_region ();
832         void split_region_at (jack_nframes_t);
833         void split_regions_at (jack_nframes_t, AudioRegionSelection&);
834         void crop_region_to_selection ();
835         void set_region_sync_from_edit_cursor ();
836         void remove_region_sync();
837         void align_selection (ARDOUR::RegionPoint, jack_nframes_t position);
838         void align_selection_relative (ARDOUR::RegionPoint point, jack_nframes_t position);
839         void align_region (ARDOUR::Region&, ARDOUR::RegionPoint point, jack_nframes_t position);
840         void align_region_internal (ARDOUR::Region&, ARDOUR::RegionPoint point, jack_nframes_t position);
841         void remove_some_regions ();
842         void remove_clicked_region ();
843         void destroy_clicked_region ();
844         void edit_region ();
845         void duplicate_some_regions (AudioRegionSelection&, float times);
846         void duplicate_selection (float times);
847         void region_fill_selection ();
848
849         void region_fill_track ();
850         void audition_playlist_region_standalone (ARDOUR::AudioRegion&);
851         void audition_playlist_region_via_route (ARDOUR::AudioRegion&, ARDOUR::Route&);
852         void split_multichannel_region();
853         void reverse_region ();
854         void normalize_region ();
855         void denormalize_region ();
856
857         void audition_region_from_region_list ();
858         void hide_region_from_region_list ();
859         void remove_region_from_region_list ();
860
861         void align (ARDOUR::RegionPoint);
862         void align_relative (ARDOUR::RegionPoint);
863         void naturalize ();
864
865         void cut ();
866         void copy ();
867         void paste (float times);
868
869         int  get_prefix (float&, bool&);
870
871         void keyboard_paste ();
872         void keyboard_duplicate_region ();
873         void keyboard_duplicate_selection ();
874         void keyboard_nudge ();
875         void keyboard_insert_region_list_selection ();
876
877         void region_from_selection ();
878         void create_region_from_selection (std::vector<ARDOUR::AudioRegion*>&);
879
880         bool region_renamed;
881         void rename_region ();
882         void rename_region_finished (bool);
883
884         void play_from_start ();
885         void play_from_edit_cursor ();
886         void play_selected_region ();
887         void audition_selected_region ();
888         void toggle_loop_playback ();
889         void loop_selected_region ();
890         void play_location (ARDOUR::Location&);
891         void loop_location (ARDOUR::Location&);
892
893         Editing::ZoomFocus zoom_focus;
894
895         void temporal_zoom_selection ();
896         void temporal_zoom_session ();
897         void temporal_zoom (gdouble scale);
898         void temporal_zoom_by_frame (jack_nframes_t start, jack_nframes_t end, ARDOUR::stringcr_t op);
899         void temporal_zoom_to_frame (bool coarser, jack_nframes_t frame);
900
901         void amplitude_zoom (gdouble scale);
902         void amplitude_zoom_step (bool in);
903
904         void insert_region_list_drag (ARDOUR::AudioRegion&);
905         void insert_region_list_selection (float times);
906
907         void insert_sndfile (bool as_tracks);
908         void embed_audio ();    // inserts into region list
909         int  reject_because_rate_differs (ARDOUR::stringcr_t path, SF_INFO& finfo, ARDOUR::stringcr_t action, bool multiple_pending);
910
911         void do_embed_sndfiles (vector<string> paths, bool split);
912         void embed_sndfile (string path, bool split, bool multiple_files, bool& check_sr);
913
914         void do_insert_sndfile (vector<string> path, bool multi, jack_nframes_t frame);
915         void insert_paths_as_new_tracks (std::vector<std::string> paths, bool multi); // inserts files as new tracks
916         void insert_sndfile_into (ARDOUR::stringcr_t path, bool multi, AudioTimeAxisView* tv, jack_nframes_t& frame, bool prompt=true);
917         static void* _insert_sndfile_thread (void*);
918         void*  insert_sndfile_thread (void*);
919
920         /* generic interthread progress window */
921         
922         ArdourDialog* interthread_progress_window;
923         Gtk::Label interthread_progress_label;
924         Gtk::VBox interthread_progress_vbox;
925         Gtk::ProgressBar interthread_progress_bar;
926         Gtk::Button interthread_cancel_button;
927         Gtk::Label interthread_cancel_label;
928         sigc::connection  interthread_progress_connection;
929         void interthread_cancel_clicked ();
930         void build_interthread_progress_window ();
931         ARDOUR::InterThreadInfo* current_interthread_info;
932
933         /* import specific info */
934
935         ARDOUR::Session::import_status import_status;
936         gint import_progress_timeout (void *);
937         static void *_import_thread (void *);
938         void* import_thread ();
939         void catch_new_audio_region (ARDOUR::AudioRegion*);
940         ARDOUR::AudioRegion* last_audio_region;
941
942         /* to support this ... */
943
944         void import_audio (bool as_tracks);
945         void do_import (vector<string> paths, bool split, bool as_tracks);
946
947         void move_to_start ();
948         void move_to_end ();
949         void goto_frame ();
950         void center_playhead ();
951         void center_edit_cursor ();
952         void edit_cursor_backward ();
953         void edit_cursor_forward ();
954         void playhead_backward ();
955         void playhead_forward ();
956         void scroll_backward (float pages=0.8f);
957         void scroll_forward (float pages=0.8f);
958         void scroll_tracks_down ();
959         void scroll_tracks_up ();
960         void delete_sample_forward ();
961         void delete_sample_backward ();
962         void delete_screen ();
963         void search_backwards ();
964         void search_forwards ();
965         void set_mark ();
966         void clear_markers ();
967         void clear_ranges ();
968         void clear_locations ();
969         void jump_forward_to_mark ();
970         void jump_backward_to_mark ();
971         void cursor_align (bool playhead_to_edit);
972
973         void remove_last_capture ();
974
975         void set_selection_from_range (ARDOUR::Location&);
976         void set_selection_from_punch ();
977         void set_selection_from_loop ();
978
979         void add_location_from_selection ();
980         void set_route_loop_selection ();
981
982         void add_location_from_playhead_cursor ();
983
984         void reverse_selection ();
985         void edit_envelope ();
986
987         void start_scrolling ();
988         void stop_scrolling ();
989
990         void keyboard_selection_begin ();
991         void keyboard_selection_finish (bool add);
992         bool have_pending_keyboard_selection;
993         jack_nframes_t pending_keyboard_selection_start;
994
995         ARDOUR::AudioRegion* select_region_for_operation (int dir, TimeAxisView **tv);
996         void extend_selection_to_end_of_region (bool next);
997         void extend_selection_to_start_of_region (bool previous);
998
999         Editing::SnapType snap_type;
1000         Editing::SnapMode snap_mode;
1001         double snap_threshold;
1002
1003         void soundfile_chosen_for_insert (ARDOUR::stringcr_t selection, bool split_channels);
1004         void soundfile_chosen_for_embed (ARDOUR::stringcr_t selection, bool split_channels);
1005         void soundfile_chosen_for_import (ARDOUR::stringcr_t selection, bool split_channels);
1006
1007         void handle_gui_changes (ARDOUR::stringcr_t, void *);
1008
1009         void    hide_all_tracks (bool with_select);
1010
1011         void route_display_selection_changed ();
1012         void redisplay_route_list();
1013         gint route_list_reordered ();
1014         bool ignore_route_list_reorder;
1015         void queue_route_list_reordered ();
1016
1017         struct DragInfo {
1018           ArdourCanvas::Item* item;
1019             void* data;
1020             jack_nframes_t last_frame_position;
1021             int32_t pointer_frame_offset;
1022             jack_nframes_t grab_frame;
1023             jack_nframes_t last_pointer_frame;
1024             jack_nframes_t current_pointer_frame;
1025             double grab_x, grab_y;
1026             double cumulative_x_drag;
1027             double cumulative_y_drag;
1028             double current_pointer_x;
1029             double current_pointer_y;
1030           void (Editor::*motion_callback)(ArdourCanvas::Item*, GdkEvent*);
1031           void (Editor::*finished_callback)(ArdourCanvas::Item*, GdkEvent*);
1032             TimeAxisView* last_trackview;
1033             bool x_constrained;
1034             bool copy;
1035             bool was_rolling;
1036             bool first_move;
1037             bool move_threshold_passsed;
1038             bool want_move_threshold;
1039             bool brushing;
1040             ARDOUR::Location* copied_location;
1041         } drag_info;
1042
1043         struct LineDragInfo {
1044             uint32_t before;
1045             uint32_t after;
1046         };
1047
1048         LineDragInfo current_line_drag_info;
1049
1050         void start_grab (GdkEvent*, Gdk::Cursor* cursor = 0);
1051         bool end_grab (ArdourCanvas::Item*, GdkEvent*);
1052
1053         Gtk::Menu fade_context_menu;
1054         void popup_fade_context_menu (int, int, ArdourCanvas::Item*, ItemType);
1055
1056         void start_fade_in_grab (ArdourCanvas::Item*, GdkEvent*);
1057         void start_fade_out_grab (ArdourCanvas::Item*, GdkEvent*);
1058         void fade_in_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1059         void fade_out_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1060         void fade_in_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1061         void fade_out_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1062         
1063         std::set<ARDOUR::Playlist*> motion_frozen_playlists;
1064         void region_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1065         void region_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1066         void region_copy_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1067
1068         void cursor_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1069         void cursor_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1070         void marker_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1071         void marker_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1072         void control_point_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1073         void control_point_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1074         void line_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1075         void line_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1076
1077         void tempo_marker_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1078         void tempo_marker_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1079         void meter_marker_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1080         void meter_marker_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1081
1082         gint mouse_rename_region (ArdourCanvas::Item*, GdkEvent*);
1083
1084         void start_region_grab (ArdourCanvas::Item*, GdkEvent*);
1085         void start_region_copy_grab (ArdourCanvas::Item*, GdkEvent*);
1086         void start_region_brush_grab (ArdourCanvas::Item*, GdkEvent*);
1087         void start_selection_grab (ArdourCanvas::Item*, GdkEvent*);
1088         void start_cursor_grab (ArdourCanvas::Item*, GdkEvent*);
1089         void start_marker_grab (ArdourCanvas::Item*, GdkEvent*);
1090         void start_control_point_grab (ArdourCanvas::Item*, GdkEvent*);
1091         void start_line_grab_from_regionview (ArdourCanvas::Item*, GdkEvent*);
1092         void start_line_grab_from_line (ArdourCanvas::Item*, GdkEvent*);
1093         void start_line_grab (AutomationLine *, GdkEvent*);
1094         void start_tempo_marker_grab (ArdourCanvas::Item*, GdkEvent*);
1095         void start_meter_marker_grab (ArdourCanvas::Item*, GdkEvent*);
1096
1097         void region_view_item_click (AudioRegionView&, GdkEventButton*);
1098
1099         void remove_gain_control_point (ArdourCanvas::Item*, GdkEvent*);
1100         void remove_control_point (ArdourCanvas::Item*, GdkEvent*);
1101
1102         void mouse_brush_insert_region (AudioRegionView*, jack_nframes_t pos);
1103         void brush (jack_nframes_t);
1104
1105         void show_verbose_time_cursor (jack_nframes_t frame, double offset = 0, double xpos=-1, double ypos=-1);
1106         void show_verbose_duration_cursor (jack_nframes_t start, jack_nframes_t end, double offset = 0, double xpos=-1, double ypos=-1);
1107
1108         /* Canvas event handlers */
1109
1110         bool canvas_control_point_event (GdkEvent* event,ArdourCanvas::Item*, ControlPoint*);
1111         bool canvas_line_event (GdkEvent* event,ArdourCanvas::Item*, AutomationLine*);
1112         bool canvas_selection_rect_event (GdkEvent* event,ArdourCanvas::Item*, SelectionRect*);
1113         bool canvas_selection_start_trim_event (GdkEvent* event,ArdourCanvas::Item*, SelectionRect*);
1114         bool canvas_selection_end_trim_event (GdkEvent* event,ArdourCanvas::Item*, SelectionRect*);
1115         bool canvas_crossfade_view_event (GdkEvent* event,ArdourCanvas::Item*, CrossfadeView*);
1116         bool canvas_fade_in_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
1117         bool canvas_fade_in_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
1118         bool canvas_fade_out_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
1119         bool canvas_fade_out_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
1120         bool canvas_region_view_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
1121         bool canvas_region_view_name_highlight_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
1122         bool canvas_region_view_name_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
1123         bool canvas_stream_view_event (GdkEvent* event,ArdourCanvas::Item*, AudioTimeAxisView*);
1124         bool canvas_marker_event (GdkEvent* event,ArdourCanvas::Item*, Marker*);
1125         bool canvas_zoom_rect_event (GdkEvent* event,ArdourCanvas::Item*);
1126         bool canvas_tempo_marker_event (GdkEvent* event,ArdourCanvas::Item*, TempoMarker*);
1127         bool canvas_meter_marker_event (GdkEvent* event,ArdourCanvas::Item*, MeterMarker*);
1128         bool canvas_automation_track_event(GdkEvent* event, ArdourCanvas::Item*, AutomationTimeAxisView*) ;
1129
1130         bool canvas_tempo_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1131         bool canvas_meter_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1132         bool canvas_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1133         bool canvas_range_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1134         bool canvas_transport_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1135
1136         bool canvas_imageframe_item_view_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameView*);
1137         bool canvas_imageframe_view_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameTimeAxis*);
1138         bool canvas_imageframe_start_handle_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameView*);
1139         bool canvas_imageframe_end_handle_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameView*);
1140         bool canvas_marker_time_axis_view_event(GdkEvent* event, ArdourCanvas::Item*,MarkerTimeAxis*);
1141         bool canvas_markerview_item_view_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*);
1142         bool canvas_markerview_start_handle_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*);
1143         bool canvas_markerview_end_handle_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*);
1144
1145         /* non-public event handlers */
1146
1147         bool canvas_playhead_cursor_event (GdkEvent* event, ArdourCanvas::Item*);
1148         bool canvas_edit_cursor_event (GdkEvent* event, ArdourCanvas::Item*);
1149         bool track_canvas_event (GdkEvent* event, ArdourCanvas::Item*);
1150
1151         bool track_canvas_button_press_event (GdkEventButton *);
1152         bool track_canvas_button_release_event (GdkEventButton *);
1153         
1154         void track_canvas_allocate (Gtk::Allocation alloc);
1155         void time_canvas_allocate (Gtk::Allocation alloc);
1156
1157         void set_edit_cursor (GdkEvent* event);
1158         void set_playhead_cursor (GdkEvent* event);
1159
1160         void kbd_driver (sigc::slot<void,GdkEvent*>, bool use_track_canvas = true, bool use_time_canvas = true, bool can_select = true);
1161         void kbd_set_playhead_cursor ();
1162         void kbd_set_edit_cursor ();
1163         void kbd_split ();
1164         void kbd_align (ARDOUR::RegionPoint);
1165         void kbd_align_relative (ARDOUR::RegionPoint);
1166         void kbd_brush ();
1167         void kbd_audition ();
1168
1169         void kbd_do_split (GdkEvent*);
1170         void kbd_do_align (GdkEvent*, ARDOUR::RegionPoint);
1171         void kbd_do_align_relative (GdkEvent*, ARDOUR::RegionPoint);
1172         void kbd_do_brush (GdkEvent*);
1173         void kbd_do_audition (GdkEvent*);
1174
1175         void fake_handle_new_duration ();
1176         void handle_new_duration ();
1177         void initialize_canvas ();
1178         void reset_scrolling_region (Gtk::Allocation* alloc = 0);
1179         void scroll_canvas ();
1180
1181         /* display control */
1182         
1183         bool _show_measures;
1184         bool _show_waveforms;
1185         bool _follow_playhead;
1186         bool _show_waveforms_recording;
1187         
1188         void add_bbt_marks (ARDOUR::TempoMap::BBTPointList&);
1189
1190         ARDOUR::TempoMap::BBTPointList *current_bbt_points;
1191         
1192         typedef vector<ArdourCanvas::SimpleLine*> TimeLineList;
1193         TimeLineList free_measure_lines;
1194         TimeLineList used_measure_lines;
1195
1196         ArdourCanvas::Group* time_line_group;
1197         ArdourCanvas::SimpleLine* get_time_line ();
1198         void hide_measures ();
1199         void draw_measures ();
1200         void draw_time_bars ();
1201
1202         void new_tempo_section ();
1203
1204         void mouse_add_new_tempo_event (jack_nframes_t where);
1205         void mouse_add_new_meter_event (jack_nframes_t where);
1206
1207         void remove_tempo_marker (ArdourCanvas::Item*);
1208         void remove_meter_marker (ArdourCanvas::Item*);
1209         gint real_remove_tempo_marker (ARDOUR::TempoSection*);
1210         gint real_remove_meter_marker (ARDOUR::MeterSection*);
1211         
1212         void edit_tempo_section (ARDOUR::TempoSection*);
1213         void edit_meter_section (ARDOUR::MeterSection*);
1214         void edit_tempo_marker (ArdourCanvas::Item*);
1215         void edit_meter_marker (ArdourCanvas::Item*);
1216         
1217         void marker_menu_edit ();
1218         void marker_menu_remove ();
1219         void marker_menu_rename ();
1220         void marker_menu_hide ();
1221         void marker_menu_loop_range ();
1222         void marker_menu_play_from ();
1223         void marker_menu_set_playhead ();
1224         void marker_menu_set_from_playhead ();
1225         void marker_menu_set_from_selection ();
1226         void new_transport_marker_menu_set_loop ();
1227         void new_transport_marker_menu_set_punch ();
1228         void update_loop_range_view (bool visibility=false);
1229         void update_punch_range_view (bool visibility=false);
1230         gint new_transport_marker_menu_popdown (GdkEventAny*);
1231         void marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
1232         void tm_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
1233         void transport_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
1234         void new_transport_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
1235         void build_marker_menu ();
1236         void build_tm_marker_menu ();
1237         void build_transport_marker_menu ();
1238         void build_new_transport_marker_menu ();
1239
1240         Gtk::Menu* tm_marker_menu;
1241         Gtk::Menu* marker_menu;
1242         Gtk::Menu* transport_marker_menu;
1243         Gtk::Menu* new_transport_marker_menu;
1244         ArdourCanvas::Item* marker_menu_item;
1245
1246         typedef list<Marker*> Marks;
1247         Marks metric_marks;
1248
1249         void remove_metric_marks ();
1250         void draw_metric_marks (const ARDOUR::Metrics& metrics);
1251
1252         void tempo_map_changed (ARDOUR::Change);
1253         void redisplay_tempo ();
1254         
1255         void snap_to (jack_nframes_t& first, int32_t direction = 0, bool for_mark = false);
1256         uint32_t bbt_beat_subdivision;
1257
1258         /* toolbar */
1259         
1260         Gtk::ToggleButton        editor_mixer_button;
1261
1262         void editor_mixer_button_toggled ();
1263
1264         AudioClock               selection_start_clock;
1265         Gtk::Label               selection_start_clock_label;
1266         AudioClock               selection_end_clock;
1267         Gtk::Label               selection_end_clock_label;
1268         AudioClock               edit_cursor_clock;
1269         Gtk::Label               edit_cursor_clock_label;
1270         AudioClock               zoom_range_clock;
1271         Gtk::Button              zoom_in_button;
1272         Gtk::Button              zoom_out_button;
1273         Gtk::Button              zoom_out_full_button;
1274         Gtk::Button              zoom_onetoone_button;
1275
1276         Gtk::VBox                toolbar_clock_vbox;
1277         Gtk::VBox                toolbar_selection_clock_vbox; 
1278         Gtk::Table               toolbar_selection_clock_table;
1279         Gtk::Label               toolbar_selection_cursor_label;
1280         
1281         Gtk::Table               mouse_mode_button_table;
1282         Gtkmm2ext::TearOff*       mouse_mode_tearoff;
1283         Gtk::ToggleButton        mouse_select_button;
1284         Gtk::ToggleButton        mouse_move_button;
1285         Gtk::ToggleButton        mouse_gain_button;
1286         Gtk::ToggleButton        mouse_zoom_button;
1287         Gtk::ToggleButton        mouse_timefx_button;
1288         Gtk::ToggleButton        mouse_audition_button;
1289         GroupedButtons          *mouse_mode_button_set;
1290         void                     mouse_mode_toggled (Editing::MouseMode m);
1291         bool                     ignore_mouse_mode_toggle;
1292
1293         gint                     mouse_select_button_release (GdkEventButton*);
1294
1295         Gtk::VBox                automation_box;
1296         Gtk::Button              automation_mode_button;
1297         Gtk::ToggleButton        global_automation_button;
1298
1299         Gtk::ComboBoxText edit_mode_selector;
1300         Gtk::Label               edit_mode_label;
1301         Gtk::VBox                edit_mode_box;
1302
1303         void edit_mode_selection_done ();
1304
1305         Gtk::ComboBoxText snap_type_selector;
1306         Gtk::Label               snap_type_label;
1307         Gtk::VBox                snap_type_box;
1308
1309         void snap_type_selection_done ();
1310
1311         Gtk::ComboBoxText               snap_mode_selector;
1312         Gtk::Label               snap_mode_label;
1313         Gtk::VBox                snap_mode_box;
1314
1315         void snap_mode_selection_done ();
1316         
1317         Gtk::ComboBoxText zoom_focus_selector;
1318         Gtk::Label               zoom_focus_label;
1319         Gtk::VBox                zoom_focus_box;
1320         
1321         void zoom_focus_selection_done ();
1322
1323         Gtk::Label          zoom_indicator_label;
1324         Gtk::HBox           zoom_indicator_box;
1325         Gtk::VBox           zoom_indicator_vbox;
1326
1327         void                update_zoom_indicator ();
1328         void                zoom_adjustment_changed();
1329
1330         void                edit_cursor_clock_changed();
1331         
1332         void setup_toolbar ();
1333
1334         Gtkmm2ext::TearOff*       tools_tearoff;
1335         Gtk::HBox                toolbar_hbox;
1336         Gtk::EventBox            toolbar_base;
1337         Gtk::Frame               toolbar_frame;
1338
1339         /* selection process */
1340
1341         Selection* selection;
1342         Selection* cut_buffer;
1343
1344         void time_selection_changed ();
1345         void track_selection_changed ();
1346         void region_selection_changed ();
1347         void point_selection_changed ();
1348         void audio_track_selection_changed ();
1349         void line_selection_changed ();
1350
1351         enum SelectionOp {
1352                 CreateSelection,
1353                 SelectionStartTrim,
1354                 SelectionEndTrim,
1355                 SelectionMove
1356         } selection_op;
1357
1358         void start_selection_op (ArdourCanvas::Item* item, GdkEvent* event, SelectionOp);
1359         void drag_selection (ArdourCanvas::Item* item, GdkEvent* event);
1360         void end_selection_op (ArdourCanvas::Item* item, GdkEvent* event);
1361         void cancel_selection ();
1362
1363         void region_selection_op (void (ARDOUR::Region::*pmf)(void));
1364         void region_selection_op (void (ARDOUR::Region::*pmf)(void*), void*);
1365         void region_selection_op (void (ARDOUR::Region::*pmf)(bool), bool);
1366
1367         bool audio_region_selection_covers (jack_nframes_t where);
1368
1369         /* transport range select process */
1370         enum RangeMarkerOp {
1371                 CreateRangeMarker,
1372                 CreateTransportMarker
1373         } range_marker_op;
1374
1375         void start_range_markerbar_op (ArdourCanvas::Item* item, GdkEvent* event, RangeMarkerOp);
1376         void drag_range_markerbar_op (ArdourCanvas::Item* item, GdkEvent* event);
1377         void end_range_markerbar_op (ArdourCanvas::Item* item, GdkEvent* event);
1378
1379         ArdourCanvas::SimpleRect*  range_bar_drag_rect;
1380         ArdourCanvas::SimpleRect*  transport_bar_drag_rect;
1381         ArdourCanvas::Line*        marker_drag_line;
1382         ArdourCanvas::Points       marker_drag_line_points;
1383         ArdourCanvas::SimpleRect*  range_marker_drag_rect;
1384
1385         void update_marker_drag_item (ARDOUR::Location *);
1386         
1387         ArdourCanvas::SimpleRect     *transport_bar_range_rect;
1388         ArdourCanvas::SimpleRect     *transport_bar_preroll_rect;
1389         ArdourCanvas::SimpleRect     *transport_bar_postroll_rect;
1390         ArdourCanvas::SimpleRect     *transport_loop_range_rect;
1391         ArdourCanvas::SimpleRect     *transport_punch_range_rect;
1392         ArdourCanvas::SimpleLine     *transport_punchin_line;
1393         ArdourCanvas::SimpleLine     *transport_punchout_line;
1394         ArdourCanvas::SimpleRect     *transport_preroll_rect;
1395         ArdourCanvas::SimpleRect     *transport_postroll_rect;
1396
1397         ARDOUR::Location*  transport_loop_location();
1398         ARDOUR::Location*  transport_punch_location();
1399
1400         ARDOUR::Location   *temp_location;
1401         
1402         /* object rubberband select process */
1403         
1404         void start_rubberband_select (ArdourCanvas::Item* item, GdkEvent* event);
1405         void drag_rubberband_select (ArdourCanvas::Item* item, GdkEvent* event);
1406         void end_rubberband_select (ArdourCanvas::Item* item, GdkEvent* event);
1407
1408         bool select_all_within (jack_nframes_t start, jack_nframes_t end, gdouble topy, gdouble boty, bool add);
1409         
1410         ArdourCanvas::SimpleRect   *rubberband_rect;
1411         
1412         /* mouse zoom process */
1413
1414         void start_mouse_zoom (ArdourCanvas::Item* item, GdkEvent* event);
1415         void drag_mouse_zoom (ArdourCanvas::Item* item, GdkEvent* event);
1416         void end_mouse_zoom (ArdourCanvas::Item* item, GdkEvent* event);
1417
1418         ArdourCanvas::SimpleRect   *zoom_rect;
1419         void reposition_zoom_rect (jack_nframes_t start, jack_nframes_t end);
1420         
1421         /* diskstream/route display management */
1422
1423         struct RouteDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
1424             RouteDisplayModelColumns() { 
1425                     add (text);
1426                     add (tv);
1427             }
1428             Gtk::TreeModelColumn<Glib::ustring>  text;
1429             Gtk::TreeModelColumn<TimeAxisView*>    tv;
1430         };
1431
1432         RouteDisplayModelColumns    route_display_columns;
1433         Glib::RefPtr<Gtk::ListStore> route_display_model;
1434         Glib::RefPtr<Gtk::TreeSelection> route_display_selection;
1435
1436         gint route_list_compare_func (Gtk::TreeModel::iterator, Gtk::TreeModel::iterator);
1437         Gtk::TreeView          route_list; //GTK2FIX rename to route_display
1438         Gtk::ScrolledWindow route_list_scroller;
1439         Gtk::Menu          *route_list_menu;
1440
1441         void route_list_column_click ();
1442         void build_route_list_menu ();
1443         void select_all_routes ();
1444         void unselect_all_routes ();
1445         void select_all_audiotracks ();
1446         void unselect_all_audiotracks ();
1447         void select_all_audiobus ();
1448         void unselect_all_audiobus ();
1449
1450         /* edit group management */
1451
1452         struct GroupListModelColumns : public Gtk::TreeModel::ColumnRecord {
1453                 GroupListModelColumns () {
1454                        add (is_active);
1455                        add (text);
1456                        add (routegroup);
1457                 }
1458                 Gtk::TreeModelColumn<bool> is_active;
1459                 Gtk::TreeModelColumn<std::string> text;
1460                 Gtk::TreeModelColumn<ARDOUR::RouteGroup*>   routegroup;
1461         };
1462
1463         GroupListModelColumns group_columns;
1464         Glib::RefPtr<Gtk::ListStore> group_model;
1465         Glib::RefPtr<Gtk::TreeSelection> group_selection;
1466
1467         Gtk::Button         edit_group_list_button;
1468         Gtk::Label          edit_group_list_button_label;
1469         Gtk::TreeView       edit_group_list;
1470         Gtk::ScrolledWindow edit_group_list_scroller;
1471         Gtk::Menu          *edit_group_list_menu;
1472         Gtk::VBox           edit_group_vbox;
1473
1474         void edit_group_list_column_click (gint);
1475         void build_edit_group_list_menu ();
1476         void select_all_edit_groups ();
1477         void unselect_all_edit_groups ();
1478         void new_edit_group ();
1479         void edit_group_list_button_clicked ();
1480         gint edit_group_list_button_press_event (GdkEventButton* ev);
1481         void edit_group_selection_changed ();
1482         void fake_add_edit_group (ARDOUR::RouteGroup* group);
1483         void add_edit_group (ARDOUR::RouteGroup* group);
1484         void group_flags_changed (void*, ARDOUR::RouteGroup*);
1485
1486         Gtk::VBox           list_vpacker;
1487
1488         /* autoscrolling */
1489
1490         int autoscroll_timeout_tag;
1491         int autoscroll_direction;
1492         uint32_t autoscroll_cnt;
1493         jack_nframes_t autoscroll_distance;
1494      
1495         static gint _autoscroll_canvas (void *);
1496         gint autoscroll_canvas ();
1497         void start_canvas_autoscroll (int direction);
1498         void stop_canvas_autoscroll ();
1499         void maybe_autoscroll (GdkEvent*);
1500
1501         /* trimming */
1502         enum TrimOp {
1503                 StartTrim,
1504                 EndTrim,
1505                 ContentsTrim,
1506         } trim_op;
1507
1508         void start_trim (ArdourCanvas::Item*, GdkEvent*);
1509         void point_trim (GdkEvent*);
1510         void trim_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1511         void single_contents_trim (AudioRegionView&, jack_nframes_t, bool, bool, bool);
1512         void single_start_trim (AudioRegionView&, jack_nframes_t, bool, bool);
1513         void single_end_trim (AudioRegionView&, jack_nframes_t, bool, bool);
1514
1515         void trim_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1516         void thaw_region_after_trim (AudioRegionView& rv);
1517         
1518         void trim_region_to_edit_cursor ();
1519         void trim_region_from_edit_cursor ();
1520
1521         bool show_gain_after_trim;
1522
1523         /* Drag-n-Drop */
1524
1525         int convert_drop_to_paths (std::vector<std::string>& paths,
1526                                    GdkDragContext     *context,
1527                                    gint                x,
1528                                    gint                y,
1529                                    GtkSelectionData   *data,
1530                                    guint               info,
1531                                    guint               time);
1532
1533         void  track_canvas_drag_data_received  (GdkDragContext     *context,
1534                                                 gint                x,
1535                                                 gint                y,
1536                                                 GtkSelectionData   *data,
1537                                                 guint               info,
1538                                                 guint               time);
1539
1540         void  region_list_display_drag_data_received  (GdkDragContext     *context,
1541                                                        gint                x,
1542                                                        gint                y,
1543                                                        GtkSelectionData   *data,
1544                                                        guint               info,
1545                                                        guint               time);
1546         
1547         /* audio export */
1548
1549         ExportDialog *export_dialog;
1550         void export_range (jack_nframes_t start, jack_nframes_t end);
1551
1552         int  write_region_selection(AudioRegionSelection&);
1553         bool write_region (string path, ARDOUR::AudioRegion&);
1554         void export_region ();
1555         void bounce_region_selection ();
1556         void bounce_range_selection ();
1557         void external_edit_region ();
1558
1559         int write_audio_selection (TimeSelection&);
1560         bool write_audio_range (ARDOUR::Playlist&, uint32_t channels, list<ARDOUR::AudioRange>&);
1561
1562         void write_selection ();
1563
1564         /* history */
1565
1566         UndoAction get_memento() const;
1567
1568         void begin_reversible_command (string cmd_name);
1569         void commit_reversible_command ();
1570
1571         /* visual history */
1572
1573         UndoHistory visual_history;
1574         UndoCommand current_visual_command;
1575
1576         void begin_reversible_visual_command (ARDOUR::stringcr_t cmd_name);
1577         void commit_reversible_visual_command ();
1578
1579         void update_title ();   
1580         void update_title_s (ARDOUR::stringcr_t snapshot_name);
1581
1582         struct State {
1583             Selection* selection;
1584             double     frames_per_unit;
1585
1586             State();
1587             ~State();
1588         };
1589
1590         void store_state (State&) const;
1591         void restore_state (State *);
1592
1593         void instant_save ();
1594
1595         ARDOUR::AudioRegion* last_audition_region;
1596         
1597         /* freeze operations */
1598
1599         ARDOUR::InterThreadInfo freeze_status;
1600         gint freeze_progress_timeout (void *);
1601         static void* _freeze_thread (void*);
1602         void* freeze_thread ();
1603
1604         void freeze_route ();
1605         void unfreeze_route ();
1606
1607         /* edit-group solo + mute */
1608
1609         void set_edit_group_solo (ARDOUR::Route&, bool);
1610         void set_edit_group_mute (ARDOUR::Route&, bool);
1611
1612         /* duplication */
1613
1614         void duplicate_dialog (bool for_region);
1615         
1616         /* edit menu */
1617
1618         Gtk::Menu* edit_menu;
1619         bool edit_menu_map_handler (GdkEventAny*);
1620
1621         jack_nframes_t event_frame (GdkEvent*, double* px = 0, double* py = 0);
1622
1623         void time_fx_motion (ArdourCanvas::Item*, GdkEvent*);
1624         void start_time_fx (ArdourCanvas::Item*, GdkEvent*);
1625         void end_time_fx (ArdourCanvas::Item*, GdkEvent*);
1626
1627         struct TimeStretchDialog : public ArdourDialog {
1628             ARDOUR::Session::TimeStretchRequest request;
1629             Editor&               editor;
1630             AudioRegionSelection  regions;
1631             Gtk::ProgressBar      progress_bar;
1632             Gtk::ToggleButton     quick_button;
1633             Gtk::ToggleButton     antialias_button;
1634             Gtk::Button           cancel_button;
1635             Gtk::Button           action_button;
1636             Gtk::HBox             lower_button_box;
1637             Gtk::HBox             upper_button_box;
1638             Gtk::VBox             packer;
1639             int                   status;
1640
1641             TimeStretchDialog (Editor& e);
1642
1643             gint update_progress ();
1644             sigc::connection first_cancel;
1645             sigc::connection first_delete;
1646             void cancel_timestretch_in_progress ();
1647             gint delete_timestretch_in_progress (GdkEventAny*);
1648         };
1649
1650         /* "whats mine is yours" */
1651
1652         friend class TimeStretchDialog;
1653
1654         TimeStretchDialog* current_timestretch;
1655
1656         static void* timestretch_thread (void *arg);
1657         int run_timestretch (AudioRegionSelection&, float fraction);
1658         void do_timestretch (TimeStretchDialog&);
1659
1660         /* editor-mixer strip */
1661
1662         MixerStrip *current_mixer_strip;
1663         Gtk::VBox current_mixer_strip_vbox;
1664         void cms_deleted ();
1665         void current_mixer_strip_hidden ();
1666         void current_mixer_strip_removed ();
1667
1668         void detach_tearoff (Gtk::Box* b, Gtk::Window* w);
1669         void reattach_tearoff (Gtk::Box* b, Gtk::Window* w, int32_t n);
1670
1671         /* nudging tracks */
1672
1673         void nudge_track (bool use_edit_cursor, bool forwards);
1674
1675         /* xfades */
1676
1677         bool _xfade_visibility;
1678         
1679         /* <CMT Additions> */
1680         void handle_new_imageframe_time_axis_view(ARDOUR::stringcr_t track_name, void* src) ;
1681         void handle_new_imageframe_marker_time_axis_view(ARDOUR::stringcr_t track_name, TimeAxisView* marked_track) ;
1682
1683         void start_imageframe_grab(ArdourCanvas::Item*, GdkEvent*) ;
1684         void start_markerview_grab(ArdourCanvas::Item*, GdkEvent*) ;
1685
1686         void imageframe_drag_motion_callback(ArdourCanvas::Item*, GdkEvent*) ;
1687         void markerview_drag_motion_callback(ArdourCanvas::Item*, GdkEvent*) ;
1688         void timeaxis_item_drag_finished_callback(ArdourCanvas::Item*, GdkEvent*) ;
1689
1690         gint canvas_imageframe_item_view_event(ArdourCanvas::Item* item, GdkEvent* event, ImageFrameView* ifv);
1691         gint canvas_imageframe_view_event(ArdourCanvas::Item* item, GdkEvent* event, ImageFrameTimeAxis* ifta);
1692         gint canvas_imageframe_start_handle_event(ArdourCanvas::Item* item, GdkEvent* event, ImageFrameView* ifv);
1693         gint canvas_imageframe_end_handle_event(ArdourCanvas::Item* item, GdkEvent* event, ImageFrameView* ifv);
1694
1695         gint canvas_marker_time_axis_view_event(ArdourCanvas::Item* item, GdkEvent* event, MarkerTimeAxis* mta);
1696         gint canvas_markerview_item_view_event(ArdourCanvas::Item* item, GdkEvent* event, MarkerView* mv);
1697         gint canvas_markerview_start_handle_event(ArdourCanvas::Item* item, GdkEvent* event, MarkerView* mv);
1698         gint canvas_markerview_end_handle_event(ArdourCanvas::Item* item, GdkEvent* event, MarkerView* mv);
1699
1700         void imageframe_start_handle_op(ArdourCanvas::Item* item, GdkEvent* event) ;
1701         void imageframe_end_handle_op(ArdourCanvas::Item* item, GdkEvent* event) ;
1702         void imageframe_start_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event) ;
1703         void imageframe_start_handle_end_trim(ArdourCanvas::Item* item, GdkEvent* event) ;
1704         void imageframe_end_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event) ;
1705         void imageframe_end_handle_end_trim(ArdourCanvas::Item* item, GdkEvent* event) ;
1706         
1707         void markerview_item_start_handle_op(ArdourCanvas::Item* item, GdkEvent* event) ;
1708         void markerview_item_end_handle_op(ArdourCanvas::Item* item, GdkEvent* event) ;
1709         void markerview_start_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event) ;
1710         void markerview_start_handle_end_trim(ArdourCanvas::Item* item, GdkEvent* event) ;
1711         void markerview_end_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event) ;
1712         void markerview_end_handle_end_trim(ArdourCanvas::Item* item, GdkEvent* event) ;
1713
1714         void popup_imageframe_edit_menu(int button, int32_t time, ArdourCanvas::Item* ifv, bool with_frame) ;
1715         void popup_marker_time_axis_edit_menu(int button, int32_t time, ArdourCanvas::Item* ifv, bool with_frame) ;
1716
1717         ImageFrameSocketHandler* image_socket_listener ;
1718         /* </CMT Additions> */
1719
1720         void toggle_xfade_active (ARDOUR::Crossfade*);
1721         void toggle_xfade_length (ARDOUR::Crossfade*);
1722         void edit_xfade (ARDOUR::Crossfade*);
1723         void remove_xfade ();
1724         void xfade_edit_left_region ();
1725         void xfade_edit_right_region ();
1726
1727         static const int32_t default_width = 995;
1728         static const int32_t default_height = 765;
1729
1730         /* nudge */
1731
1732         Gtk::Button      nudge_forward_button;
1733         Gtk::Button      nudge_backward_button;
1734         Gtk::HBox        nudge_hbox;
1735         Gtk::VBox        nudge_vbox;
1736         Gtk::Label       nudge_label;
1737         AudioClock       nudge_clock;
1738
1739         jack_nframes_t get_nudge_distance (jack_nframes_t pos, jack_nframes_t& next);
1740         
1741         /* audio filters */
1742
1743         void apply_filter (ARDOUR::AudioFilter&, string cmd);
1744
1745         /* handling cleanup */
1746
1747         int playlist_deletion_dialog (ARDOUR::Playlist*);
1748
1749         vector<sigc::connection> session_connections;
1750
1751         /* tracking step changes of track height */
1752
1753         TimeAxisView* current_stepping_trackview;
1754         struct timeval last_track_height_step_timestamp;
1755         gint track_height_step_timeout();
1756         sigc::connection step_timeout;
1757
1758         TimeAxisView* entered_track;
1759         AudioRegionView* entered_regionview;
1760         bool clear_entered_track;
1761         gint left_track_canvas (GdkEventCrossing*);
1762         void set_entered_track (TimeAxisView*);
1763         void set_entered_regionview (AudioRegionView*);
1764         gint left_automation_track ();
1765
1766         bool _new_regionviews_show_envelope;
1767
1768         void toggle_gain_envelope_visibility ();
1769         void toggle_gain_envelope_active ();
1770         
1771         typedef std::map<Editing::ColorID,std::string> ColorStyleMap;
1772         void init_colormap ();
1773
1774         bool on_key_press_event (GdkEventKey*);
1775 };
1776
1777 #endif /* __ardour_editor_h__ */