diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2007-05-23 00:02:51 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2007-05-23 00:02:51 +0000 |
commit | 7dc87973eead6cf9acd87dfe9b27fdb028921874 (patch) | |
tree | 596791d444b145e49adb88ce51d92f6aae7a2d7f | |
parent | 74184c976fafdb7eca293172a8d3303581f62296 (diff) |
fix audio clock handling of key press; fix crash bug caused by mapping over a region list selection that includes rows without regions
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@1912 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r-- | gtk2_ardour/audio_clock.cc | 87 | ||||
-rw-r--r-- | gtk2_ardour/audio_clock.h | 6 | ||||
-rw-r--r-- | gtk2_ardour/editor_region_list.cc | 11 | ||||
-rw-r--r-- | gtk2_ardour/keyboard.cc | 19 | ||||
-rw-r--r-- | gtk2_ardour/keyboard.h | 6 | ||||
-rw-r--r-- | gtk2_ardour/utils.cc | 23 |
6 files changed, 117 insertions, 35 deletions
diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc index e26c4d91e3..0aa8ff8ab6 100644 --- a/gtk2_ardour/audio_clock.cc +++ b/gtk2_ardour/audio_clock.cc @@ -335,6 +335,18 @@ AudioClock::setup_events () ms_minutes_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), MS_Minutes)); ms_seconds_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), MS_Seconds)); + hours_ebox.signal_key_press_event().connect (bind (mem_fun(*this, &AudioClock::field_key_press_event), SMPTE_Hours)); + minutes_ebox.signal_key_press_event().connect (bind (mem_fun(*this, &AudioClock::field_key_press_event), SMPTE_Minutes)); + seconds_ebox.signal_key_press_event().connect (bind (mem_fun(*this, &AudioClock::field_key_press_event), SMPTE_Seconds)); + frames_ebox.signal_key_press_event().connect (bind (mem_fun(*this, &AudioClock::field_key_press_event), SMPTE_Frames)); + audio_frames_ebox.signal_key_press_event().connect (bind (mem_fun(*this, &AudioClock::field_key_press_event), AudioFrames)); + bars_ebox.signal_key_press_event().connect (bind (mem_fun(*this, &AudioClock::field_key_press_event), Bars)); + beats_ebox.signal_key_press_event().connect (bind (mem_fun(*this, &AudioClock::field_key_press_event), Beats)); + ticks_ebox.signal_key_press_event().connect (bind (mem_fun(*this, &AudioClock::field_key_press_event), Ticks)); + ms_hours_ebox.signal_key_press_event().connect (bind (mem_fun(*this, &AudioClock::field_key_press_event), MS_Hours)); + ms_minutes_ebox.signal_key_press_event().connect (bind (mem_fun(*this, &AudioClock::field_key_press_event), MS_Minutes)); + ms_seconds_ebox.signal_key_press_event().connect (bind (mem_fun(*this, &AudioClock::field_key_press_event), MS_Seconds)); + hours_ebox.signal_key_release_event().connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), SMPTE_Hours)); minutes_ebox.signal_key_release_event().connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), SMPTE_Minutes)); seconds_ebox.signal_key_release_event().connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), SMPTE_Seconds)); @@ -370,6 +382,15 @@ 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)); + + clock_base.signal_focus_in_event().connect (mem_fun (*this, &AudioClock::drop_focus_handler)); +} + +bool +AudioClock::drop_focus_handler (GdkEventFocus* ignored) +{ + Keyboard::magic_widget_drop_focus (); + return false; } void @@ -609,6 +630,13 @@ AudioClock::set_session (Session *s) } bool +AudioClock::field_key_press_event (GdkEventKey *ev, Field field) +{ + /* all key activity is handled on key release */ + return true; +} + +bool AudioClock::field_key_release_event (GdkEventKey *ev, Field field) { Label *label = 0; @@ -654,7 +682,7 @@ AudioClock::field_key_release_event (GdkEventKey *ev, Field field) label = &ticks_label; break; default: - return FALSE; + return false; } switch (ev->keyval) { @@ -704,22 +732,22 @@ AudioClock::field_key_release_event (GdkEventKey *ev, Field field) if (_mode == MinSec && field == MS_Seconds) { new_char = '.'; } else { - return FALSE; + return false; } break; - case GDK_Return: - case GDK_KP_Enter: case GDK_Tab: move_on = true; break; case GDK_Escape: + case GDK_Return: + case GDK_KP_Enter: clock_base.grab_focus (); - return TRUE; + return true; default: - return FALSE; + return false; } if (!move_on) { @@ -840,7 +868,7 @@ AudioClock::field_key_release_event (GdkEventKey *ev, Field field) } - return TRUE; + return true; } bool @@ -848,6 +876,8 @@ AudioClock::field_focus_in_event (GdkEventFocus *ev, Field field) { key_entry_state = 0; + Keyboard::magic_widget_grab_focus (); + switch (field) { case SMPTE_Hours: hours_ebox.set_flags (Gtk::HAS_FOCUS); @@ -897,7 +927,7 @@ AudioClock::field_focus_in_event (GdkEventFocus *ev, Field field) break; } - return FALSE; + return false; } bool @@ -954,21 +984,20 @@ AudioClock::field_focus_out_event (GdkEventFocus *ev, Field field) break; } - return FALSE; + Keyboard::magic_widget_drop_focus (); + + return false; } bool AudioClock::field_button_release_event (GdkEventButton *ev, Field field) { - - if (dragging) { - gdk_pointer_ungrab(GDK_CURRENT_TIME); + gdk_pointer_ungrab (GDK_CURRENT_TIME); dragging = false; if (ev->y > drag_start_y+1 || ev->y < drag_start_y-1 || Keyboard::modifier_state_equals (ev->state, Keyboard::Shift)){ - // we actually dragged so return without setting editing focus, or we shift clicked - - return TRUE; + // we actually dragged so return without setting editing focus, or we shift clicked + return true; } } @@ -977,7 +1006,7 @@ AudioClock::field_button_release_event (GdkEventButton *ev, Field field) build_ops_menu (); } ops_menu->popup (1, ev->time); - return TRUE; + return true; } if (Keyboard::is_context_menu_event (ev)) { @@ -985,7 +1014,7 @@ AudioClock::field_button_release_event (GdkEventButton *ev, Field field) build_ops_menu (); } ops_menu->popup (1, ev->time); - return TRUE; + return true; } switch (ev->button) { @@ -1034,13 +1063,13 @@ AudioClock::field_button_release_event (GdkEventButton *ev, Field field) break; } - return TRUE; + return true; } bool AudioClock::field_button_press_event (GdkEventButton *ev, Field field) { - if (session == 0) return FALSE; + if (session == 0) return false; nframes_t frames = 0; @@ -1052,7 +1081,7 @@ AudioClock::field_button_press_event (GdkEventButton *ev, Field field) } /* make absolutely sure that the pointer is grabbed */ - gdk_pointer_grab(ev->window,FALSE , + gdk_pointer_grab(ev->window,false , GdkEventMask( Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK |Gdk::BUTTON_RELEASE_MASK), NULL,NULL,ev->time); dragging = true; @@ -1070,21 +1099,23 @@ AudioClock::field_button_press_event (GdkEventButton *ev, Field field) case 3: /* used for context sensitive menu */ - return FALSE; + return false; break; default: - return FALSE; + return false; break; } - return TRUE; + return true; } bool AudioClock::field_button_scroll_event (GdkEventScroll *ev, Field field) { - if (session == 0) return FALSE; + if (session == 0) { + return false; + } nframes_t frames = 0; @@ -1119,18 +1150,18 @@ AudioClock::field_button_scroll_event (GdkEventScroll *ev, Field field) break; default: - return FALSE; + return false; break; } - return TRUE; + return true; } bool AudioClock::field_motion_notify_event (GdkEventMotion *ev, Field field) { if (session == 0 || !dragging) { - return FALSE; + return false; } float pixel_frame_scale_factor = 0.2f; @@ -1177,7 +1208,7 @@ AudioClock::field_motion_notify_event (GdkEventMotion *ev, Field field) } - return TRUE; + return true; } nframes_t diff --git a/gtk2_ardour/audio_clock.h b/gtk2_ardour/audio_clock.h index f0790dcbc8..6c2f9c838c 100644 --- a/gtk2_ardour/audio_clock.h +++ b/gtk2_ardour/audio_clock.h @@ -62,6 +62,8 @@ class AudioClock : public Gtk::HBox static sigc::signal<void> ModeChanged; static std::vector<AudioClock*> clocks; + static bool has_focus() { return _has_focus; } + private: ARDOUR::Session *session; Mode _mode; @@ -171,9 +173,11 @@ class AudioClock : public Gtk::HBox bool field_button_press_event (GdkEventButton *ev, Field); bool field_button_release_event (GdkEventButton *ev, Field); bool field_button_scroll_event (GdkEventScroll *ev, Field); + bool field_key_press_event (GdkEventKey *, Field); bool field_key_release_event (GdkEventKey *, Field); bool field_focus_in_event (GdkEventFocus *, Field); bool field_focus_out_event (GdkEventFocus *, Field); + bool drop_focus_handler (GdkEventFocus*); void set_smpte (nframes_t, bool); void set_bbt (nframes_t, bool); @@ -196,6 +200,8 @@ class AudioClock : public Gtk::HBox void set_size_requests (); static const uint32_t field_length[(int)AudioFrames+1]; + static bool _has_focus; + }; #endif /* __audio_clock_h__ */ diff --git a/gtk2_ardour/editor_region_list.cc b/gtk2_ardour/editor_region_list.cc index 18e71e8850..9aa73022fa 100644 --- a/gtk2_ardour/editor_region_list.cc +++ b/gtk2_ardour/editor_region_list.cc @@ -566,7 +566,16 @@ Editor::region_list_selection_mapover (slot<void,boost::shared_ptr<Region> > sl) TreeIter iter; if ((iter = region_list_model->get_iter (*i))) { - sl (((*iter)[region_list_columns.region])); + + /* some rows don't have a region associated with them, but can still be + selected (XXX maybe prevent them from being selected) + */ + + boost::shared_ptr<Region> r = (*iter)[region_list_columns.region]; + + if (r) { + sl (r); + } } } } diff --git a/gtk2_ardour/keyboard.cc b/gtk2_ardour/keyboard.cc index 83918da918..90fea321de 100644 --- a/gtk2_ardour/keyboard.cc +++ b/gtk2_ardour/keyboard.cc @@ -54,6 +54,25 @@ Keyboard* Keyboard::_the_keyboard = 0; GdkModifierType Keyboard::RelevantModifierKeyMask; +bool Keyboard::_some_magic_widget_has_focus = false; + +void +Keyboard::magic_widget_grab_focus () +{ + _some_magic_widget_has_focus = true; +} + +void +Keyboard::magic_widget_drop_focus () +{ + _some_magic_widget_has_focus = false; +} + +bool +Keyboard::some_magic_widget_has_focus () +{ + return _some_magic_widget_has_focus; +} Keyboard::Keyboard () { diff --git a/gtk2_ardour/keyboard.h b/gtk2_ardour/keyboard.h index ec55dc54db..c1351bfaf6 100644 --- a/gtk2_ardour/keyboard.h +++ b/gtk2_ardour/keyboard.h @@ -90,6 +90,10 @@ class Keyboard : public sigc::trackable, Stateful static Keyboard& the_keyboard() { return *_the_keyboard; } + static bool some_magic_widget_has_focus (); + static void magic_widget_grab_focus (); + static void magic_widget_drop_focus (); + private: static Keyboard* _the_keyboard; @@ -104,6 +108,8 @@ class Keyboard : public sigc::trackable, Stateful static gint _snooper (GtkWidget*, GdkEventKey*, gpointer); gint snooper (GtkWidget*, GdkEventKey*); + + static bool _some_magic_widget_has_focus; }; #endif /* __ardour_keyboard_h__ */ diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc index b4d02591e9..d574ece427 100644 --- a/gtk2_ardour/utils.cc +++ b/gtk2_ardour/utils.cc @@ -347,14 +347,14 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev) #endif if (focus) { - if (GTK_IS_ENTRY(focus)) { + if (GTK_IS_ENTRY(focus) || Keyboard::some_magic_widget_has_focus()) { special_handling_of_unmodified_accelerators = true; } } #ifdef DEBUG_ACCELERATOR_HANDLING if (debug) { - cerr << "Key event: code = " << ev->keyval << " state = " << hex << ev->state << dec << " focus is an entry ? " + cerr << "Win = " << win << " Key event: code = " << ev->keyval << " state = " << hex << ev->state << dec << " special handling ? " << special_handling_of_unmodified_accelerators << endl; } @@ -456,14 +456,25 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev) /* no modifiers, propagate first */ #ifdef DEBUG_ACCELERATOR_HANDLING + if (debug) { + cerr << "\tpropagate, then activate\n"; + } +#endif + if (!gtk_window_propagate_key_event (win, ev)) { +#ifdef DEBUG_ACCELERATOR_HANDLING if (debug) { - cerr << "\tactivate, then propagate\n"; + cerr << "\tpropagation didn't handle, so activate\n"; } #endif - if (!gtk_window_propagate_key_event (win, ev)) { return gtk_window_activate_key (win, ev); - } - + } else { +#ifdef DEBUG_ACCELERATOR_HANDLING + if (debug) { + cerr << "\thandled by propagate\n"; + } +#endif + return true; + } #ifdef DEBUG_ACCELERATOR_HANDLING if (debug) { |