editor window layout changes, and lots more
authorPaul Davis <paul@linuxaudiosystems.com>
Mon, 12 Dec 2005 20:54:55 +0000 (20:54 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Mon, 12 Dec 2005 20:54:55 +0000 (20:54 +0000)
git-svn-id: svn://localhost/trunk/ardour2@187 d708f5d6-7413-0410-9779-e7cbd77b26cf

26 files changed:
gtk2_ardour/ardour.bindings
gtk2_ardour/ardour2_ui.rc
gtk2_ardour/ardour_ui2.cc
gtk2_ardour/audio_clock.cc
gtk2_ardour/audio_clock.h
gtk2_ardour/audio_time_axis.cc
gtk2_ardour/audio_time_axis.h
gtk2_ardour/editor.cc
gtk2_ardour/editor.h
gtk2_ardour/editor_actions.cc
gtk2_ardour/editor_canvas.cc
gtk2_ardour/editor_export_audio.cc
gtk2_ardour/editor_hscroller.cc
gtk2_ardour/editor_imageframe.cc
gtk2_ardour/editor_keyboard.cc
gtk2_ardour/editor_markers.cc
gtk2_ardour/editor_mouse.cc
gtk2_ardour/editor_ops.cc
gtk2_ardour/editor_route_list.cc
gtk2_ardour/editor_rulers.cc
gtk2_ardour/imageframe_time_axis.cc
gtk2_ardour/marker.cc
gtk2_ardour/marker_time_axis.cc
gtk2_ardour/mixer_ui.cc
gtk2_ardour/time_axis_view.cc
gtk2_ardour/time_axis_view.h

index c559cc9eb25c4f098cf854b304ccfd6efb8ea6f3..fdbc336783475b0220f98683e339b05641714123 100644 (file)
@@ -2,10 +2,16 @@
 
 (gtk_accel_path "<Actions>/Common/Quit" "<Control>q")
 (gtk_accel_path "<Actions>/Common/Save" "<Control>s")
-(gtk_accel_path "<Actions>/Editor/toggle-playback" "space")
 (gtk_accel_path "<Actions>/Common/TransportForward" "Right")
 (gtk_accel_path "<Actions>/Common/TransportRewind" "Left")
 (gtk_accel_path "<Actions>/Common/TransportRecord" "R")
 (gtk_accel_path "<Actions>/Common/TransportGotoStart" "<Control>a")
 (gtk_accel_path "<Actions>/Common/TransportGotoEnd" "<Control>e")
 
+(gtk_accel_path "<Actions>/Editor/toggle-playback" "space")
+(gtk_accel_path "<Actions>/Editor/set-playhead" "p")
+(gtk_accel_path "<Actions>/Editor/set-edit-cursor" "e")
+(gtk_accel_path "<Actions>/Editor/undo" "<Control>z")
+(gtk_accel_path "<Actions>/Editor/redo" "<Control>r")
+
+
index 691d05685fe6196cd1e744eed030cdd67e27ae68..bfa1acaff7a6929e69a460da79c0b09ad58aebf1 100644 (file)
@@ -511,6 +511,13 @@ style "track_name_display"
        bg[ACTIVE] = { 0.26, 0.26, 0.26 }
 }
 
