button hacks and more
[ardour.git] / gtk2_ardour / editor.cc
index 099ee43cb259f924198fc28496cbc368dd49db94..3c2bd6a96fd5c35eda6af733c43b3181cfc21238 100644 (file)
@@ -48,7 +48,6 @@
 #include <ardour/utils.h>
 
 #include "ardour_ui.h"
-#include "check_mark.h"
 #include "editor.h"
 #include "grouped_buttons.h"
 #include "keyboard.h"
@@ -145,14 +144,69 @@ Gdk::Cursor* Editor::zoom_cursor = 0;
 Gdk::Cursor* Editor::time_fx_cursor = 0;
 Gdk::Cursor* Editor::fader_cursor = 0;
 Gdk::Cursor* Editor::speaker_cursor = 0;
-Gdk::Cursor* Editor::null_cursor = 0;
 Gdk::Cursor* Editor::wait_cursor = 0;
 Gdk::Cursor* Editor::timebar_cursor = 0;
 
-GdkPixmap *Editor::check_pixmap = 0;
-GdkBitmap *Editor::check_mask = 0;
-GdkPixmap *Editor::empty_pixmap = 0;
-GdkBitmap *Editor::empty_mask = 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),
@@ -170,8 +224,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 */
 
@@ -219,13 +278,6 @@ Editor::Editor (AudioEngine& eng)
 
        init_colormap ();
 
-       check_pixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, 
-                                                             gtk_widget_get_colormap (GTK_WIDGET(edit_group_list.gobj())),
-                                                             &check_mask, NULL, (gchar **) check_xpm);
-       empty_pixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, 
-                                                             gtk_widget_get_colormap (GTK_WIDGET(edit_group_list.gobj())),
-                                                             &empty_mask, NULL, (gchar **) empty_xpm);
-
        session = 0;
 
        selection = new Selection;
@@ -276,6 +328,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;
@@ -291,7 +344,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;
@@ -323,45 +375,32 @@ 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.signal_size_request().connect (mem_fun(*this, &Editor::set_layout_width), false);
+       controls_layout.signal_expose_event().connect (mem_fun(*this, &Editor::layout_expose), false);
+       
+       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 ();
@@ -372,7 +411,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");
@@ -430,25 +469,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|EXPAND, 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);
@@ -565,19 +603,6 @@ Editor::Editor (AudioEngine& eng)
        edit_group_vbox.pack_start (edit_group_list_button, false, false);
        edit_group_vbox.pack_start (edit_group_list_scroller, true, true);
        
-       route_list_frame.set_name ("BaseFrame");
-       route_list_frame.set_shadow_type (Gtk::SHADOW_IN);
-       route_list_frame.add (route_list_scroller);
-
-       edit_group_list_frame.set_name ("BaseFrame");
-       edit_group_list_frame.set_shadow_type (Gtk::SHADOW_IN);
-       edit_group_list_frame.add (edit_group_vbox);
-
-       route_group_vpane.add1 (route_list_frame);
-       route_group_vpane.add2 (edit_group_list_frame);
-
-       list_vpacker.pack_start (route_group_vpane, true, true);
-
        region_list_model = TreeStore::create (region_list_columns);
        region_list_sort_model = TreeModelSort::create (region_list_model);
        region_list_model->set_sort_func (0, mem_fun (*this, &Editor::region_list_sorter));
@@ -629,44 +654,25 @@ Editor::Editor (AudioEngine& eng)
        named_selection_display.signal_button_press_event().connect (mem_fun(*this, &Editor::named_selection_display_button_press));
        named_selection_display.get_selection()->signal_changed().connect (mem_fun (*this, &Editor::named_selection_display_selection_changed));
 
