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