+style "active_track_name_display"
+{
+       font_name = "sans medium 10"
+       text[NORMAL] = { 0.26, 0.26, 0.26 }
+       base[NORMAL] = { 0.89, 0.89, 0.89 }
+}
+
 style "track_separator"
 {
        bg[NORMAL] = { 0.40, 0.40, 0.40 }
@@ -993,6 +1000,8 @@ widget "*TrackEditIndicator6*" style "edit_group_3"
 widget "*TrackEditIndicator7*" style "edit_group_3"
 widget "*EditorTrackNameDisplay" style "track_name_display"
 widget "*EditorTrackNameDisplay*" style "track_name_display"
+widget "*EditorActiveTrackNameDisplay" style "active_track_name_display"
+widget "*EditorActiveTrackNameDisplay*" style "active_track_name_display"
 widget "*EditorRegionList" style "region_list_display"
 widget "*CrossfadeEditAuditionButton" style "red_when_active"
 widget "*CrossfadeEditAuditionButton*" style "red_when_active"
index c3063b6ed5bdec6eb8b817b5cb716bcb63880518..903cc0276c0deabb0f571d559afec4eec3c9179c 100644 (file)
@@ -358,10 +358,7 @@ ARDOUR_UI::setup_transport ()
        ARDOUR_UI::Clock.connect (bind (mem_fun (secondary_clock, &AudioClock::set), false));
 
        primary_clock.set_mode (AudioClock::SMPTE);
-       primary_clock.set_name ("TransportClockDisplay");
        secondary_clock.set_mode (AudioClock::BBT);
-       secondary_clock.set_name ("TransportClockDisplay");
-
 
        primary_clock.ValueChanged.connect (mem_fun(*this, &ARDOUR_UI::primary_clock_value_changed));
        secondary_clock.ValueChanged.connect (mem_fun(*this, &ARDOUR_UI::secondary_clock_value_changed));
index 83d8f6644cd84cc562a927f4930825fc3e4774e8..550b7c311f344e0472d4cc0f0d95e3b97e50fee8 100644 (file)
@@ -296,23 +296,39 @@ AudioClock::setup_events ()
        ms_hours_ebox.signal_focus_out_event().connect (bind (mem_fun(*this, &AudioClock::field_focus_out_event), MS_Hours));
        ms_minutes_ebox.signal_focus_out_event().connect (bind (mem_fun(*this, &AudioClock::field_focus_out_event), MS_Minutes));
        ms_seconds_ebox.signal_focus_out_event().connect (bind (mem_fun(*this, &AudioClock::field_focus_out_event), MS_Seconds));
-
-       Gtkmm2ext::set_size_request_to_display_given_text (hours_label, "-88", 0, 2);
-       Gtkmm2ext::set_size_request_to_display_given_text (minutes_label, "88", 0, 2);
-       Gtkmm2ext::set_size_request_to_display_given_text (seconds_label, "88", 0, 2);
-       Gtkmm2ext::set_size_request_to_display_given_text (frames_label, "88", 0, 2);
-
-       Gtkmm2ext::set_size_request_to_display_given_text (bars_label, "-888", 0, 2);
-       Gtkmm2ext::set_size_request_to_display_given_text (beats_label, "88", 0, 2);
-       Gtkmm2ext::set_size_request_to_display_given_text (ticks_label, "8888", 0, 2);
-
-       Gtkmm2ext::set_size_request_to_display_given_text (audio_frames_label, "4294967296", 0, 2);
 }
 
 void
 AudioClock::on_realize ()
 {
        HBox::on_realize ();
+
+       /* styles are not available until the widgets are bound to a window */
+
+       switch (_mode) {
+       case SMPTE:
+               Gtkmm2ext::set_size_request_to_display_given_text (hours_label, "-88", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (minutes_label, "88", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (seconds_label, "88", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (frames_label, "88", 0, 2);
+               break;
+
+       case BBT:
+               Gtkmm2ext::set_size_request_to_display_given_text (bars_label, "-888", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (beats_label, "88", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (ticks_label, "8888", 0, 2);
+               break;
+
+       case MinSec:
+               Gtkmm2ext::set_size_request_to_display_given_text (ms_hours_label, "99", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (ms_minutes_label, "99", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (ms_seconds_label, "99", 0, 2);
+               break;
+
+       case Frames:
+               Gtkmm2ext::set_size_request_to_display_given_text (audio_frames_label, "4294967296", 0, 2);
+
+       }
 }
 
 void
@@ -469,7 +485,7 @@ AudioClock::set_session (Session *s)
        }
 }
 
-gint
+bool
 AudioClock::field_key_release_event (GdkEventKey *ev, Field field)
 {
        Label *label = 0;
@@ -693,7 +709,7 @@ AudioClock::field_key_release_event (GdkEventKey *ev, Field field)
        return TRUE;
 }
 
-gint
+bool
 AudioClock::field_focus_in_event (GdkEventFocus *ev, Field field)
 {
        key_entry_state = 0;
@@ -750,7 +766,7 @@ AudioClock::field_focus_in_event (GdkEventFocus *ev, Field field)
        return FALSE;
 }
 
-gint
+bool
 AudioClock::field_focus_out_event (GdkEventFocus *ev, Field field)
 {
        switch (field) {
@@ -807,7 +823,7 @@ AudioClock::field_focus_out_event (GdkEventFocus *ev, Field field)
        return FALSE;
 }
 
-gint
+bool
 AudioClock::field_button_release_event (GdkEventButton *ev, Field field)
 {
 
@@ -887,7 +903,7 @@ AudioClock::field_button_release_event (GdkEventButton *ev, Field field)
        return TRUE;
 }
 
-gint
+bool
 AudioClock::field_button_press_event (GdkEventButton *ev, Field field)
 {
        if (session == 0) return FALSE;
@@ -964,7 +980,7 @@ AudioClock::field_button_press_event (GdkEventButton *ev, Field field)
        return TRUE;
 }
 
-gint
+bool
 AudioClock::field_motion_notify_event (GdkEventMotion *ev, Field field)
 {
        if (session == 0 || !dragging) {
@@ -1675,20 +1691,36 @@ AudioClock::set_mode (Mode m)
        switch (_mode) {
        case SMPTE:
                clock_base.add (smpte_packer_hbox);
+               Gtkmm2ext::set_size_request_to_display_given_text (hours_label, "-88", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (minutes_label, "88", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (seconds_label, "88", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (frames_label, "88", 0, 2);
                break;
+
        case BBT:
                clock_base.add (bbt_packer_hbox);
+               Gtkmm2ext::set_size_request_to_display_given_text (bars_label, "-888", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (beats_label, "88", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (ticks_label, "8888", 0, 2);
                break;
+
        case MinSec:
                clock_base.add (minsec_packer_hbox);
+               Gtkmm2ext::set_size_request_to_display_given_text (ms_hours_label, "99", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (ms_minutes_label, "99", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (ms_seconds_label, "99", 0, 2);
                break;
+
        case Frames:
                clock_base.add (frames_packer_hbox);
+               Gtkmm2ext::set_size_request_to_display_given_text (audio_frames_label, "4294967296", 0, 2);
+
        case Off:
                break;
        }
-       
+
        set (last_when, true);
        clock_base.show_all ();
        key_entry_state = 0;
 }
+
index 0f25eb884b9556fb4fa447bd569828b48a130394..dd06f7cf44f847f42cc042245458c1085dd40124 100644 (file)
@@ -150,12 +150,12 @@ class AudioClock : public Gtk::HBox
 
        void on_realize ();
        
-       gint field_motion_notify_event (GdkEventMotion *ev, Field);
-       gint field_button_press_event (GdkEventButton *ev, Field);
-       gint field_button_release_event (GdkEventButton *ev, Field);
-       gint field_key_release_event (GdkEventKey *, Field);
-       gint field_focus_in_event (GdkEventFocus *, Field);
-       gint field_focus_out_event (GdkEventFocus *, Field);
+       bool field_motion_notify_event (GdkEventMotion *ev, Field);
+       bool field_button_press_event (GdkEventButton *ev, Field);
+       bool field_button_release_event (GdkEventButton *ev, Field);
+       bool field_key_release_event (GdkEventKey *, Field);
+       bool field_focus_in_event (GdkEventFocus *, Field);
+       bool field_focus_out_event (GdkEventFocus *, Field);
 
        void set_smpte (jack_nframes_t, bool);
        void set_bbt (jack_nframes_t, bool);
index 1f7f813a47f1ece34ba9b2ef191f4f44b7df6483..0b0da6fe049d6b0b21948b753cb898c95071c7e6 100644 (file)
@@ -168,11 +168,6 @@ AudioTimeAxisView::AudioTimeAxisView (PublicEditor& ed, Session& sess, Route& rt
        visual_button.signal_clicked().connect (mem_fun(*this, &AudioTimeAxisView::visual_click));
        hide_button.signal_clicked().connect (mem_fun(*this, &AudioTimeAxisView::hide_click));
 
-       name_entry.signal_activate().connect (mem_fun(*this, &AudioTimeAxisView::name_entry_activated));
-       name_entry.signal_button_press_event().connect (mem_fun(*this, &AudioTimeAxisView::name_entry_button_press_handler));
-       name_entry.signal_button_release_event().connect (mem_fun(*this, &AudioTimeAxisView::name_entry_button_release_handler));
-       name_entry.signal_key_release_event().connect (mem_fun(*this, &AudioTimeAxisView::name_entry_key_release_handler));
-       
        if (is_audio_track()) {
                controls_table.attach (*rec_enable_button, 6, 7, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
        }
@@ -1090,45 +1085,6 @@ AudioTimeAxisView::playlist () const
        }
 }
 
-gint 
-AudioTimeAxisView::name_entry_button_press_handler (GdkEventButton *ev)
-{
-       if (ev->button == 3) {
-               return stop_signal (name_entry, "button_press_event");
-       }
-       return FALSE;
-}
-
-gint 
-AudioTimeAxisView::name_entry_button_release_handler (GdkEventButton *ev)
-{
-       return FALSE;
-}
-
-gint
-AudioTimeAxisView::name_entry_key_release_handler (GdkEventKey* ev)
-{
-       switch (ev->keyval) {
-       case GDK_Tab:
-       case GDK_Up:
-       case GDK_Down:
-               name_entry_changed ();
-               return TRUE;
-
-       default:
-               return FALSE;
-       }
-}
-
-void
-AudioTimeAxisView::name_entry_activated ()
-{
-       /* this should drop focus from the entry,
-          and cause a call to name_entry_changed()
-       */
-       controls_ebox.grab_focus();
-}
-
 void
 AudioTimeAxisView::name_entry_changed ()
 {
index 6f4405b5a75eb74670c28ec2f6654892f05f5051..cec7d3c089e261bfc6467935b895b720dad99590 100644 (file)
@@ -178,11 +178,8 @@ class AudioTimeAxisView : public RouteUI, public TimeAxisView
 
        void take_name_changed (void *);
        void route_name_changed (void *);
-       void name_entry_activated ();
        void name_entry_changed ();
-       gint name_entry_key_release_handler (GdkEventKey*);
-       gint name_entry_button_release_handler (GdkEventButton*);
-       gint name_entry_button_press_handler (GdkEventButton*);
+
        void on_area_realize ();
 
        virtual void label_view ();
index 3e8402bbca1534f21590944f1db93d7b4458bfc8..324584330421ae6ea0ba87d9cfb1b356586d7396 100644 (file)
@@ -147,6 +147,66 @@ Gdk::Cursor* Editor::speaker_cursor = 0;
 Gdk::Cursor* Editor::wait_cursor = 0;
 Gdk::Cursor* Editor::timebar_cursor = 0;
 
+bool
+Editor::on_key_press_event (GdkEventKey* ev)
+{
+       GtkWindow* win = gobj();
+
+       /* This exists to allow us to override the way GTK handles
+          key events. The normal sequence is:
+
+          a) event is delivered to a GtkWindow
+          b) accelerators/mnemonics are activated
+          c) if (b) didn't handle the event, propagate to
+              the focus widget and/or focus chain
+
+          The problem with this is that if the accelerators include
+          keys without modifiers, such as the space bar or the 
+          letter "e", then pressing the key while typing into
+          a text entry widget results in the accelerator being
+          activated, instead of the desired letter appearing
+          in the text entry.
+
+          There is no good way of fixing this, but this
+          represents a compromise. The idea is that 
+          key events involving modifiers (not Shift)
+          get routed into the activation pathway first, then
+          get propagated to the focus widget if necessary.
+          
+          If the key event doesn't involve modifiers,
+          we deliver to the focus widget first, thus allowing
+          it to get "normal text" without interference
+          from acceleration.
+
+          Of course, this can also be problematic: if there
+          is a widget with focus, then it will swallow
+          all "normal text" accelerators.
+       */
+
+       if (ev->state & ~Gdk::SHIFT_MASK) {
+               /* modifiers in effect, accelerate first */
+               if (!gtk_window_activate_key (win, ev)) {
+                       return gtk_window_propagate_key_event (win, ev);
+               } else {
+                       return true;
+               } 
+       }
+       
+       /* no modifiers, propagate first */
+       
+       if (!gtk_window_propagate_key_event (win, ev)) {
+               return gtk_window_activate_key (win, ev);
+       } 
+
+       return true;
+}
+
+void
+show_me_the_size (Requisition* r, const char* what)
+{
+       cerr << "size of " << what << " = " << r->width << " x " << r->height << endl;
+}
+
 Editor::Editor (AudioEngine& eng) 
        : engine (eng),
 
@@ -163,8 +223,13 @@ Editor::Editor (AudioEngine& eng)
          transport_mark_label (_("Loop/Punch Ranges")),
 
          edit_packer (3, 3, false),
-         edit_hscroll_left_arrow (Gtk::ARROW_LEFT, Gtk::SHADOW_OUT),
-         edit_hscroll_right_arrow (Gtk::ARROW_RIGHT, Gtk::SHADOW_OUT),
+
+         /* the values here don't matter: layout widgets
+            reset them as needed.
+         */
+
+         vertical_adjustment (0.0, 0.0, 400.0, 10),
+         horizontal_adjustment (0.0, 0.0, 1200.0, 20),
 
          /* tool bar related */
 
@@ -262,6 +327,7 @@ Editor::Editor (AudioEngine& eng)
        _xfade_visibility = true;
        editor_ruler_menu = 0;
        no_ruler_shown_update = false;
+       edit_hscroll_dragging = false;
        edit_group_list_menu = 0;
        route_list_menu = 0;
        region_list_menu = 0;
@@ -277,7 +343,6 @@ Editor::Editor (AudioEngine& eng)
        region_edit_menu_split_item = 0;
        temp_location = 0;
        region_edit_menu_split_multichannel_item = 0;
-       edit_hscroll_dragging = false;
        leftmost_frame = 0;
        ignore_mouse_mode_toggle = false;
        current_stepping_trackview = 0;
@@ -309,45 +374,30 @@ Editor::Editor (AudioEngine& eng)
        initialize_rulers ();
        initialize_canvas ();
 
-       track_canvas_scroller.add (track_canvas);
-       track_canvas_scroller.set_policy (POLICY_NEVER, POLICY_NEVER);
-       track_canvas_scroller.set_name ("TrackCanvasScroller");
-
-       track_canvas_scroller.get_vadjustment()->signal_value_changed().connect (mem_fun(*this, &Editor::tie_vertical_scrolling));
-       track_canvas_scroller.get_vadjustment()->set_step_increment (10.0);
-
-       track_canvas_scroller.get_hadjustment()->set_lower (0.0);
-       track_canvas_scroller.get_hadjustment()->set_upper (1200.0);
-       track_canvas_scroller.get_hadjustment()->set_step_increment (20.0);
-       track_canvas_scroller.get_hadjustment()->signal_value_changed().connect (mem_fun(*this, &Editor::canvas_horizontally_scrolled));
-
-       edit_vscrollbar.set_adjustment(*track_canvas_scroller.get_vadjustment());
-       edit_hscrollbar.set_adjustment(*track_canvas_scroller.get_hadjustment());
-
-       edit_hscrollbar.signal_button_press_event().connect (mem_fun(*this, &Editor::hscroll_slider_button_press));
-       edit_hscrollbar.signal_button_release_event().connect (mem_fun(*this, &Editor::hscroll_slider_button_release));
-       edit_hscrollbar.signal_size_allocate().connect (mem_fun(*this, &Editor::hscroll_slider_allocate));
+       edit_controls_vbox.set_spacing (track_spacing);
+       horizontal_adjustment.signal_value_changed().connect (mem_fun(*this, &Editor::canvas_horizontally_scrolled));
+       vertical_adjustment.signal_value_changed().connect (mem_fun(*this, &Editor::tie_vertical_scrolling));
        
-       time_canvas_scroller.add (time_canvas);
-       time_canvas_scroller.set_policy (POLICY_NEVER, POLICY_NEVER);
-       time_canvas_scroller.set_hadjustment (*track_canvas_scroller.get_hadjustment());
-       time_canvas_scroller.set_name ("TimeCanvasScroller");
+       track_canvas.set_hadjustment (horizontal_adjustment);
+       track_canvas.set_vadjustment (vertical_adjustment);
+       time_canvas.set_hadjustment (horizontal_adjustment);
 
-       track_canvas_scroller.signal_map_event().connect (mem_fun (*this, &Editor::track_canvas_map_handler));
-       time_canvas_scroller.signal_map_event().connect (mem_fun (*this, &Editor::time_canvas_map_handler));
+       track_canvas.signal_map_event().connect (mem_fun (*this, &Editor::track_canvas_map_handler));
+       time_canvas.signal_map_event().connect (mem_fun (*this, &Editor::time_canvas_map_handler));
        
-       edit_controls_vbox.set_spacing (track_spacing);
-       edit_controls_hbox.pack_start (edit_controls_vbox, true, true);
-       edit_controls_scroller.add (edit_controls_hbox);
-       edit_controls_scroller.set_name ("EditControlsBase");
-       edit_controls_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_NEVER);
+       // edit_controls_hbox.pack_start (edit_controls_vbox, true, true);
+       controls_layout.add (edit_controls_vbox);
+       controls_layout.set_name ("EditControlsBase");
+       
+       controls_layout.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK);
+       controls_layout.signal_button_release_event().connect (mem_fun(*this, &Editor::edit_controls_button_release));
 
-       Viewport* viewport = static_cast<Viewport*> (edit_controls_scroller.get_child());
+       edit_vscrollbar.set_adjustment (vertical_adjustment);
+       edit_hscrollbar.set_adjustment (horizontal_adjustment);
 
-       viewport->set_shadow_type (Gtk::SHADOW_NONE);
-       viewport->set_name ("EditControlsBase");
-       viewport->add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK);
-       viewport->signal_button_release_event().connect (mem_fun(*this, &Editor::edit_controls_button_release));
+       edit_hscrollbar.signal_button_press_event().connect (mem_fun(*this, &Editor::hscrollbar_button_press));
+       edit_hscrollbar.signal_button_release_event().connect (mem_fun(*this, &Editor::hscrollbar_button_release));
+       edit_hscrollbar.signal_size_allocate().connect (mem_fun(*this, &Editor::hscrollbar_allocate));
 
        build_cursors ();
        setup_toolbar ();
@@ -358,7 +408,7 @@ Editor::Editor (AudioEngine& eng)
        time_canvas_vbox.pack_start (*smpte_ruler, false, false);
        time_canvas_vbox.pack_start (*frames_ruler, false, false);
        time_canvas_vbox.pack_start (*bbt_ruler, false, false);
-       time_canvas_vbox.pack_start (time_canvas_scroller, true, true);
+       time_canvas_vbox.pack_start (time_canvas, true, true);
        time_canvas_vbox.set_size_request (-1, (int)(timebar_height * visible_timebars));
 
        bbt_label.set_name ("EditorTimeButton");
@@ -416,25 +466,24 @@ Editor::Editor (AudioEngine& eng)
           for the canvas areas.
        */
 
-       track_canvas_event_box.add (track_canvas_scroller);
+       track_canvas_event_box.add (track_canvas);
 
        time_canvas_event_box.add (time_canvas_vbox);
        time_canvas_event_box.set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK);
-
        
        edit_packer.set_col_spacings (0);
        edit_packer.set_row_spacings (0);
        edit_packer.set_homogeneous (false);
        edit_packer.set_name ("EditorWindow");
 
-       edit_packer.attach (edit_hscrollbar,            1, 2, 0, 1,    FILL|EXPAND,  FILL, 0, 0);
+       edit_packer.attach (edit_hscrollbar,         1, 2, 0, 1,    FILL|EXPAND,  FILL, 0, 0);
 
-       edit_packer.attach (time_button_event_box,          0, 1, 1, 2,    FILL, FILL, 0, 0);
-       edit_packer.attach (time_canvas_event_box,          1, 2, 1, 2,    FILL|EXPAND, FILL, 0, 0);
+       edit_packer.attach (time_button_event_box,   0, 1, 1, 2,    FILL,        FILL, 0, 0);
+       edit_packer.attach (time_canvas_event_box,   1, 2, 1, 2,    FILL|EXPAND, FILL, 0, 0);
 
-       edit_packer.attach (edit_controls_scroller,         0, 1, 2, 3,    FILL,FILL, 0, 0);
-       edit_packer.attach (track_canvas_event_box,         1, 2, 2, 3,    FILL|EXPAND, FILL|EXPAND, 0, 0);
-       edit_packer.attach (edit_vscrollbar,                2, 3, 2, 3,    FILL,        FILL|EXPAND, 0, 0);
+       edit_packer.attach (controls_layout,         0, 1, 2, 3,    FILL,        FILL, 0, 0);
+       edit_packer.attach (track_canvas_event_box,  1, 2, 2, 3,    FILL|EXPAND, FILL|EXPAND, 0, 0);
+       edit_packer.attach (edit_vscrollbar,         2, 3, 2, 3,    FILL,        FILL|EXPAND, 0, 0);
 
        edit_frame.set_name ("BaseFrame");
        edit_frame.set_shadow_type (SHADOW_IN);
@@ -761,9 +810,9 @@ Editor::show_window ()
 void
 Editor::tie_vertical_scrolling ()
 {
-       edit_controls_scroller.get_vadjustment()->set_value (track_canvas_scroller.get_vadjustment()->get_value());
+       double y1 = vertical_adjustment.get_value();
+       controls_layout.get_vadjustment()->set_value (y1);
 
-       float y1 = track_canvas_scroller.get_vadjustment()->get_value();
        playhead_cursor->set_y_axis(y1);
        edit_cursor->set_y_axis(y1);
 }
@@ -804,12 +853,11 @@ Editor::set_frames_per_unit (double fpu)
        */
        
        if (session) {
-               track_canvas_scroller.get_hadjustment()->set_upper (session->current_end_frame() / frames_per_unit);
+               horizontal_adjustment.set_upper (session->current_end_frame() / frames_per_unit);
        }
        
        if (!no_zoom_repos_update) {
-               track_canvas_scroller.get_hadjustment()->set_value (leftmost_frame/frames_per_unit);
-               update_hscroller ();
+               horizontal_adjustment.set_value (leftmost_frame/frames_per_unit);
                update_fixed_rulers ();
                tempo_map_changed (Change (0));
        }
@@ -849,10 +897,10 @@ Editor::reposition_x_origin (jack_nframes_t frame)
        if (frame != leftmost_frame) {
                leftmost_frame = frame;
                double pixel = frame_to_pixel (frame);
-               if (pixel >= track_canvas_scroller.get_hadjustment()->get_upper()) {
-                       track_canvas_scroller.get_hadjustment()->set_upper (frame_to_pixel (frame + (current_page_frames())));
+               if (pixel >= horizontal_adjustment.get_upper()) {
+                       horizontal_adjustment.set_upper (frame_to_pixel (frame + (current_page_frames())));
                }
-               track_canvas_scroller.get_hadjustment()->set_value (frame/frames_per_unit);
+               horizontal_adjustment.set_value (frame/frames_per_unit);
                XOriginChanged (); /* EMIT_SIGNAL */
        }
 }
@@ -889,14 +937,8 @@ Editor::zoom_adjustment_changed ()
 void 
 Editor::canvas_horizontally_scrolled ()
 {
-       /* XXX note the potential loss of accuracy here caused by
-          adjustments being 32bit floats with only a 24 bit mantissa,
-          whereas jack_nframes_t is at least a 32 bit uint32_teger.
-       */
-       
-       leftmost_frame = (jack_nframes_t) floor (track_canvas_scroller.get_hadjustment()->get_value() * frames_per_unit);
+       leftmost_frame = (jack_nframes_t) floor (horizontal_adjustment.get_value() * frames_per_unit);
        
-       update_hscroller ();
        update_fixed_rulers ();
        
        if (!edit_hscroll_dragging) {
@@ -1060,11 +1102,9 @@ Editor::handle_new_duration ()
        reset_scrolling_region ();
 
        if (session) {
-               track_canvas_scroller.get_hadjustment()->set_upper (session->current_end_frame() / frames_per_unit);
-               track_canvas_scroller.get_hadjustment()->set_value (leftmost_frame/frames_per_unit);
+               horizontal_adjustment.set_upper (session->current_end_frame() / frames_per_unit);
+               horizontal_adjustment.set_value (leftmost_frame/frames_per_unit);
        }
-       
-       update_hscroller ();
 }
 
 void
@@ -1231,10 +1271,9 @@ Editor::connect_to_session (Session *t)
 
        leftmost_frame = 0;
        
-       track_canvas_scroller.get_hadjustment()->set_upper (session->current_end_frame() / frames_per_unit);
-       track_canvas_scroller.get_hadjustment()->set_value (0);
+       horizontal_adjustment.set_upper (session->current_end_frame() / frames_per_unit);
+       horizontal_adjustment.set_value (0);
 
-       update_hscroller ();
        restore_ruler_visibility ();
        tempo_map_changed (Change (0));
 
@@ -2047,8 +2086,7 @@ Editor::set_state (const XMLNode& node)
        }
 
        set_default_size(width, height);
-       // GTK2FIX
-       // set_position(x, y-yoff);
+       move (x, y-yoff);
 
        if ((prop = node.property ("zoom-focus"))) {
                set_zoom_focus ((ZoomFocus) atoi (prop->value()));
@@ -3584,27 +3622,6 @@ Editor::point_selection_changed ()
        }
 }
 
-void
-Editor::run_sub_event_loop ()
-{
-       sub_event_loop_status = 0;
-       Main::run ();
-}
-
-void
-Editor::finish_sub_event_loop (int status)
-{
-       Main::quit ();
-       sub_event_loop_status = status;
-}
-
-gint
-Editor::finish_sub_event_loop_on_delete (GdkEventAny *ignored, int32_t status)
-{
-       finish_sub_event_loop (status);
-       return TRUE;
-}
-
 gint
 Editor::mouse_select_button_release (GdkEventButton* ev)
 {
@@ -3816,7 +3833,7 @@ void
 Editor::end_location_changed (Location* location)
 {
        ENSURE_GUI_THREAD (bind (mem_fun(*this, &Editor::end_location_changed), location));
-       track_canvas_scroller.get_hadjustment()->set_upper (location->end() / frames_per_unit);
+       horizontal_adjustment.set_upper (location->end() / frames_per_unit);
 }
 
 int
index 7ce050fc87f74629502c5b171ad3a5ba724f7b7c..446a861a9677c860379c11ca8218dcd68cb7f93a 100644 (file)
@@ -638,49 +638,21 @@ class Editor : public PublicEditor
        Gtk::Frame          edit_frame;
        Gtk::VScrollbar     edit_vscrollbar;
 
-       /* the horizontal scroller works in a rather different way
-          than a regular scrollbar, since its used for
-          zoom control/indication as well. But more importantly,
-          its different components (slider, left arrow, right arrow) 
-          have to be packed separately into the edit_packer.
-       */
+       Gtk::Adjustment     vertical_adjustment;
+       Gtk::Adjustment     horizontal_adjustment;
+
+       Gtk::Layout         controls_layout;
 
        Gtk::HScrollbar     edit_hscrollbar;
-       Gtk::DrawingArea    edit_hscroll_slider;
-       Gtk::Arrow          edit_hscroll_left_arrow;
-       Gtk::Arrow          edit_hscroll_right_arrow;
-       Gtk::EventBox       edit_hscroll_left_arrow_event;
-       Gtk::EventBox       edit_hscroll_right_arrow_event;
-       gint                edit_hscroll_slider_width;
-       gint                edit_hscroll_slider_height;
-       static const gint   edit_hscroll_edge_width = 3;
        bool                edit_hscroll_dragging;
-       double              edit_hscroll_drag_last;
-       
-       void hscroll_slider_allocate (Gtk::Allocation &);
-       gint hscroll_slider_expose (GdkEventExpose*);
-       gint hscroll_slider_button_press (GdkEventButton*);
-       gint hscroll_slider_button_release (GdkEventButton*);
-       gint hscroll_slider_motion (GdkEventMotion*);
-
-       gint hscroll_trough_expose (GdkEventExpose*);
-       gint hscroll_trough_button_press (GdkEventButton*);
-       gint hscroll_trough_button_release (GdkEventButton*);
-
-       void update_hscroller ();
-
-       gint hscroll_left_arrow_button_press (GdkEventButton *);
-       gint hscroll_left_arrow_button_release (GdkEventButton *);
-       gint hscroll_right_arrow_button_press (GdkEventButton *);
-       gint hscroll_right_arrow_button_release (GdkEventButton *);
        
+       bool hscrollbar_button_press (GdkEventButton*);
+       bool hscrollbar_button_release (GdkEventButton*);
+       void hscrollbar_allocate (Gtk::Allocation &alloc);
+
        double canvas_width;
        double canvas_height;
 
-       Gtk::ScrolledWindow  track_canvas_scroller;
-       Gtk::ScrolledWindow  time_canvas_scroller;
-       Gtk::ScrolledWindow  edit_controls_scroller;
-
        bool track_canvas_map_handler (GdkEventAny*);
        bool time_canvas_map_handler (GdkEventAny*);
 
@@ -1134,9 +1106,6 @@ class Editor : public PublicEditor
 
        /* Canvas event handlers */
 
-       // FIXED FOR GTK2
-
-
        bool canvas_control_point_event (GdkEvent* event,ArdourCanvas::Item*, ControlPoint*);
        bool canvas_line_event (GdkEvent* event,ArdourCanvas::Item*, AutomationLine*);
        bool canvas_selection_rect_event (GdkEvent* event,ArdourCanvas::Item*, SelectionRect*);
@@ -1208,13 +1177,6 @@ class Editor : public PublicEditor
        void reset_scrolling_region (Gtk::Allocation* alloc = 0);
        void scroll_canvas ();
 
-        /* sub-event loop handling */
-
-        int32_t sub_event_loop_status;
-        void run_sub_event_loop ();
-        void finish_sub_event_loop (int status);
-        gint finish_sub_event_loop_on_delete (GdkEventAny*, int32_t status);
-       
        /* display control */
        
        bool _show_measures;
@@ -1586,10 +1548,9 @@ class Editor : public PublicEditor
        ExportDialog *export_dialog;
        void export_range (jack_nframes_t start, jack_nframes_t end);
 
-       int write_region_selection(AudioRegionSelection&);
+       int  write_region_selection(AudioRegionSelection&);
        bool write_region (string path, ARDOUR::AudioRegion&);
        void export_region ();
-       void write_a_region ();
        void bounce_region_selection ();
        void bounce_range_selection ();
        void external_edit_region ();
@@ -1808,6 +1769,8 @@ class Editor : public PublicEditor
        
        typedef std::map<Editing::ColorID,std::string> ColorStyleMap;
        void init_colormap ();
+
+       bool on_key_press_event (GdkEventKey*);
 };
 
 #endif /* __ardour_editor_h__ */
index b81013a9417400f79a8607ba13373b62fe240155..3c437cd4b07fc5c288bf7045dcb327cfd1a0d11e 100644 (file)
@@ -89,8 +89,8 @@ Editor::register_actions ()
        ActionManager::register_action (editor_actions, "set-playhead", _("set playhead"), mem_fun(*this, &Editor::kbd_set_playhead_cursor));
        ActionManager::register_action (editor_actions, "set-edit-cursor", _("set edit cursor"), mem_fun(*this, &Editor::kbd_set_edit_cursor));
 
-       ActionManager::register_action (editor_actions, "set-undo", _("set undo"), bind (mem_fun(*this, &Editor::undo), 1U));
-       ActionManager::register_action (editor_actions, "set-redo", _("set redo"), bind (mem_fun(*this, &Editor::redo), 1U));
+       ActionManager::register_action (editor_actions, "undo", _("undo"), bind (mem_fun(*this, &Editor::undo), 1U));
+       ActionManager::register_action (editor_actions, "redo", _("redo"), bind (mem_fun(*this, &Editor::redo), 1U));
 
        ActionManager::register_action (editor_actions, "export-session", _("export session"), mem_fun(*this, &Editor::export_session));
        ActionManager::register_action (editor_actions, "export-range", _("export range"), mem_fun(*this, &Editor::export_selection));
index 1e02d34ce9216bd370859b9a01ae9da1299f46f1..993ad24006de8d5b59411b86f34b44bef5568414 100644 (file)
@@ -304,10 +304,7 @@ Editor::track_canvas_allocate (Gtk::Allocation alloc)
        edit_cursor->set_position (edit_cursor->current_frame);
        playhead_cursor->set_position (playhead_cursor->current_frame);
 
-       double last_canvas_unit = ceil ((double) max_frames / frames_per_unit);
-       
-       track_canvas.set_scroll_region ( 0.0, 0.0, max (last_canvas_unit, canvas_width), canvas_height);
-       time_canvas.set_scroll_region ( 0.0, 0.0, max (last_canvas_unit, canvas_width), canvas_height);
+       reset_scrolling_region ();
 
        if (edit_cursor) edit_cursor->set_length (canvas_height);
        if (playhead_cursor) playhead_cursor->set_length (canvas_height);
@@ -357,19 +354,41 @@ Editor::track_canvas_allocate (Gtk::Allocation alloc)
 void
 Editor::reset_scrolling_region (Gtk::Allocation* alloc)
 {
+       TreeModel::Children rows = route_display_model->children();
+       TreeModel::Children::iterator i;
+       double pos;
+       
+        for (pos = 0, i = rows.begin(); i != rows.end(); ++i) {
+               TimeAxisView *tv = (*i)[route_display_columns.tv];
+               pos += tv->effective_height;
+       }
+
+       RefPtr<Gdk::Screen> screen = get_screen();
+
+       if (!screen) {
+               screen = Gdk::Screen::get_default();
+       }
+
+       edit_controls_hbox.set_size_request (-1, min ((gint) pos, (screen->get_height() - 400)));
+       edit_controls_vbox.set_size_request (-1, min ((gint) pos, (screen->get_height() - 400)));
+       double last_canvas_unit = ceil ((double) max_frames / frames_per_unit);
+       track_canvas.set_scroll_region (0.0, 0.0, max (last_canvas_unit, canvas_width), pos);
+
+       // XXX what is the correct height value for the time canvas ? this overstates it
+       time_canvas.set_scroll_region ( 0.0, 0.0, max (last_canvas_unit, canvas_width), canvas_height);
 }
 
 bool
 Editor::track_canvas_map_handler (GdkEventAny* ev)
 {
-       track_canvas_scroller.get_window()->set_cursor (*current_canvas_cursor);
+       track_canvas.get_window()->set_cursor (*current_canvas_cursor);
        return false;
 }
 
 bool
 Editor::time_canvas_map_handler (GdkEventAny* ev)
 {
-       time_canvas_scroller.get_window()->set_cursor (*timebar_cursor);
+       time_canvas.get_window()->set_cursor (*timebar_cursor);
        return false;
 }
 
index a68a94a4e8c105aab08b342ff83b5a81f507e34a..8b498f000091edc9bfe457b68413869406c0815f 100644 (file)
@@ -94,33 +94,6 @@ Editor::export_region ()
        dialog->start_export();
 }
 
-void
-Editor::write_a_region ()
-{
-       if (clicked_regionview == 0) {
-               return;
-       }
-
-       FileSelection file_selector;
-
-       file_selector.get_selection_entry()->signal_activate().connect (sigc::bind (mem_fun(*this, &Editor::finish_sub_event_loop), 1));
-       file_selector.get_cancel_button()->signal_clicked().connect (bind (mem_fun(*this, &Editor::finish_sub_event_loop), -1));
-       file_selector.get_ok_button()->signal_clicked().connect (bind (mem_fun(*this, &Editor::finish_sub_event_loop), 1));
-       file_selector.signal_delete_event().connect (bind (mem_fun(*this, &Editor::finish_sub_event_loop_on_delete), -1));
-
-       file_selector.show_all();
-
-       run_sub_event_loop ();
-       
-       if (sub_event_loop_status == 1) {
-               string path = file_selector.get_filename();
-               printf ("got region: %s\n", path.c_str());
-               if (path.length()) {
-                       write_region (path, clicked_regionview->region);
-               } 
-       }
-}
-
 int
 Editor::write_region_selection (AudioRegionSelection& regions)
 {
index d918983f94c45c823c44813b1e92c84bf727246e..049f19b85fa91d2596a45e317a69e52702240569 100644 (file)
@@ -26,244 +26,32 @@ using namespace std;
 using namespace ARDOUR;
 
 void
-Editor::hscroll_slider_allocate (Gtk::Allocation &alloc)
+Editor::hscrollbar_allocate (Gtk::Allocation &alloc)
 {
-       //edit_hscroll_slider_width = alloc->width;
-       //edit_hscroll_slider_height = alloc->height ;
-
-       if (session) {
-               track_canvas_scroller.get_hadjustment()->set_upper (session->current_end_frame() / frames_per_unit);
-       }
-
-}
-
-gint
-Editor::hscroll_slider_expose (GdkEventExpose *ev)
-{
-       GdkRectangle draw_rect;
-       GdkRectangle bar_rect;
-       gint bar_max = edit_hscroll_slider_width - 2;
-
-       bar_rect.y = 1;
-       bar_rect.height = edit_hscroll_slider_height - 2;
-
        if (session) {
-               bar_rect.width = (gint) floor (bar_max * ((canvas_width * frames_per_unit) / session->current_end_frame()));
-
-               if (bar_rect.width > bar_max) {
-                       bar_rect.x = 1;
-                       bar_rect.width = bar_max;
-               } else {
-                       bar_rect.x = 1 + (gint) floor (bar_max * ((double) leftmost_frame / session->current_end_frame()));
-               }
-               
-       } else {
-               bar_rect.x = 1;
-               bar_rect.width = bar_max;
+               horizontal_adjustment.set_upper (session->current_end_frame() / frames_per_unit);
        }
 
-       /* make sure we can see the bar at all times, and have enough to do zoom-trim on */
-
-       bar_rect.width = max ((guint16) (edit_hscroll_edge_width+5), (guint16) bar_rect.width);
-
-       gdk_rectangle_intersect (&ev->area, &bar_rect, &draw_rect);
-
-       gtk_paint_box (edit_hscroll_slider.get_style()->gobj(),
-                      edit_hscroll_slider.get_window()->gobj(),
-                      GTK_STATE_ACTIVE, 
-                      GTK_SHADOW_IN, 
-                      &ev->area, 
-                      GTK_WIDGET(edit_hscroll_slider.gobj()),
-                      "trough",
-                      0, 0, -1, -1);
-
-       gtk_paint_box (edit_hscroll_slider.get_style()->gobj(),
-                      edit_hscroll_slider.get_window()->gobj(),
-                      GTK_STATE_NORMAL, 
-                      GTK_SHADOW_OUT, 
-                      &draw_rect,
-                      GTK_WIDGET(edit_hscroll_slider.gobj()),
-                      "hscale",
-                      bar_rect.x, bar_rect.y, bar_rect.width, bar_rect.height);
-
-
-       return TRUE;
 }
 
-gint
-Editor::hscroll_slider_button_press (GdkEventButton *ev)
+bool
+Editor::hscrollbar_button_press (GdkEventButton *ev)
 {
-       if (!session) {
-               return TRUE;
-       }
-
        edit_hscroll_dragging = true;
-       //cerr << "PRESS" << endl;
-
-       return TRUE;
-       
-       gint start;
-       gint width;
-       gint end;
-       gint x;
-
-       start = (gint) floor (edit_hscroll_slider_width * ((double) leftmost_frame / session->current_end_frame()));
-       width = (gint) floor (edit_hscroll_slider_width * ((canvas_width * frames_per_unit) / session->current_end_frame()));
-
-       end = start + width - 1;
-       x = (gint) max (0.0, ev->x);
-       
-       if (x >= start && x <= end) {
-               
-               edit_hscroll_drag_last = x;
-               edit_hscroll_dragging = true;
-               edit_hscroll_slider.add_modal_grab();
-       }
-
-       return TRUE;
-}
-
-gint
-Editor::hscroll_slider_button_release (GdkEventButton *ev)
-{
-       if (!session) {
-               return TRUE;
-       }
-
-       gint start;
-       gint width;
-       gint end;
-       gint x;
-       gint bar_max = edit_hscroll_slider_width - 2;
-       jack_nframes_t new_leftmost = 0;
-
-       //cerr << "RELESAE" << endl;
-
-       if (edit_hscroll_dragging) {
-               // lets do a tempo redisplay now only, because it is dog slow
-               tempo_map_changed (Change (0));
-               edit_hscroll_dragging = false;
-       }
-       
-       return TRUE;
-
-       start = (gint) floor (bar_max * ((double) leftmost_frame / session->current_end_frame()));
-       width = (gint) floor (bar_max * ((canvas_width * frames_per_unit) / session->current_end_frame()));
-
-       end = start + width - 1;
-       x = (gint) max (0.0, ev->x);
-
-       if (!edit_hscroll_dragging) {
-
-               new_leftmost = (jack_nframes_t) floor (((double) x/bar_max) * session->current_end_frame());
-               reposition_x_origin (new_leftmost);
-       }
-
-       if (edit_hscroll_dragging) {
-               // lets do a tempo redisplay now only, because it is dog slow
-               tempo_map_changed (Change (0));
-               edit_hscroll_dragging = false;
-               edit_hscroll_slider.remove_modal_grab();
-       } 
-
-       return TRUE;
+       return true;
 }
 
-gint
-Editor::hscroll_slider_motion (GdkEventMotion *ev)
+bool
+Editor::hscrollbar_button_release (GdkEventButton *ev)
 {
-       gint x, y;
-       Gdk::ModifierType state;
-       gint bar_max = edit_hscroll_slider_width - 2;
-
-       if (!session || !edit_hscroll_dragging) {
-               return TRUE;
-       }
-
-       edit_hscroll_slider.get_window()->get_pointer (x, y, state);
-
-       jack_nframes_t new_frame;
-       jack_nframes_t frames;
-       double distance;
-       double fract;
-
-       distance = x - edit_hscroll_drag_last;
-       fract = fabs (distance) / bar_max;
-       frames = (jack_nframes_t) floor (session->current_end_frame() * fract);
-
-       if (distance < 0) {
-               if (leftmost_frame < frames) {
-                       new_frame = 0;
-               } else {
-                       new_frame = leftmost_frame - frames;
-               }
-       } else {
-               if (leftmost_frame > max_frames - frames) {
-                       new_frame = max_frames;
-               } else {
-                       new_frame = leftmost_frame + frames;
+       if (session) {
+               if (edit_hscroll_dragging) {
+                       // lets do a tempo redisplay only on button release, because it is dog slow
+                       tempo_map_changed (Change (0));
+                       edit_hscroll_dragging = false;
                }
        }
 
-       if (new_frame != leftmost_frame) {
-               reposition_x_origin (new_frame);
-       }
-
-       edit_hscroll_drag_last = x;
-       
-       return TRUE;
-}
-
-void
-Editor::update_hscroller ()
-{
-       //edit_hscroll_slider.queue_draw ();
-//     if (session) {
-//             track_canvas_scroller.get_hadjustment()->set_upper (session->current_end_frame() / frames_per_unit);
-//             track_canvas_scroller.get_hadjustment()->set_value (leftmost_frame/frames_per_unit);
-//     }
-}
-
-gint
-Editor::hscroll_left_arrow_button_press (GdkEventButton *ev)
-{
-       if (!session) {
-               return FALSE;
-       }
-
-       start_canvas_autoscroll (-1);
-       return TRUE;
-}
-
-gint
-Editor::hscroll_right_arrow_button_press (GdkEventButton *ev)
-{
-       if (!session) {
-               return FALSE;
-       }
-
-       start_canvas_autoscroll (1);
-       return TRUE;
+       return true;
 }
 
-gint
-Editor::hscroll_left_arrow_button_release (GdkEventButton *ev)
-{
-       if (!session) {
-               return FALSE;
-       }
-
-       stop_canvas_autoscroll ();
-       return TRUE;
-}
-
-gint
-Editor::hscroll_right_arrow_button_release (GdkEventButton *ev)
-{
-       if (!session) {
-               return FALSE;
-       }
-
-       stop_canvas_autoscroll ();
-       return TRUE;
-}
index 391a9972f0925c9799b671e898b0adbc5cad8648..4df43c1d7aa9d4ad3a2f5c052fd0fd612d84b2ba 100644 (file)
@@ -94,8 +94,10 @@ Editor::connect_to_image_compositor()
 void
 Editor::scroll_timeaxis_to_imageframe_item(const TimeAxisViewItem* item)
 {
-       jack_nframes_t offset = static_cast<jack_nframes_t>(frames_per_unit * (edit_hscroll_slider_width/2)) ;
-       
+       // GTK2FIX
+       //jack_nframes_t offset = static_cast<jack_nframes_t>(frames_per_unit * (edit_hscroll_slider_width/2)) ;
+       jack_nframes_t offset = 0;
+
        jack_nframes_t x_pos = 0 ;
        if(item->get_position() < offset)
        {
index 0ba4432391277c27f9bacc895df3b8adeff679bb..20dbea52cab21287fd728d738dc14ca82f2e0e6c 100644 (file)
@@ -34,10 +34,14 @@ Editor::kbd_driver (sigc::slot<void,GdkEvent*> theslot, bool use_track_canvas, b
        Glib::RefPtr<Gdk::Window> evw = track_canvas.get_window()->get_pointer (x, y, mask);
        bool doit = false;
 
+       cerr << "editor keyboard driver\n";
+
        if (use_track_canvas && track_canvas_event_box.get_window()->get_pointer(x, y, mask) != 0) {
+               cerr << "in track canvas\n";
                doit = true;
 
        } else if (use_time_canvas && time_canvas_event_box.get_window()->get_pointer(x, y, mask)!= 0) {
+               cerr << "in time canvas\n";
                doit = true;
        }
 
index 47982ff72897963d4cd0b01928ade70dd3fa3392..466aa09acd339239c0a76b399bdd7a637e08ecac 100644 (file)
@@ -730,8 +730,6 @@ Editor::marker_menu_rename ()
        
        Dialog dialog;
        Entry  entry;
-       Button ok_button (_("OK"));
-       Button cancel_button (_("Cancel"));
        
        if (loc->is_mark()) {
                dialog.set_title (_("ardour: rename mark"));
@@ -744,35 +742,24 @@ Editor::marker_menu_rename ()
        dialog.set_position (Gtk::WIN_POS_MOUSE);
        dialog.set_modal (true);
 
-       dialog.get_vbox()->set_border_width (10);
-       dialog.get_vbox()->pack_start (entry);
-       dialog.get_action_area()->pack_start (ok_button);
-       dialog.get_action_area()->pack_start (cancel_button);
+       dialog.add_action_widget (entry, RESPONSE_ACCEPT);
+       dialog.add_button (Stock::OK, RESPONSE_ACCEPT);
+       dialog.add_button (Stock::CANCEL, RESPONSE_ACCEPT);
 
        entry.set_text (loc->name());
        entry.set_name ("MarkerNameDisplay");
-       ok_button.set_name ("EditorGTKButton");
-       cancel_button.set_name ("EditorGTKButton");
-
-       entry.signal_activate().connect (bind (mem_fun(*this, &Editor::finish_sub_event_loop), 1));
-       cancel_button.signal_clicked().connect (bind (mem_fun(*this, &Editor::finish_sub_event_loop), -1));
-       ok_button.signal_clicked().connect (bind (mem_fun(*this, &Editor::finish_sub_event_loop), 1));
-       dialog.signal_delete_event().connect (bind (mem_fun(*this, &Editor::finish_sub_event_loop_on_delete), -1));
 
        dialog.show_all ();
        entry.grab_focus ();
 
-       run_sub_event_loop ();
-
-       if (sub_event_loop_status == 1) {
-
-               Location* l;
-               bool is_start;
-
-               if ((l = find_location_from_marker (marker, is_start)) != 0) {
-                       l->set_name (entry.get_text());
-               }
+       switch (dialog.run ()) {
+       case RESPONSE_ACCEPT:
+               break;
+       default:
+               return;
        }
+
+       loc->set_name (entry.get_text());
 }
 
 gint
index d95d4a3e4761c5e509a0c4999f5f041aefa31efd..c9c452ed443e2cf93c98700d2879a674b90a2554 100644 (file)
@@ -242,7 +242,7 @@ Editor::set_mouse_mode (MouseMode m, bool force)
        ignore_mouse_mode_toggle = false;
 
        if (is_drawable()) {
-               track_canvas_scroller.get_window()->set_cursor(*current_canvas_cursor);
+               track_canvas.get_window()->set_cursor(*current_canvas_cursor);
        }
 }
 
@@ -1141,7 +1141,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
                        show_verbose_canvas_cursor ();
 
                        if (is_drawable()) {
-                               track_canvas_scroller.get_window()->set_cursor (*fader_cursor);
+                               track_canvas.get_window()->set_cursor (*fader_cursor);
                        }
                }
                break;
@@ -1165,7 +1165,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
                show_verbose_canvas_cursor ();
                
                if (is_drawable()) {
-                       track_canvas_scroller.get_window()->set_cursor (*fader_cursor);
+                       track_canvas.get_window()->set_cursor (*fader_cursor);
                }
                break;
                
@@ -1175,7 +1175,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
                        if (line)
                                line->property_fill_color_rgba() = color_map[cEnteredGainLine];
                        if (is_drawable()) {
-                               track_canvas_scroller.get_window()->set_cursor (*fader_cursor);
+                               track_canvas.get_window()->set_cursor (*fader_cursor);
                        }
                }
                break;
@@ -1189,13 +1189,13 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
                                line->property_fill_color_rgba() = color_map[cEnteredAutomationLine];
                }
                if (is_drawable()) {
-                       track_canvas_scroller.get_window()->set_cursor (*fader_cursor);
+                       track_canvas.get_window()->set_cursor (*fader_cursor);
                }
                break;
                
        case AudioRegionViewNameHighlight:
                if (is_drawable() && mouse_mode == MouseObject) {
-                       track_canvas_scroller.get_window()->set_cursor (*trimmer_cursor);
+                       track_canvas.get_window()->set_cursor (*trimmer_cursor);
                }
                break;
 
@@ -1209,14 +1209,14 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
        /* </CMT Additions> */
 
                if (is_drawable()) {
-                       track_canvas_scroller.get_window()->set_cursor (*trimmer_cursor);
+                       track_canvas.get_window()->set_cursor (*trimmer_cursor);
                }
                break;
 
        case EditCursorItem:
        case PlayheadCursorItem:
                if (is_drawable()) {
-                       track_canvas_scroller.get_window()->set_cursor (*grabber_cursor);
+                       track_canvas.get_window()->set_cursor (*grabber_cursor);
                }
                break;
 
@@ -1226,7 +1226,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
 
                if (!reinterpret_cast<AudioRegionView *> (item->get_data ("regionview"))->name_active()) {
                        if (mouse_mode == MouseObject && is_drawable()) {
-                               track_canvas_scroller.get_window()->set_cursor (*trimmer_cursor);
+                               track_canvas.get_window()->set_cursor (*trimmer_cursor);
                        }
                } 
                break;
@@ -1247,7 +1247,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
                                break;
                        }
 
-                       track_canvas_scroller.get_window()->set_cursor (*cursor);
+                       track_canvas.get_window()->set_cursor (*cursor);
 
                        AutomationTimeAxisView* atv;
                        if ((atv = static_cast<AutomationTimeAxisView*>(item->get_data ("trackview"))) != 0) {
@@ -1263,7 +1263,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
        case MeterBarItem:
        case TempoBarItem:
                if (is_drawable()) {
-                       time_canvas_scroller.get_window()->set_cursor (*timebar_cursor);
+                       time_canvas.get_window()->set_cursor (*timebar_cursor);
                }
                break;
 
@@ -1276,7 +1276,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
        case MeterMarkerItem:
        case TempoMarkerItem:
                if (is_drawable()) {
-                       time_canvas_scroller.get_window()->set_cursor (*timebar_cursor);
+                       time_canvas.get_window()->set_cursor (*timebar_cursor);
                }
                break;
        case FadeInHandleItem:
@@ -1345,7 +1345,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
                }
                
                if (is_drawable()) {
-                       track_canvas_scroller.get_window()->set_cursor (*current_canvas_cursor);
+                       track_canvas.get_window()->set_cursor (*current_canvas_cursor);
                }
 
                hide_verbose_canvas_cursor ();
@@ -1363,7 +1363,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
        case MarkerViewHandleEndItem:
        /* </CMT Additions> */
                if (is_drawable()) {
-                       track_canvas_scroller.get_window()->set_cursor (*current_canvas_cursor);
+                       track_canvas.get_window()->set_cursor (*current_canvas_cursor);
                }
                break;
 
@@ -1378,7 +1378,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
                                line->property_fill_color_rgba() = al->get_line_color();
                }
                if (is_drawable()) {
-                       track_canvas_scroller.get_window()->set_cursor (*current_canvas_cursor);
+                       track_canvas.get_window()->set_cursor (*current_canvas_cursor);
                }
                break;
 
@@ -1386,7 +1386,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
                /* see enter_handler() for notes */
                if (!reinterpret_cast<AudioRegionView *> (item->get_data ("regionview"))->name_active()) {
                        if (is_drawable() && mouse_mode == MouseObject) {
-                               track_canvas_scroller.get_window()->set_cursor (*current_canvas_cursor);
+                               track_canvas.get_window()->set_cursor (*current_canvas_cursor);
                        }
                }
                break;
@@ -1397,7 +1397,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
        case TempoBarItem:
        case MarkerBarItem:
                if (is_drawable()) {
-                       time_canvas_scroller.get_window()->set_cursor (*timebar_cursor);
+                       time_canvas.get_window()->set_cursor (*timebar_cursor);
                }
                break;
                
@@ -1412,7 +1412,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
        case TempoMarkerItem:
                
                if (is_drawable()) {
-                       time_canvas_scroller.get_window()->set_cursor (*timebar_cursor);
+                       time_canvas.get_window()->set_cursor (*timebar_cursor);
                }
 
                break;
@@ -1431,7 +1431,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
 
        case AutomationTrackItem:
                if (is_drawable()) {
-                       track_canvas_scroller.get_window()->set_cursor (*current_canvas_cursor);
+                       track_canvas.get_window()->set_cursor (*current_canvas_cursor);
                        clear_entered_track = true;
                        Glib::signal_idle().connect (mem_fun(*this, &Editor::left_automation_track));
                }
@@ -3651,7 +3651,7 @@ Editor::drag_selection (ArdourCanvas::Item* item, GdkEvent* event)
                break;
        }
        
-       if (event->button.x >= track_canvas_scroller.get_hadjustment()->get_value() + canvas_width) {
+       if (event->button.x >= horizontal_adjustment.get_value() + canvas_width) {
                start_canvas_autoscroll (1);
        }
 
@@ -4183,7 +4183,7 @@ Editor::drag_range_markerbar_op (ArdourCanvas::Item* item, GdkEvent* event)
                break;          
        }
        
-       if (event->button.x >= track_canvas_scroller.get_hadjustment()->get_value() + canvas_width) {
+       if (event->button.x >= horizontal_adjustment.get_value() + canvas_width) {
                start_canvas_autoscroll (1);
        }
        
index 260d2ce387ec7daa4fcba8a9b3cf86ba6455f2b9..3190b04a45dce9468fb12f68be20dd1a07b13071 100644 (file)
@@ -973,8 +973,7 @@ Editor::scroll_tracks_down ()
                cnt = (int) floor (prefix);
        }
 
-       Gtk::Adjustment *adj = track_canvas_scroller.get_vadjustment();
-       adj->set_value (adj->get_value() + (cnt * adj->get_page_size()));
+       vertical_adjustment.set_value (vertical_adjustment.get_value() + (cnt * vertical_adjustment.get_page_size()));
 }
 
 void
@@ -990,8 +989,7 @@ Editor::scroll_tracks_up ()
                cnt = (int) floor (prefix);
        }
 
-       Gtk::Adjustment *adj = track_canvas_scroller.get_vadjustment();
-       adj->set_value (adj->get_value() - (cnt * adj->get_page_size()));
+       vertical_adjustment.set_value (vertical_adjustment.get_value() - (cnt * vertical_adjustment.get_page_size()));
 }
 
 void
@@ -2101,7 +2099,7 @@ Editor::embed_sndfile (string path, bool split, bool multiple_files, bool& check
                }
        }
 
-       track_canvas_scroller.get_window()->set_cursor (Gdk::Cursor (Gdk::WATCH));
+       track_canvas.get_window()->set_cursor (Gdk::Cursor (Gdk::WATCH));
        ARDOUR_UI::instance()->flush_pending ();
 
        /* make the proper number of channels in the region */
@@ -2149,7 +2147,7 @@ Editor::embed_sndfile (string path, bool split, bool multiple_files, bool& check
        }
 
   out:
-       track_canvas_scroller.get_window()->set_cursor (*current_canvas_cursor);
+       track_canvas.get_window()->set_cursor (*current_canvas_cursor);
 }
 
 void
@@ -2287,7 +2285,7 @@ Editor::insert_sndfile_into (string path, bool multi, AudioTimeAxisView* tv, jac
                return;
        }
 
-       track_canvas_scroller.get_window()->set_cursor (Gdk::Cursor (Gdk::WATCH));
+       track_canvas.get_window()->set_cursor (Gdk::Cursor (Gdk::WATCH));
        ARDOUR_UI::instance()->flush_pending ();
 
        /* make the proper number of channels in the region */
@@ -2330,7 +2328,7 @@ Editor::insert_sndfile_into (string path, bool multi, AudioTimeAxisView* tv, jac
        }
 
   out:
-       track_canvas_scroller.get_window()->set_cursor (*current_canvas_cursor);
+       track_canvas.get_window()->set_cursor (*current_canvas_cursor);
        return;
 }
 
@@ -2918,7 +2916,7 @@ Editor::freeze_route ()
 
        pthread_create (&itt.thread, 0, _freeze_thread, this);
 
-       track_canvas_scroller.get_window()->set_cursor (Gdk::Cursor (Gdk::WATCH));
+       track_canvas.get_window()->set_cursor (Gdk::Cursor (Gdk::WATCH));
 
        while (!itt.done && !itt.cancel) {
                gtk_main_iteration ();
@@ -2927,7 +2925,7 @@ Editor::freeze_route ()
        interthread_progress_connection.disconnect ();
        interthread_progress_window->hide_all ();
        current_interthread_info = 0;
-       track_canvas_scroller.get_window()->set_cursor (*current_canvas_cursor);
+       track_canvas.get_window()->set_cursor (*current_canvas_cursor);
 }
 
 void
@@ -3458,7 +3456,7 @@ Editor::normalize_region ()
 
        begin_reversible_command (_("normalize"));
 
-       track_canvas_scroller.get_window()->set_cursor (*wait_cursor);
+       track_canvas.get_window()->set_cursor (*wait_cursor);
        gdk_flush ();
 
        for (AudioRegionSelection::iterator r = selection->audio_regions.begin(); r != selection->audio_regions.end(); ++r) {
@@ -3468,7 +3466,7 @@ Editor::normalize_region ()
        }
 
        commit_reversible_command ();
-       track_canvas_scroller.get_window()->set_cursor (*current_canvas_cursor);
+       track_canvas.get_window()->set_cursor (*current_canvas_cursor);
 }
 
 
@@ -3515,7 +3513,7 @@ Editor::apply_filter (AudioFilter& filter, string command)
 
        begin_reversible_command (command);
 
-       track_canvas_scroller.get_window()->set_cursor (*wait_cursor);
+       track_canvas.get_window()->set_cursor (*wait_cursor);
        gdk_flush ();
 
        for (AudioRegionSelection::iterator r = selection->audio_regions.begin(); r != selection->audio_regions.end(); ) {
@@ -3544,7 +3542,7 @@ Editor::apply_filter (AudioFilter& filter, string command)
        selection->audio_regions.clear ();
 
   out:
-       track_canvas_scroller.get_window()->set_cursor (*current_canvas_cursor);
+       track_canvas.get_window()->set_cursor (*current_canvas_cursor);
 }
 
 void
index 5df85489b7b65e541daa4d73a4468ea7cb565d87..9cdc981eb0543ce5890756c954433c3b619b4e6f 100644 (file)
@@ -155,7 +155,7 @@ Editor::route_display_selection_changed ()
 
        for (i = rows.begin(); i != rows.end(); ++i) {
                tv = (*i)[route_display_columns.tv];
-               if (selection->is_selected (i)) {
+               if (!selection->is_selected (i)) {
                        tv->set_marked_for_display  (false);
                } else {
                        AudioTimeAxisView *atv;
@@ -225,7 +225,7 @@ Editor::route_list_reordered ()
        TreeModel::Children rows = route_display_model->children();
        TreeModel::Children::iterator i;
        long order;
-int n;
+       int n;
        
         for (n = 0, order = 0, i = rows.begin(); i != rows.end(); ++i, ++order) {
                TimeAxisView *tv = (*i)[route_display_columns.tv];
@@ -250,7 +250,8 @@ int n;
                n++;
                
        }
-       edit_controls_scroller.queue_resize ();
+
+       // controls_layout.queue_resize ();
        reset_scrolling_region ();
        return FALSE;
 }
index 93af2a18be5ae0632471f857ca4641569b66c947..1fe4e0711cad625dc3cee7957d329d8f61d2f98a 100644 (file)
@@ -520,7 +520,7 @@ Editor::update_ruler_visibility ()
 
        lab_children.clear();
 
-       // leave the last one (the time_canvas_scroller) intact
+       // leave the last one (the time_canvas) intact
        while (ruler_children.size() > 1) {
                ruler_children.pop_front();
        }
index 00d20129df8c6161abf6125f7d8b42fd2204f813..f15c8d79e870be384f96ff90de4ab40f8f674e80 100644 (file)
@@ -116,20 +116,6 @@ ImageFrameTimeAxis::~ImageFrameTimeAxis ()
                image_action_menu = 0 ;
        }
        
-       for(list<SelectionRect*>::iterator i = free_selection_rects.begin(); i != free_selection_rects.end(); ++i)
-       {
-               delete (*i)->rect;
-               delete (*i)->start_trim;
-               delete (*i)->end_trim;
-       }
-
-       for(list<SelectionRect*>::iterator i = used_selection_rects.begin(); i != used_selection_rects.end(); ++i)
-       {
-               delete (*i)->rect;
-               delete (*i)->start_trim;
-               delete (*i)->end_trim;
-       }
-       
        if (selection_group)
        {
                delete selection_group;
index 8a9ac674fcb293977cac8cf54961e97cb27e6e1b..8a75492a307905ab0680adf40e32e6ba4cba586c 100644 (file)
@@ -246,6 +246,7 @@ Marker::Marker (PublicEditor& ed, ArdourCanvas::Group& parent, guint32 rgba, con
        mark->property_points() = *points;
        mark->property_fill_color_rgba() = rgba;
        mark->property_outline_color() = "black";
+       mark->property_width_pixels() = 1;
 
        Pango::FontDescription font = get_font_for_style (N_("MarkerText"));
 
index e8673e6fe349035ac0d14c5d595233645d3d3d58..973bb5d221b941d780f4d0c472eb274822199a4d 100644 (file)
@@ -92,27 +92,7 @@ MarkerTimeAxis::MarkerTimeAxis (PublicEditor& ed, ARDOUR::Session& sess, Canvas&
  */
 MarkerTimeAxis::~MarkerTimeAxis()
 {
-        GoingAway() ; /* EMIT_SIGNAL */
-
-       for (list<SelectionRect*>::iterator i = free_selection_rects.begin(); i != free_selection_rects.end(); ++i)
-       {
-               delete (*i)->rect;
-               delete (*i)->start_trim;
-               delete (*i)->end_trim;
-       }
-
-       for (list<SelectionRect*>::iterator i = used_selection_rects.begin(); i != used_selection_rects.end(); ++i)
-       {
-               delete (*i)->rect;
-               delete (*i)->start_trim;
-               delete (*i)->end_trim;
-       }
-       
-       if(selection_group)
-       {
-               delete selection_group;
-               selection_group = 0 ;
-       }
+       GoingAway() ; /* EMIT_SIGNAL */
 
        // destroy the view helper
        // this handles removing and destroying individual marker items
index 5d8f88eeebe113d89a55da2dc57ca57fa269e866..a85a589ae33890f725118a2d543d7c2a870b4bc6 100644 (file)
@@ -435,14 +435,11 @@ Mixer_UI::show_strip (MixerStrip* ms)
                
                if (ms->route().master() || ms->route().control()) {
                        out_packer.pack_start (*ms, false, false);
-                       cerr << "Packed master strip @ " << ms << endl;
                } else {
-                        strip_packer.pack_start (*ms, false, false);
-                        cerr << "Packed strip @ " << ms << endl;
+                       strip_packer.pack_start (*ms, false, false);
                }
                ms->set_packed (true);
                ms->show ();
-
         }
  }
 
index 6c97e2419947e982bc3f3e2e8da005c216dab84f..b9ff987d531705f9d57f3969bcb4aab78bfe9733 100644 (file)
@@ -78,6 +78,7 @@ TimeAxisView::TimeAxisView (ARDOUR::Session& sess, PublicEditor& ed, TimeAxisVie
        effective_height = 0;
        parent = rent;
        _has_state = false;
+       last_name_entry_key_press_event = 0;
 
        /*
          Create the standard LHS Controls
@@ -88,7 +89,10 @@ TimeAxisView::TimeAxisView (ARDOUR::Session& sess, PublicEditor& ed, TimeAxisVie
        name_entry.set_name ("EditorTrackNameDisplay");
        name_entry.signal_button_release_event().connect (mem_fun (*this, &TimeAxisView::name_entry_button_release));
        name_entry.signal_button_press_event().connect (mem_fun (*this, &TimeAxisView::name_entry_button_press));
-       
+       name_entry.signal_key_release_event().connect (mem_fun (*this, &TimeAxisView::name_entry_key_release));
+       name_entry.signal_activate().connect (mem_fun(*this, &TimeAxisView::name_entry_activated));
+       name_entry.signal_focus_in_event().connect (mem_fun (*this, &TimeAxisView::name_entry_focus_in));
+       name_entry.signal_focus_out_event().connect (mem_fun (*this, &TimeAxisView::name_entry_focus_out));
        Gtkmm2ext::set_size_request_to_display_given_text (name_entry, N_("gTortnam"), 10, 10); // just represents a short name
 
        name_label.set_name ("TrackLabel");
@@ -355,6 +359,86 @@ TimeAxisView::set_height (TrackHeight h)
 
 }
 
+bool
+TimeAxisView::name_entry_key_release (GdkEventKey* ev)
+{
+       switch (ev->keyval) {
+       case GDK_Tab:
+       case GDK_Up:
+       case GDK_Down:
+               name_entry_changed ();
+               return true;
+
+       default:
+               break;
+       }
+
+#ifdef TIMEOUT_NAME_EDIT       
+       /* adapt the timeout to reflect the user's typing speed */
+
+       guint32 name_entry_timeout;
+
+       if (last_name_entry_key_press_event) {
+               /* timeout is 1/2 second or 5 times their current inter-char typing speed */
+               name_entry_timeout = std::max (500U, (5 * (ev->time - last_name_entry_key_press_event)));
+       } else {
+               /* start with a 1 second timeout */
+               name_entry_timeout = 1000;
+       }
+
+       last_name_entry_key_press_event = ev->time;
+
+       /* wait 1 seconds and if no more keys are pressed, act as if they pressed enter */
+
+       name_entry_key_timeout.disconnect();
+       name_entry_key_timeout = Glib::signal_timeout().connect (mem_fun (*this, &TimeAxisView::name_entry_key_timed_out), name_entry_timeout);
+#endif
+
+       return false;
+}
+
+bool
+TimeAxisView::name_entry_focus_in (GdkEventFocus* ev)
+{
+       name_entry.select_region (0, -1);
+       name_entry.set_name ("EditorActiveTrackNameDisplay");
+       return false;
+}
+
+bool
+TimeAxisView::name_entry_focus_out (GdkEventFocus* ev)
+{
+       /* clean up */
+
+       last_name_entry_key_press_event = 0;
+       name_entry_key_timeout.disconnect ();
+       name_entry.set_name ("EditorTrackNameDisplay");
+       
+       /* do the real stuff */
+
+       name_entry_changed ();
+
+       return false;
+}
+
+bool
+TimeAxisView::name_entry_key_timed_out ()
+{
+       name_entry_activated();
+       return false;
+}
+
+void
+TimeAxisView::name_entry_activated ()
+{
+       controls_ebox.grab_focus();
+}
+
+void
+TimeAxisView::name_entry_changed ()
+{
+}
+
 bool
 TimeAxisView::name_entry_button_press (GdkEventButton *ev)
 {
index 1b132322e422527abb36cfc32f615c4e3330701f..7cd2cc8e38190bb11343141fd5d21dfea9b673c2 100644 (file)
@@ -199,19 +199,19 @@ class TimeAxisView : public virtual AxisView
        string controls_base_unselected_name;
        string controls_base_selected_name;
 
-       /**
-        * Handle mouse press on our LHS control name entry.
-        *
-        * @param ev the event
-        */
-       virtual bool name_entry_button_press (GdkEventButton *ev);
+       bool name_entry_button_press (GdkEventButton *ev);
+       bool name_entry_button_release (GdkEventButton *ev);
+       bool name_entry_key_release (GdkEventKey *ev);
+       void name_entry_activated ();
+       sigc::connection name_entry_key_timeout;
+       bool name_entry_key_timed_out ();
+       guint32 last_name_entry_key_press_event;
+       
+       /* derived classes can override these */
 
-       /**
-        * Handle mouse relaese on our LHS control name entry.
-        * 
-        *@ param ev the event
-        */
-       virtual bool name_entry_button_release (GdkEventButton *ev);
+       virtual void name_entry_changed ();
+       virtual bool name_entry_focus_in (GdkEventFocus *ev);
+       virtual bool name_entry_focus_out (GdkEventFocus *ev);
 
        /**
         * Handle mouse relaese on our LHS control name ebox.