From: Paul Davis Date: Thu, 30 Nov 2006 16:43:11 +0000 (+0000) Subject: timecode clock info patch from oofus, big clock mods from oofus, rec-sensitive color... X-Git-Tag: 2.0beta10~91 X-Git-Url: https://main.carlh.net/gitweb/?a=commitdiff_plain;h=9f2164b4f3b030177a229ddc3e87eb431af1bd54;p=ardour.git timecode clock info patch from oofus, big clock mods from oofus, rec-sensitive color in big clock, update all transport clocks when changing playhead, bounds check for automation bug git-svn-id: svn://localhost/ardour2/trunk@1173 d708f5d6-7413-0410-9779-e7cbd77b26cf --- diff --git a/gtk2_ardour/ardour2_ui.rc b/gtk2_ardour/ardour2_ui.rc index 642a2e8382..d28b6622e7 100644 --- a/gtk2_ardour/ardour2_ui.rc +++ b/gtk2_ardour/ardour2_ui.rc @@ -127,13 +127,6 @@ style "base_frame" bg[NORMAL] = { 0.35, 0.35, 0.40 } } - -style "red_frame" -{ - fg[NORMAL] = { 1.0, 0.0, 0.0 } - bg[NORMAL] = { 1.0, 0.0, 0.0 } -} - style "transport_base" = "medium_bold_text" { bg[NORMAL] = { 0.10, 0.10, 0.10 } @@ -498,9 +491,25 @@ style "small_red_on_black_entry" = "small_bold_text" bg[ACTIVE] = { 0.0, 0.0, 0.0 } } -style "big_clock_display" = "medium_entry" +style "non_recording_big_clock_display" = "medium_entry" { - font_name = "courier bold 34" + font_name = "sans 60" + + fg[NORMAL] = { 0.50, 1.0, 0.50 } + fg[ACTIVE] = { 1.0, 0, 0.0 } + fg[SELECTED] = { 1.0, 0, 0 } + fg[PRELIGHT] = { 1.0, 0, 0.0 } + fg[INSENSITIVE] = { 1.0, 0, 0.0 } + + base[NORMAL] = { 0.0, 0.0, 0.0 } + base[ACTIVE] = { 0.0, 0.0, 0.0 } + bg[NORMAL] = { 0.0, 0.0, 0.0 } + bg[ACTIVE] = { 0.7, 0.0, 0.0 } +} + +style "recording_big_clock_display" = "non_recording_big_clock_display" +{ + fg[NORMAL] = { 1.0, 0, 0 } } style "transport_clock_display" @@ -521,7 +530,7 @@ style "transport_clock_display" style "tempo_meter_clock_display" { - font_name = "sans 8" + font_name = "sans 7" fg[NORMAL] = { 1.0, 1.0, 1.0 } fg[ACTIVE] = { 1.0, 1.0, 0.0 } fg[SELECTED] = { 1.0, 0, 0 } @@ -1075,11 +1084,16 @@ widget "*ErrorMessage" style "error_message" widget "*FatalMessage" style "fatal_message" widget "*InfoMessage" style "info_message" widget "*WarningMessage" style "warning_message" -widget "*BigClockDisplay" style "big_clock_display" +widget "*BigClockNonRecording" style "non_recording_big_clock_display" +widget "*BigClockRecording" style "recording_big_clock_display" widget "*TransportClockDisplay" style "transport_clock_display" widget "*SecondaryClockDisplay" style "transport_clock_display" -widget "*BBTTempoLabel" style "tempo_meter_clock_display" -widget "*BBTMeterLabel" style "tempo_meter_clock_display" +widget "*AudioClockFramesUpperInfo" style "tempo_meter_clock_display" +widget "*AudioClockFramesLowerInfo" style "tempo_meter_clock_display" +widget "*AudioClockSMPTEUpperInfo" style "tempo_meter_clock_display" +widget "*AudioClockSMPTELowerInfo" style "tempo_meter_clock_display" +widget "*AudioClockBBTUpperInfo" style "tempo_meter_clock_display" +widget "*AudioClockBBTLowerInfo" style "tempo_meter_clock_display" widget "*SelectionStartClock" style "default_clock_display" widget "*SelectionEndClock" style "default_clock_display" widget "*EditCursorClock" style "default_clock_display" @@ -1110,7 +1124,6 @@ widget "*BBTRuler" style "editor_time_ruler" widget "*FramesRuler" style "editor_time_ruler" widget "*MinSecRuler" style "editor_time_ruler" widget "*BaseFrame" style "base_frame" -widget "*RedFrame" style "red_frame" widget "*AudioTrackStripBase" style "audio_track_base" widget "*TimeAxisViewControlsBaseUnselected" style "audio_track_base" widget "*AudioTrackControlsBaseUnselected" style "audio_track_base" diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index efd9fe92ba..952e8dd02d 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -108,7 +108,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) /* big clock */ - big_clock ("BigClockDisplay", true, false, true), + big_clock ("BigClockNonRecording", true, false, true), /* transport */ @@ -2401,3 +2401,32 @@ ARDOUR_UI::use_config () ract->set_active (); } } + +void +ARDOUR_UI::update_transport_clocks (nframes_t pos) +{ + primary_clock.set (pos); + secondary_clock.set (pos); + + if (big_clock_window) { + big_clock.set (pos); + } +} + +void +ARDOUR_UI::record_state_changed () +{ + if (!session || !big_clock_window) { + /* why bother - the clock isn't visible */ + return; + } + + switch (session->record_status()) { + case Session::Recording: + big_clock.set_name ("BigClockRecording"); + break; + default: + big_clock.set_name ("BigClockNonRecording"); + break; + } +} diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index d5747cb325..1b7a5572fa 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -325,6 +325,9 @@ class ARDOUR_UI : public Gtkmm2ext::UI Gtk::Frame big_clock_frame; Gtk::Window* big_clock_window; + void update_transport_clocks (nframes_t pos); + void record_state_changed (); + /* Transport Control */ void detach_tearoff (Gtk::Box* parent, Gtk::Widget* contents); diff --git a/gtk2_ardour/ardour_ui_dependents.cc b/gtk2_ardour/ardour_ui_dependents.cc index 0603fc6baa..e00a769a37 100644 --- a/gtk2_ardour/ardour_ui_dependents.cc +++ b/gtk2_ardour/ardour_ui_dependents.cc @@ -57,6 +57,7 @@ void ARDOUR_UI::we_have_dependents () { setup_keybindings (); + editor->UpdateAllTransportClocks.connect (mem_fun (*this, &ARDOUR_UI::update_transport_clocks)); } void diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc index fe5963c535..e467b2e232 100644 --- a/gtk2_ardour/ardour_ui_dialogs.cc +++ b/gtk2_ardour/ardour_ui_dialogs.cc @@ -50,6 +50,7 @@ ARDOUR_UI::connect_to_session (Session *s) session = s; session->HaltOnXrun.connect (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message)); + session->RecordStateChanged.connect (mem_fun (*this, &ARDOUR_UI::record_state_changed)); /* sensitize menu bar options that are now valid */ diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc index 270da7ab11..87a6257fee 100644 --- a/gtk2_ardour/audio_clock.cc +++ b/gtk2_ardour/audio_clock.cc @@ -58,7 +58,7 @@ const uint32_t AudioClock::field_length[(int) AudioClock::AudioFrames+1] = { 10 /* Audio Frame */ }; -AudioClock::AudioClock (const string& name, bool allow_edit, bool duration, bool with_extras) +AudioClock::AudioClock (std::string name, bool allow_edit, bool duration, bool with_info) : is_duration (duration), editable (allow_edit), colon1 (":"), @@ -75,9 +75,48 @@ AudioClock::AudioClock (const string& name, bool allow_edit, bool duration, bool ops_menu = 0; dragging = false; + if (with_info) { + frames_upper_info_label = manage (new Label); + frames_lower_info_label = manage (new Label); + smpte_upper_info_label = manage (new Label); + smpte_lower_info_label = manage (new Label); + bbt_upper_info_label = manage (new Label); + bbt_lower_info_label = manage (new Label); + + frames_upper_info_label->set_name ("AudioClockFramesUpperInfo"); + frames_lower_info_label->set_name ("AudioClockFramesLowerInfo"); + smpte_upper_info_label->set_name ("AudioClockSMPTEUpperInfo"); + smpte_lower_info_label->set_name ("AudioClockSMPTELowerInfo"); + bbt_upper_info_label->set_name ("AudioClockBBTUpperInfo"); + bbt_lower_info_label->set_name ("AudioClockBBTLowerInfo"); + + frames_info_box.pack_start (*frames_upper_info_label, true, true); + frames_info_box.pack_start (*frames_lower_info_label, true, true); + smpte_info_box.pack_start (*smpte_upper_info_label, true, true); + smpte_info_box.pack_start (*smpte_lower_info_label, true, true); + bbt_info_box.pack_start (*bbt_upper_info_label, true, true); + bbt_info_box.pack_start (*bbt_lower_info_label, true, true); + + } else { + frames_upper_info_label = 0; + frames_lower_info_label = 0; + smpte_upper_info_label = 0; + smpte_lower_info_label = 0; + bbt_upper_info_label = 0; + bbt_lower_info_label = 0; + } + audio_frames_ebox.add (audio_frames_label); - frames_packer_hbox.set_border_width (2); - frames_packer_hbox.pack_start (audio_frames_ebox, false, false); + + frames_packer.set_homogeneous (false); + frames_packer.set_border_width (2); + frames_packer.pack_start (audio_frames_ebox, false, false); + + if (with_info) { + frames_packer.pack_start (frames_info_box, false, false, 5); + } + + frames_packer_hbox.pack_start (frames_packer, true, false); hours_ebox.add (hours_label); minutes_ebox.add (minutes_label); @@ -100,6 +139,10 @@ AudioClock::AudioClock (const string& name, bool allow_edit, bool duration, bool smpte_packer.pack_start (colon3, false, false); smpte_packer.pack_start (frames_ebox, false, false); + if (with_info) { + smpte_packer.pack_start (smpte_info_box, false, false, 5); + } + smpte_packer_hbox.pack_start (smpte_packer, true, false); bbt_packer.set_homogeneous (false); @@ -110,34 +153,8 @@ AudioClock::AudioClock (const string& name, bool allow_edit, bool duration, bool bbt_packer.pack_start (b2, false, false); bbt_packer.pack_start (ticks_ebox, false, false); - if (with_extras) { - - framerate_label = manage (new Label); - pullup_label = manage (new Label); - - framerate_label->set_name ("BBTMeterLabel"); - pullup_label->set_name ("BBTTempoLabel"); - - rate_pullup_box.pack_start (*framerate_label, true, true); - rate_pullup_box.pack_start (*pullup_label, true, true); - - smpte_packer.pack_start (rate_pullup_box, false,false, 5); - - meter_label = manage (new Label); - tempo_label = manage (new Label); - - meter_label->set_name ("BBTMeterLabel"); - tempo_label->set_name ("BBTTempoLabel"); - - tempo_meter_box.pack_start (*meter_label, true, true); - tempo_meter_box.pack_start (*tempo_label, true, true); - - bbt_packer.pack_start (tempo_meter_box, false, false, 5); - } else { - framerate_label = 0; - pullup_label = 0; - meter_label = 0; - tempo_label = 0; + if (with_info) { + bbt_packer.pack_start (bbt_info_box, false, false, 5); } bbt_packer_hbox.pack_start (bbt_packer, true, false); @@ -152,7 +169,46 @@ AudioClock::AudioClock (const string& name, bool allow_edit, bool duration, bool minsec_packer_hbox.pack_start (minsec_packer, true, false); + clock_frame.set_shadow_type (Gtk::SHADOW_IN); + clock_frame.set_name ("BaseFrame"); + + clock_frame.add (clock_base); + set_name (name); + + _mode = BBT; /* lie to force mode switch */ + set_mode (SMPTE); + + pack_start (clock_frame, true, true); + + /* the clock base handles button releases for menu popup regardless of + editable status. if the clock is editable, the clock base is where + we pass focus to after leaving the last editable "field", which + will then shutdown editing till the user starts it up again. + + it does this because the focus out event on the field disables + keyboard event handling, and we don't connect anything up to + notice focus in on the clock base. hence, keyboard event handling + stays disabled. + */ + + clock_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::SCROLL_MASK); + clock_base.signal_button_release_event().connect (bind (mem_fun (*this, &AudioClock::field_button_release_event), SMPTE_Hours)); + + Session::SMPTEOffsetChanged.connect (mem_fun (*this, &AudioClock::smpte_offset_changed)); + + if (editable) { + setup_events (); + } + + set (last_when, true); +} + +void +AudioClock::set_name (string name) +{ + Widget::set_name (name); + clock_base.set_name (name); audio_frames_label.set_name (name); @@ -186,37 +242,7 @@ AudioClock::AudioClock (const string& name, bool allow_edit, bool duration, bool b1.set_name (name); b2.set_name (name); - clock_frame.set_shadow_type (Gtk::SHADOW_IN); - clock_frame.set_name ("BaseFrame"); - - clock_frame.add (clock_base); - - _mode = BBT; /* lie to force mode switch */ - set_mode (SMPTE); - - pack_start (clock_frame, true, true); - - /* the clock base handles button releases for menu popup regardless of - editable status. if the clock is editable, the clock base is where - we pass focus to after leaving the last editable "field", which - will then shutdown editing till the user starts it up again. - - it does this because the focus out event on the field disables - keyboard event handling, and we don't connect anything up to - notice focus in on the clock base. hence, keyboard event handling - stays disabled. - */ - - clock_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::SCROLL_MASK); - clock_base.signal_button_release_event().connect (bind (mem_fun (*this, &AudioClock::field_button_release_event), SMPTE_Hours)); - - Session::SMPTEOffsetChanged.connect (mem_fun (*this, &AudioClock::smpte_offset_changed)); - - if (editable) { - setup_events (); - } - - set (last_when, true); + queue_draw (); } void @@ -404,6 +430,27 @@ AudioClock::set_frames (nframes_t when, bool force) char buf[32]; snprintf (buf, sizeof (buf), "%u", when); audio_frames_label.set_text (buf); + + if (frames_upper_info_label) { + nframes_t rate = session->frame_rate(); + + if (fmod (rate, 1000.0) == 0.000) { + sprintf (buf, "%uK", rate/1000); + } else { + sprintf (buf, "%.3fK", rate/1000.0f); + } + + frames_upper_info_label->set_text (buf); + + float vid_pullup = Config->get_video_pullup(); + + if (vid_pullup == 0.0) { + frames_lower_info_label->set_text(_("none")); + } else { + sprintf (buf, "%-6.4f", vid_pullup); + frames_lower_info_label->set_text (buf); + } + } } void @@ -481,19 +528,25 @@ AudioClock::set_smpte (nframes_t when, bool force) frames_label.set_text (buf); last_frames = smpte.frames; } - - if (framerate_label) { - sprintf (buf, "%-5.2f", Config->get_smpte_frames_per_second()); - framerate_label->set_text (buf); - - float x = Config->get_video_pullup(); - - if (x == 0.0) { - pullup_label->set_text (_("none")); + + if (smpte_upper_info_label) { + float smpte_frames = Config->get_smpte_frames_per_second(); + + if ( fmod(smpte_frames, 1.0) == 0.0) { + sprintf (buf, "%u", int (smpte_frames)); + } else { + sprintf (buf, "%.2f", smpte_frames); + } + + smpte_upper_info_label->set_text (buf); + + if (Config->get_smpte_drop_frames()) { + sprintf (buf, "DF"); } else { - sprintf (buf, "%-6.4f", x); - pullup_label->set_text (buf); + sprintf (buf, "NDF"); } + + smpte_lower_info_label->set_text (buf); } } @@ -511,12 +564,12 @@ AudioClock::set_bbt (nframes_t when, bool force) sprintf (buf, "%04" PRIu32, bbt.ticks); ticks_label.set_text (buf); - if (meter_label) { + if (bbt_upper_info_label) { TempoMap::Metric m (session->tempo_map().metric_at (when)); sprintf (buf, "%-5.2f", m.tempo().beats_per_minute()); - tempo_label->set_text (buf); + bbt_lower_info_label->set_text (buf); sprintf (buf, "%g|%g", m.meter().beats_per_bar(), m.meter().note_divisor()); - meter_label->set_text (buf); + bbt_upper_info_label->set_text (buf); } } @@ -1812,26 +1865,26 @@ AudioClock::set_size_requests () switch (_mode) { case SMPTE: - Gtkmm2ext::set_size_request_to_display_given_text (hours_label, "-88", 2, 2); - Gtkmm2ext::set_size_request_to_display_given_text (minutes_label, "88", 2, 2); - Gtkmm2ext::set_size_request_to_display_given_text (seconds_label, "88", 2, 2); - Gtkmm2ext::set_size_request_to_display_given_text (frames_label, "88", 2, 2); + Gtkmm2ext::set_size_request_to_display_given_text (hours_label, "-00", 5, 5); + Gtkmm2ext::set_size_request_to_display_given_text (minutes_label, "00", 5, 5); + Gtkmm2ext::set_size_request_to_display_given_text (seconds_label, "00", 5, 5); + Gtkmm2ext::set_size_request_to_display_given_text (frames_label, "00", 5, 5); break; case BBT: - Gtkmm2ext::set_size_request_to_display_given_text (bars_label, "-888", 2, 2); - Gtkmm2ext::set_size_request_to_display_given_text (beats_label, "88", 2, 2); - Gtkmm2ext::set_size_request_to_display_given_text (ticks_label, "8888", 2, 2); + Gtkmm2ext::set_size_request_to_display_given_text (bars_label, "-000", 5, 5); + Gtkmm2ext::set_size_request_to_display_given_text (beats_label, "00", 5, 5); + Gtkmm2ext::set_size_request_to_display_given_text (ticks_label, "0000", 5, 5); break; case MinSec: - Gtkmm2ext::set_size_request_to_display_given_text (ms_hours_label, "99", 2, 2); - Gtkmm2ext::set_size_request_to_display_given_text (ms_minutes_label, "99", 2, 2); - Gtkmm2ext::set_size_request_to_display_given_text (ms_seconds_label, "99.999", 2, 2); + Gtkmm2ext::set_size_request_to_display_given_text (ms_hours_label, "00", 5, 5); + Gtkmm2ext::set_size_request_to_display_given_text (ms_minutes_label, "00", 5, 5); + Gtkmm2ext::set_size_request_to_display_given_text (ms_seconds_label, "00.000", 5, 5); break; case Frames: - Gtkmm2ext::set_size_request_to_display_given_text (audio_frames_label, "4294967296", 2, 2); + Gtkmm2ext::set_size_request_to_display_given_text (audio_frames_label, "0000000000", 5, 5); break; case Off: diff --git a/gtk2_ardour/audio_clock.h b/gtk2_ardour/audio_clock.h index 147058ef4d..6ac97a5624 100644 --- a/gtk2_ardour/audio_clock.h +++ b/gtk2_ardour/audio_clock.h @@ -43,19 +43,21 @@ class AudioClock : public Gtk::HBox Off }; - AudioClock (const string& name, bool editable, bool is_duration = false, bool with_tempo_meter = false); + AudioClock (std::string name, bool editable, bool is_duration = false, bool with_info = false); Mode mode() const { return _mode; } void set (nframes_t, bool force = false); void set_mode (Mode); + + void set_name (std::string); nframes_t current_time (nframes_t position = 0) const; nframes_t current_duration (nframes_t position = 0) const; void set_session (ARDOUR::Session *s); sigc::signal ValueChanged; - + private: ARDOUR::Session *session; Mode _mode; @@ -75,6 +77,7 @@ class AudioClock : public Gtk::HBox Gtk::HBox bbt_packer; Gtk::HBox frames_packer_hbox; + Gtk::HBox frames_packer; enum Field { SMPTE_Hours, @@ -112,11 +115,6 @@ class AudioClock : public Gtk::HBox Gtk::Label frames_label; Gtk::Label colon1, colon2, colon3; - Gtk::Label* framerate_label; - Gtk::Label* pullup_label; - - Gtk::VBox rate_pullup_box; - Gtk::Label ms_hours_label; Gtk::Label ms_minutes_label; Gtk::Label ms_seconds_label; @@ -128,10 +126,18 @@ class AudioClock : public Gtk::HBox Gtk::Label b1; Gtk::Label b2; - Gtk::Label* tempo_label; - Gtk::Label* meter_label; + Gtk::Label* frames_upper_info_label; + Gtk::Label* frames_lower_info_label; + + Gtk::Label* smpte_upper_info_label; + Gtk::Label* smpte_lower_info_label; + + Gtk::Label* bbt_upper_info_label; + Gtk::Label* bbt_lower_info_label; - Gtk::VBox tempo_meter_box; + Gtk::VBox frames_info_box; + Gtk::VBox smpte_info_box; + Gtk::VBox bbt_info_box; Gtk::EventBox clock_base; Gtk::Frame clock_frame; diff --git a/gtk2_ardour/audio_region_editor.cc b/gtk2_ardour/audio_region_editor.cc index 9c98fb3bab..0852072132 100644 --- a/gtk2_ardour/audio_region_editor.cc +++ b/gtk2_ardour/audio_region_editor.cc @@ -128,8 +128,6 @@ AudioRegionEditor::AudioRegionEditor (Session& s, boost::shared_ptr name_changed (); bounds_changed (Change (StartChanged|LengthChanged|PositionChanged)); - XMLNode *node = _region->extra_xml ("GUI"); - _region->StateChanged.connect (mem_fun(*this, &AudioRegionEditor::region_changed)); spin_arrow_grab = false; diff --git a/gtk2_ardour/automation_line.cc b/gtk2_ardour/automation_line.cc index 116a3e63ba..222a112cbf 100644 --- a/gtk2_ardour/automation_line.cc +++ b/gtk2_ardour/automation_line.cc @@ -465,8 +465,10 @@ AutomationLine::modify_view_point (ControlPoint& cp, double x, double y, bool wi void AutomationLine::reset_line_coords (ControlPoint& cp) { - line_points[cp.view_index].set_x (cp.get_x()); - line_points[cp.view_index].set_y (cp.get_y()); + if (cp.view_index < line_points.size()) { + line_points[cp.view_index].set_x (cp.get_x()); + line_points[cp.view_index].set_y (cp.get_y()); + } } void diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index c8ef4c5599..da058095ea 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -1978,6 +1978,8 @@ Editor::cursor_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event) if (cursor == edit_cursor) { edit_cursor_clock.set (cursor->current_frame); + } else { + UpdateAllTransportClocks (cursor->current_frame); } show_verbose_time_cursor (cursor->current_frame, 10); diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index fedb8abb8b..3b50765d42 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -138,6 +138,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulThingWithGoingAway sigc::signal Resized; sigc::signal Realized; sigc::signal GoingAway; + sigc::signal UpdateAllTransportClocks; Glib::RefPtr editor_actions; diff --git a/gtk2_ardour/time_axis_view.h b/gtk2_ardour/time_axis_view.h index 796ef0cbaa..3a652bd0ea 100644 --- a/gtk2_ardour/time_axis_view.h +++ b/gtk2_ardour/time_axis_view.h @@ -31,6 +31,8 @@ #include #include +#include + #include #include @@ -120,7 +122,7 @@ class TimeAxisView : public virtual AxisView Gtk::VBox controls_vbox; Gtk::HBox name_hbox; Gtk::Frame name_frame; - Gtk::Entry name_entry; + Gtkmm2ext::FocusEntry name_entry; void hide_name_label (); void hide_name_entry ();