summaryrefslogtreecommitdiff
path: root/gtk2_ardour/editor.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gtk2_ardour/editor.cc')
-rw-r--r--gtk2_ardour/editor.cc201
1 files changed, 109 insertions, 92 deletions
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index 3e8402bbca..3245843304 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -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