-       region_selection_vpane.pack1 (region_list_scroller, true, true);
-       region_selection_vpane.pack2 (named_selection_scroller, true, true);
+               the_notebook.append_page (region_list_scroller, _("Regions"));
+               the_notebook.append_page (route_list_scroller, _("Tracks/Busses"));
+       the_notebook.append_page (edit_group_vbox, _("Edit Groups"));
+       the_notebook.append_page (named_selection_scroller, _("Chunks"));
+       the_notebook.set_show_tabs (true);
+       the_notebook.set_scrollable (true);
+       the_notebook.popup_enable ();
 
-       canvas_region_list_pane.pack1 (edit_frame, true, true);
-       canvas_region_list_pane.pack2 (region_selection_vpane, true, true);
+       TearOff *notebook_tearoff = manage (new TearOff (the_notebook));
 
-       track_list_canvas_pane.signal_size_allocate().connect_notify (bind (mem_fun(*this, &Editor::pane_allocation_handler),
-                                                                           static_cast<Gtk::Paned*> (&track_list_canvas_pane)));
-       canvas_region_list_pane.signal_size_allocate().connect_notify (bind (mem_fun(*this, &Editor::pane_allocation_handler),
-                                                                   static_cast<Gtk::Paned*> (&canvas_region_list_pane)));
-       route_group_vpane.signal_size_allocate().connect_notify (bind (mem_fun(*this, &Editor::pane_allocation_handler),
-                                                             static_cast<Gtk::Paned*> (&route_group_vpane)));
-       region_selection_vpane.signal_size_allocate().connect_notify (bind (mem_fun(*this, &Editor::pane_allocation_handler),
-                                                                  static_cast<Gtk::Paned*> (&region_selection_vpane)));
-       
-       track_list_canvas_pane.pack1 (list_vpacker, true, true);
-       track_list_canvas_pane.pack2 (canvas_region_list_pane, true, true);
-
-       /* provide special pane-handle event handling for easy "hide" action */
-
-       /* 0: collapse to show left/upper child
-          1: collapse to show right/lower child
-       */
-
-       route_group_vpane.set_data ("collapse-direction", (gpointer) 0);
-       region_selection_vpane.set_data ("collapse-direction", (gpointer) 0);
-       canvas_region_list_pane.set_data ("collapse-direction", (gpointer) 0);
-       track_list_canvas_pane.set_data ("collapse-direction", (gpointer) 1);
+       edit_pane.pack1 (edit_frame, true, true);
+       edit_pane.pack2 (*notebook_tearoff, true, true);
 
-       route_group_vpane.signal_button_release_event().connect (bind (sigc::ptr_fun (pane_handler), static_cast<Paned*> (&route_group_vpane)));
-       region_selection_vpane.signal_button_release_event().connect (bind (sigc::ptr_fun (pane_handler), static_cast<Paned*> (&region_selection_vpane)));
-       canvas_region_list_pane.signal_button_release_event().connect (bind (sigc::ptr_fun (pane_handler), static_cast<Paned*> (&canvas_region_list_pane)));
-       track_list_canvas_pane.signal_button_release_event().connect (bind (sigc::ptr_fun (pane_handler), static_cast<Paned*> (&track_list_canvas_pane)));
+       edit_pane.signal_size_allocate().connect_notify (bind (mem_fun(*this, &Editor::pane_allocation_handler), static_cast<Gtk::Paned*> (&edit_pane)));
 
        top_hbox.pack_start (toolbar_frame, true, true);
 
        HBox *hbox = manage (new HBox);
-       hbox->pack_start (track_list_canvas_pane, true, true);
+       hbox->pack_start (edit_pane, true, true);
 
        global_vpacker.pack_start (top_hbox, false, false);
        global_vpacker.pack_start (*hbox, true, true);
@@ -674,7 +680,9 @@ Editor::Editor (AudioEngine& eng)
        global_hpacker.pack_start (global_vpacker, true, true);
 
        set_name ("EditorWindow");
+       cerr << "Adding accel group " << ActionManager::ui_manager->get_accel_group()->gobj() << endl;
        add_accel_group (ActionManager::ui_manager->get_accel_group());
