Fix 6609: Right-click in active track name box crashes

When right-clicking in the text entry, popup menu grabs focus. Consequently, the "focus out" handler is called, destroys the text entry and replaces it by the label name of the track.
When menu pops up, it tries to access to a widget no longer available.
This commit is contained in:
Julien ROGER 2016-02-10 23:52:03 +01:00 committed by Tim Mayberry
parent 108528b63d
commit 1fbe4253aa
2 changed files with 14 additions and 0 deletions

View File

@ -104,6 +104,7 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie
, _editor (ed)
, name_entry (0)
, ending_name_edit (false)
, by_popup_menu (false)
, control_parent (0)
, _order (0)
, _effective_height (0)
@ -652,10 +653,20 @@ TimeAxisView::name_entry_key_release (GdkEventKey* ev)
bool
TimeAxisView::name_entry_focus_out (GdkEventFocus*)
{
if (by_popup_menu) {
by_popup_menu = false;
return false;
}
end_name_edit (RESPONSE_OK);
return false;
}
void
TimeAxisView::name_entry_populate_popup (Gtk::Menu *)
{
by_popup_menu = true;
}
void
TimeAxisView::begin_name_edit ()
{
@ -675,6 +686,7 @@ TimeAxisView::begin_name_edit ()
name_entry->signal_focus_out_event().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_focus_out));
name_entry->set_text (name_label.get_text());
name_entry->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &TimeAxisView::end_name_edit), RESPONSE_OK));
name_entry->signal_populate_popup().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_populate_popup));
if (name_label.is_ancestor (name_hbox)) {
name_hbox.remove (name_label);

View File

@ -257,9 +257,11 @@ class TimeAxisView : public virtual AxisView
bool name_entry_key_release (GdkEventKey *ev);
bool name_entry_key_press (GdkEventKey *ev);
bool name_entry_focus_out (GdkEventFocus *ev);
void name_entry_populate_popup (Gtk::Menu *);
Gtk::Entry* name_entry;
bool ending_name_edit;
bool by_popup_menu;
void begin_name_edit ();
void end_name_edit (int);