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