+       cerr << "... done\n";
 
        vpacker.pack_end (global_hpacker, true, true);
        
@@ -809,9 +817,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);
 }
@@ -831,7 +839,7 @@ Editor::set_frames_per_unit (double fpu)
 
        // convert fpu to frame count
 
-       frames = (jack_nframes_t) (fpu * canvas_width);
+       frames = (jack_nframes_t) floor (fpu * canvas_width);
        
        /* don't allow zooms that fit more than the maximum number
           of frames into an 800 pixel wide space.
@@ -852,12 +860,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));
        }
@@ -897,10 +904,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 */
        }
 }
@@ -921,15 +928,14 @@ Editor::zoom_adjustment_changed ()
                return;
        }
 
-       double fpu = (double) zoom_range_clock.current_duration() / (double) canvas_width;
+       double fpu = zoom_range_clock.current_duration() / canvas_width;
 
        if (fpu < 1.0) {
                fpu = 1.0;
-               zoom_range_clock.set ((jack_nframes_t) (fpu * canvas_width));
-       }
-       else if (fpu > session->current_end_frame() / (double) canvas_width) {
-               fpu = session->current_end_frame() / (double) canvas_width;
-               zoom_range_clock.set ((jack_nframes_t) (fpu * canvas_width));
+               zoom_range_clock.set ((jack_nframes_t) floor (fpu * canvas_width));
+       } else if (fpu > session->current_end_frame() / canvas_width) {
+               fpu = session->current_end_frame() / canvas_width;
+               zoom_range_clock.set ((jack_nframes_t) floor (fpu * canvas_width));
        }
        
        temporal_zoom (fpu);
@@ -938,14 +944,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) {
@@ -987,22 +987,9 @@ void
 Editor::on_realize ()
 {
        Window::on_realize ();
-
-       /* Even though we're not using acceleration, we want the
-          labels to show up.
-       */
-
-       track_context_menu.accelerate (*this->get_toplevel());
-       track_region_context_menu.accelerate (*this->get_toplevel());
-       
-        Glib::RefPtr<Gdk::Pixmap> empty_pixmap = Gdk::Pixmap::create(get_window(), 1, 1, 1);
-       Glib::RefPtr<Gdk::Pixmap> empty_bitmap = Gdk::Pixmap::create(get_window(), 1, 1, 1);
-       Gdk::Color white ("#ffffff" );
-
-       null_cursor = new Gdk::Cursor(empty_pixmap, empty_bitmap, white, white, 0, 0);
+       Realized ();
 }
 
-
 void
 Editor::queue_session_control_changed (Session::ControlType t)
 {
@@ -1085,13 +1072,13 @@ Editor::map_position_change (jack_nframes_t frame)
 void
 Editor::center_screen (jack_nframes_t frame)
 {
-       float page = canvas_width * frames_per_unit;
+       double page = canvas_width * frames_per_unit;
 
        /* if we're off the page, then scroll.
         */
        
        if (frame < leftmost_frame || frame >= leftmost_frame + page) {
-               center_screen_internal (frame,page);
+               center_screen_internal (frame, page);
        }
 }
 
@@ -1115,15 +1102,13 @@ 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
-Editor::update_title_s (string snap_name)
+Editor::update_title_s (stringcr_t snap_name)
 {
        ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::update_title_s), snap_name));
        
@@ -1286,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));
 
@@ -2102,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()));
@@ -2200,14 +2183,8 @@ Editor::get_state ()
                geometry->add_property("x_off", string(buf));
                snprintf(buf, sizeof(buf), "%d", yoff);
                geometry->add_property("y_off", string(buf));
-               snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast<Paned*>(&canvas_region_list_pane)->gobj()));
-               geometry->add_property("canvas_region_list_pane_pos", string(buf));
-               snprintf(buf,sizeof(buf), "%d", gtk_paned_get_position (static_cast<Paned*>(&track_list_canvas_pane)->gobj()));
-               geometry->add_property("track_list_canvas_pane_pos", string(buf));
-               snprintf(buf,sizeof(buf), "%d", gtk_paned_get_position (static_cast<Paned*>(&region_selection_vpane)->gobj()));
-               geometry->add_property("region_selection_pane_pos", string(buf));
-               snprintf(buf,sizeof(buf), "%d", gtk_paned_get_position (static_cast<Paned*>(&route_group_vpane)->gobj()));
-               geometry->add_property("route_group_pane_pos", string(buf));
+               snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast<Paned*>(&edit_pane)->gobj()));
+               geometry->add_property("edit_pane_pos", string(buf));
 
                node->add_child_nocopy (*geometry);
        }
@@ -2553,7 +2530,8 @@ Editor::setup_toolbar ()
 
        /* XXX another disgusting hack because of the way combo boxes size themselves */
 
-       Gtkmm2ext::set_size_request_to_display_given_text (edit_mode_selector, "EdgtMode", 2, 10);
+       const guint32 FUDGE = 20; // Combo's are stupid - they steal space from the entry for the button
+       Gtkmm2ext::set_size_request_to_display_given_text (edit_mode_selector, "EdgtMode", 2+FUDGE, 10);
        set_popdown_strings (edit_mode_selector, internationalize (edit_mode_strings));
        edit_mode_box.pack_start (edit_mode_label, false, false);
        edit_mode_box.pack_start (edit_mode_selector, false, false);
@@ -2571,8 +2549,7 @@ Editor::setup_toolbar ()
 
        /* XXX another disgusting hack because of the way combo boxes size themselves */
 
-       const guint32 FUDGE = 10; // Combo's are stupid - they steal space from the entry for the button
-       Gtkmm2ext::set_size_request_to_display_given_text (snap_type_selector, "Region bounds", 2+FUDGE, 10);
+       Gtkmm2ext::set_size_request_to_display_given_text (snap_type_selector, "SMPTE Seconds", 2+FUDGE, 10);
        set_popdown_strings (snap_type_selector, internationalize (snap_type_strings));
 
        snap_type_box.pack_start (snap_type_label, false, false);
@@ -2589,7 +2566,7 @@ Editor::setup_toolbar ()
        snap_mode_box.set_spacing (3);
        snap_mode_box.set_border_width (3);
 
-       Gtkmm2ext::set_size_request_to_display_given_text (snap_mode_selector, "SngpMode", 2, 10);
+       Gtkmm2ext::set_size_request_to_display_given_text (snap_mode_selector, "SngpMode", 2+FUDGE, 10);
        set_popdown_strings (snap_mode_selector, internationalize (snap_mode_strings));
 
        snap_mode_box.pack_start (snap_mode_label, false, false);
@@ -2608,7 +2585,7 @@ Editor::setup_toolbar ()
 
        /* XXX another disgusting hack because of the way combo boxes size themselves */
 
-       Gtkmm2ext::set_size_request_to_display_given_text (zoom_focus_selector, "Edgt Cursor", 2, 10);
+       Gtkmm2ext::set_size_request_to_display_given_text (zoom_focus_selector, "Edgt Cursor", 2+FUDGE, 10);
        set_popdown_strings (zoom_focus_selector, internationalize (zoom_focus_strings));
 
        zoom_focus_box.pack_start (zoom_focus_label, false, false);
@@ -3442,7 +3419,7 @@ Editor::hide_verbose_canvas_cursor ()
 }
 
 void
-Editor::set_verbose_canvas_cursor (string txt, double x, double y)
+Editor::set_verbose_canvas_cursor (stringcr_t txt, double x, double y)
 {
        /* XXX get origin of canvas relative to root window,
           add x and y and check compared to gdk_screen_{width,height}
@@ -3453,7 +3430,7 @@ Editor::set_verbose_canvas_cursor (string txt, double x, double y)
 }
 
 void
-Editor::set_verbose_canvas_cursor_text (string txt)
+Editor::set_verbose_canvas_cursor_text (stringcr_t txt)
 {
        verbose_canvas_cursor->property_text() = txt.c_str();
 }
@@ -3645,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)
 {
@@ -3758,72 +3714,21 @@ Editor::pane_allocation_handler (Gtk::Allocation &alloc, Gtk::Paned* which)
                height = atoi(geometry->property("y_size")->value());
        }
 
-       if (which == static_cast<Gtk::Paned*> (&track_list_canvas_pane)) {
+       if (which == static_cast<Gtk::Paned*> (&edit_pane)) {
 
                if (done[0]) {
                        return;
                }
 
-               if (!geometry || (prop = geometry->property("track_list_canvas_pane_pos")) == 0) {
+               if (!geometry || (prop = geometry->property ("edit_pane_pos")) == 0) {
                        pos = 75;
                        snprintf (buf, sizeof(buf), "%d", pos);
                } else {
                        pos = atoi (prop->value());
                }
 
-               if ((done[0] = GTK_WIDGET(track_list_canvas_pane.gobj())->allocation.width > pos)) {
-                       track_list_canvas_pane.set_position (pos);
-               }
-
-       } else if (which == static_cast<Gtk::Paned*> (&canvas_region_list_pane)) {
-
-               if (done[1]) {
-                       return;
-               }
-
-               if (!geometry || (prop = geometry->property("canvas_region_list_pane_pos")) == 0) {
-                       pos = width - (95 * 2);
-                       snprintf (buf, sizeof(buf), "%d", pos);
-               } else {
-                       pos = atoi (prop->value());
-               }
-
-               if ((done[1] = GTK_WIDGET(canvas_region_list_pane.gobj())->allocation.width > pos)) {
-                       canvas_region_list_pane.set_position (pos);
-               }
-
-       } else if (which == static_cast<Gtk::Paned*> (&route_group_vpane)) {
-
-               if (done[2]) {
-                       return;
-               }
-
-               if (!geometry || (prop = geometry->property("route_group_pane_pos")) == 0) {
-                       pos = width - (95 * 2);
-                       snprintf (buf, sizeof(buf), "%d", pos);
-               } else {
-                       pos = atoi (prop->value());
-               }
-
-               if ((done[2] = GTK_WIDGET(route_group_vpane.gobj())->allocation.height > pos)) {
-                       route_group_vpane.set_position (pos);
-               }
-
-       } else if (which == static_cast<Gtk::Paned*> (&region_selection_vpane)) {
-
-               if (done[3]) {
-                       return;
-               }
-
-               if (!geometry || (prop = geometry->property("region_selection_pane_pos")) == 0) {
-                       pos = width - (95 * 2);
-                       snprintf (buf, sizeof(buf), "%d", pos);
-               } else {
-                       pos = atoi (prop->value());
-               }
-
-               if ((done[3] = GTK_WIDGET(region_selection_vpane.gobj())->allocation.height > pos)) { 
-                       region_selection_vpane.set_position (pos);
+               if ((done[0] = GTK_WIDGET(edit_pane.gobj())->allocation.width > pos)) {
+                       edit_pane.set_position (pos);
                }
        }
 }
@@ -3928,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
@@ -4018,3 +3923,20 @@ Editor::transport_punch_location()
                return 0;
        }
 }
+
+void
+Editor::set_layout_width(Gtk::Requisition *r)
+{
+       edit_controls_vbox.check_resize();
+       int w = edit_controls_vbox.get_width();
+       cerr << "set_layout_width() called w = " << w << endl;
+       
+       controls_layout.set_size_request (w, -1);
+}
+
+bool
+Editor::layout_expose (GdkEventExpose* ex)
+{
+       cerr << "layout_expose() called" << endl;
+       return TRUE;
+}