editor window layout changes, and lots more
[ardour.git] / gtk2_ardour / audio_clock.cc
index c438b3d86c5ae50877fffd5ff92c72bf1b131425..550b7c311f344e0472d4cc0f0d95e3b97e50fee8 100644 (file)
@@ -25,6 +25,7 @@
 #include <ardour/ardour.h>
 #include <ardour/session.h>
 #include <ardour/tempo.h>
+#include <sigc++/bind.h>
 
 #include "ardour_ui.h"
 #include "audio_clock.h"
@@ -186,7 +187,7 @@ AudioClock::AudioClock (const string& name, bool allow_edit, bool duration, bool
        */
 
        clock_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
-       clock_base.button_release_event.connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), SMPTE_Hours));
+       clock_base.signal_button_release_event().connect (bind (mem_fun (*this, &AudioClock::field_button_release_event), SMPTE_Hours));
 
        if (editable) {
                setup_events ();
@@ -224,53 +225,53 @@ AudioClock::setup_events ()
        ms_minutes_ebox.set_flags (Gtk::CAN_FOCUS);
        ms_seconds_ebox.set_flags (Gtk::CAN_FOCUS);
 
-       hours_ebox.motion_notify_event.connect (bind (mem_fun(*this, &AudioClock::field_motion_notify_event), SMPTE_Hours));
-       minutes_ebox.motion_notify_event.connect (bind (mem_fun(*this, &AudioClock::field_motion_notify_event), SMPTE_Minutes));
-       seconds_ebox.motion_notify_event.connect (bind (mem_fun(*this, &AudioClock::field_motion_notify_event), SMPTE_Seconds));
-       frames_ebox.motion_notify_event.connect (bind (mem_fun(*this, &AudioClock::field_motion_notify_event), SMPTE_Frames));
-       audio_frames_ebox.motion_notify_event.connect (bind (mem_fun(*this, &AudioClock::field_motion_notify_event), AudioFrames));
-       bars_ebox.motion_notify_event.connect (bind (mem_fun(*this, &AudioClock::field_motion_notify_event), Bars));
-       beats_ebox.motion_notify_event.connect (bind (mem_fun(*this, &AudioClock::field_motion_notify_event), Beats));
-       ticks_ebox.motion_notify_event.connect (bind (mem_fun(*this, &AudioClock::field_motion_notify_event), Ticks));
-       ms_hours_ebox.motion_notify_event.connect (bind (mem_fun(*this, &AudioClock::field_motion_notify_event), MS_Hours));
-       ms_minutes_ebox.motion_notify_event.connect (bind (mem_fun(*this, &AudioClock::field_motion_notify_event), MS_Minutes));
-       ms_seconds_ebox.motion_notify_event.connect (bind (mem_fun(*this, &AudioClock::field_motion_notify_event), MS_Seconds));
-
-       hours_ebox.button_press_event.connect (bind (mem_fun(*this, &AudioClock::field_button_press_event), SMPTE_Hours));
-       minutes_ebox.button_press_event.connect (bind (mem_fun(*this, &AudioClock::field_button_press_event), SMPTE_Minutes));
-       seconds_ebox.button_press_event.connect (bind (mem_fun(*this, &AudioClock::field_button_press_event), SMPTE_Seconds));
-       frames_ebox.button_press_event.connect (bind (mem_fun(*this, &AudioClock::field_button_press_event), SMPTE_Frames));
-       audio_frames_ebox.button_press_event.connect (bind (mem_fun(*this, &AudioClock::field_button_press_event), AudioFrames));
-       bars_ebox.button_press_event.connect (bind (mem_fun(*this, &AudioClock::field_button_press_event), Bars));
-       beats_ebox.button_press_event.connect (bind (mem_fun(*this, &AudioClock::field_button_press_event), Beats));
-       ticks_ebox.button_press_event.connect (bind (mem_fun(*this, &AudioClock::field_button_press_event), Ticks));
-       ms_hours_ebox.button_press_event.connect (bind (mem_fun(*this, &AudioClock::field_button_press_event), MS_Hours));
-       ms_minutes_ebox.button_press_event.connect (bind (mem_fun(*this, &AudioClock::field_button_press_event), MS_Minutes));
-       ms_seconds_ebox.button_press_event.connect (bind (mem_fun(*this, &AudioClock::field_button_press_event), MS_Seconds));
-
-       hours_ebox.button_release_event.connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), SMPTE_Hours));
-       minutes_ebox.button_release_event.connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), SMPTE_Minutes));
-       seconds_ebox.button_release_event.connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), SMPTE_Seconds));
-       frames_ebox.button_release_event.connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), SMPTE_Frames));
-       audio_frames_ebox.button_release_event.connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), AudioFrames));
-       bars_ebox.button_release_event.connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), Bars));
-       beats_ebox.button_release_event.connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), Beats));
-       ticks_ebox.button_release_event.connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), Ticks));
-       ms_hours_ebox.button_release_event.connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), MS_Hours));
-       ms_minutes_ebox.button_release_event.connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), MS_Minutes));
-       ms_seconds_ebox.button_release_event.connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), MS_Seconds));
-
-       hours_ebox.key_release_event.connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), SMPTE_Hours));
-       minutes_ebox.key_release_event.connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), SMPTE_Minutes));
-       seconds_ebox.key_release_event.connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), SMPTE_Seconds));
-       frames_ebox.key_release_event.connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), SMPTE_Frames));
-       audio_frames_ebox.key_release_event.connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), AudioFrames));
-       bars_ebox.key_release_event.connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), Bars));
-       beats_ebox.key_release_event.connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), Beats));
-       ticks_ebox.key_release_event.connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), Ticks));
-       ms_hours_ebox.key_release_event.connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), MS_Hours));
-       ms_minutes_ebox.key_release_event.connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), MS_Minutes));
-       ms_seconds_ebox.key_release_event.connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), MS_Seconds));
+       hours_ebox.signal_motion_notify_event().connect (bind (mem_fun(*this, &AudioClock::field_motion_notify_event), SMPTE_Hours));
+       minutes_ebox.signal_motion_notify_event().connect (bind (mem_fun(*this, &AudioClock::field_motion_notify_event), SMPTE_Minutes));
+       seconds_ebox.signal_motion_notify_event().connect (bind (mem_fun(*this, &AudioClock::field_motion_notify_event), SMPTE_Seconds));
+       frames_ebox.signal_motion_notify_event().connect (bind (mem_fun(*this, &AudioClock::field_motion_notify_event), SMPTE_Frames));
+       audio_frames_ebox.signal_motion_notify_event().connect (bind (mem_fun(*this, &AudioClock::field_motion_notify_event), AudioFrames));
+       bars_ebox.signal_motion_notify_event().connect (bind (mem_fun(*this, &AudioClock::field_motion_notify_event), Bars));
+       beats_ebox.signal_motion_notify_event().connect (bind (mem_fun(*this, &AudioClock::field_motion_notify_event), Beats));
+       ticks_ebox.signal_motion_notify_event().connect (bind (mem_fun(*this, &AudioClock::field_motion_notify_event), Ticks));
+       ms_hours_ebox.signal_motion_notify_event().connect (bind (mem_fun(*this, &AudioClock::field_motion_notify_event), MS_Hours));
+       ms_minutes_ebox.signal_motion_notify_event().connect (bind (mem_fun(*this, &AudioClock::field_motion_notify_event), MS_Minutes));
+       ms_seconds_ebox.signal_motion_notify_event().connect (bind (mem_fun(*this, &AudioClock::field_motion_notify_event), MS_Seconds));
+
+       hours_ebox.signal_button_press_event().connect (bind (mem_fun(*this, &AudioClock::field_button_press_event), SMPTE_Hours));
+       minutes_ebox.signal_button_press_event().connect (bind (mem_fun(*this, &AudioClock::field_button_press_event), SMPTE_Minutes));
+       seconds_ebox.signal_button_press_event().connect (bind (mem_fun(*this, &AudioClock::field_button_press_event), SMPTE_Seconds));
+       frames_ebox.signal_button_press_event().connect (bind (mem_fun(*this, &AudioClock::field_button_press_event), SMPTE_Frames));
+       audio_frames_ebox.signal_button_press_event().connect (bind (mem_fun(*this, &AudioClock::field_button_press_event), AudioFrames));
+       bars_ebox.signal_button_press_event().connect (bind (mem_fun(*this, &AudioClock::field_button_press_event), Bars));
+       beats_ebox.signal_button_press_event().connect (bind (mem_fun(*this, &AudioClock::field_button_press_event), Beats));
+       ticks_ebox.signal_button_press_event().connect (bind (mem_fun(*this, &AudioClock::field_button_press_event), Ticks));
+       ms_hours_ebox.signal_button_press_event().connect (bind (mem_fun(*this, &AudioClock::field_button_press_event), MS_Hours));
+       ms_minutes_ebox.signal_button_press_event().connect (bind (mem_fun(*this, &AudioClock::field_button_press_event), MS_Minutes));
+       ms_seconds_ebox.signal_button_press_event().connect (bind (mem_fun(*this, &AudioClock::field_button_press_event), MS_Seconds));
+
+       hours_ebox.signal_button_release_event().connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), SMPTE_Hours));
+       minutes_ebox.signal_button_release_event().connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), SMPTE_Minutes));
+       seconds_ebox.signal_button_release_event().connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), SMPTE_Seconds));
+       frames_ebox.signal_button_release_event().connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), SMPTE_Frames));
+       audio_frames_ebox.signal_button_release_event().connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), AudioFrames));
+       bars_ebox.signal_button_release_event().connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), Bars));
+       beats_ebox.signal_button_release_event().connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), Beats));
+       ticks_ebox.signal_button_release_event().connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), Ticks));
+       ms_hours_ebox.signal_button_release_event().connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), MS_Hours));
+       ms_minutes_ebox.signal_button_release_event().connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), MS_Minutes));
+       ms_seconds_ebox.signal_button_release_event().connect (bind (mem_fun(*this, &AudioClock::field_button_release_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));
+       frames_ebox.signal_key_release_event().connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), SMPTE_Frames));
+       audio_frames_ebox.signal_key_release_event().connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), AudioFrames));
+       bars_ebox.signal_key_release_event().connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), Bars));
+       beats_ebox.signal_key_release_event().connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), Beats));
+       ticks_ebox.signal_key_release_event().connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), Ticks));
+       ms_hours_ebox.signal_key_release_event().connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), MS_Hours));
+       ms_minutes_ebox.signal_key_release_event().connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), MS_Minutes));
+       ms_seconds_ebox.signal_key_release_event().connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), MS_Seconds));
 
        hours_ebox.signal_focus_in_event().connect (bind (mem_fun(*this, &AudioClock::field_focus_in_event), SMPTE_Hours));
        minutes_ebox.signal_focus_in_event().connect (bind (mem_fun(*this, &AudioClock::field_focus_in_event), SMPTE_Minutes));
@@ -295,23 +296,39 @@ 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));
-
-       Gtkmm2ext::set_size_request_to_display_given_text (hours_label, "-88", 0, 2);
-       Gtkmm2ext::set_size_request_to_display_given_text (minutes_label, "88", 0, 2);
-       Gtkmm2ext::set_size_request_to_display_given_text (seconds_label, "88", 0, 2);
-       Gtkmm2ext::set_size_request_to_display_given_text (frames_label, "88", 0, 2);
-
-       Gtkmm2ext::set_size_request_to_display_given_text (bars_label, "-888", 0, 2);
-       Gtkmm2ext::set_size_request_to_display_given_text (beats_label, "88", 0, 2);
-       Gtkmm2ext::set_size_request_to_display_given_text (ticks_label, "8888", 0, 2);
-
-       Gtkmm2ext::set_size_request_to_display_given_text (audio_frames_label, "4294967296", 0, 2);
 }
 
 void
-AudioClock::realize_impl ()
+AudioClock::on_realize ()
 {
-       HBox::realize_impl ();
+       HBox::on_realize ();
+
+       /* styles are not available until the widgets are bound to a window */
+
+       switch (_mode) {
+       case SMPTE:
+               Gtkmm2ext::set_size_request_to_display_given_text (hours_label, "-88", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (minutes_label, "88", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (seconds_label, "88", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (frames_label, "88", 0, 2);
+               break;
+
+       case BBT:
+               Gtkmm2ext::set_size_request_to_display_given_text (bars_label, "-888", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (beats_label, "88", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (ticks_label, "8888", 0, 2);
+               break;
+
+       case MinSec:
+               Gtkmm2ext::set_size_request_to_display_given_text (ms_hours_label, "99", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (ms_minutes_label, "99", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (ms_seconds_label, "99", 0, 2);
+               break;
+
+       case Frames:
+               Gtkmm2ext::set_size_request_to_display_given_text (audio_frames_label, "4294967296", 0, 2);
+
+       }
 }
 
 void
@@ -468,7 +485,7 @@ AudioClock::set_session (Session *s)
        }
 }
 
-gint
+bool
 AudioClock::field_key_release_event (GdkEventKey *ev, Field field)
 {
        Label *label = 0;
@@ -692,70 +709,66 @@ AudioClock::field_key_release_event (GdkEventKey *ev, Field field)
        return TRUE;
 }
 
-gint
+bool
 AudioClock::field_focus_in_event (GdkEventFocus *ev, Field field)
 {
-       ARDOUR_UI::instance()->allow_focus (true);
-
        key_entry_state = 0;
 
        switch (field) {
        case SMPTE_Hours:
                hours_ebox.set_flags (Gtk::HAS_FOCUS);
-               hours_ebox.set_state (GTK_STATE_ACTIVE);
+               hours_ebox.set_state (Gtk::STATE_ACTIVE);
                break;
        case SMPTE_Minutes:
                minutes_ebox.set_flags (Gtk::HAS_FOCUS);
-               minutes_ebox.set_state (GTK_STATE_ACTIVE);
+               minutes_ebox.set_state (Gtk::STATE_ACTIVE);
                break;
        case SMPTE_Seconds:
                seconds_ebox.set_flags (Gtk::HAS_FOCUS);
-               seconds_ebox.set_state (GTK_STATE_ACTIVE);
+               seconds_ebox.set_state (Gtk::STATE_ACTIVE);
                break;
        case SMPTE_Frames:
                frames_ebox.set_flags (Gtk::HAS_FOCUS);
-               frames_ebox.set_state (GTK_STATE_ACTIVE);
+               frames_ebox.set_state (Gtk::STATE_ACTIVE);
                break;
 
        case AudioFrames:
                audio_frames_ebox.set_flags (Gtk::HAS_FOCUS);
-               audio_frames_ebox.set_state (GTK_STATE_ACTIVE);
+               audio_frames_ebox.set_state (Gtk::STATE_ACTIVE);
                break;
 
        case MS_Hours:
                ms_hours_ebox.set_flags (Gtk::HAS_FOCUS);
-               ms_hours_ebox.set_state (GTK_STATE_ACTIVE);
+               ms_hours_ebox.set_state (Gtk::STATE_ACTIVE);
                break;
        case MS_Minutes:
                ms_minutes_ebox.set_flags (Gtk::HAS_FOCUS);
-               ms_minutes_ebox.set_state (GTK_STATE_ACTIVE);
+               ms_minutes_ebox.set_state (Gtk::STATE_ACTIVE);
                break;
        case MS_Seconds:
                ms_seconds_ebox.set_flags (Gtk::HAS_FOCUS);
-               ms_seconds_ebox.set_state (GTK_STATE_ACTIVE);
+               ms_seconds_ebox.set_state (Gtk::STATE_ACTIVE);
                break;
        case Bars:
                bars_ebox.set_flags (Gtk::HAS_FOCUS);
-               bars_ebox.set_state (GTK_STATE_ACTIVE);
+               bars_ebox.set_state (Gtk::STATE_ACTIVE);
                break;
        case Beats:
                beats_ebox.set_flags (Gtk::HAS_FOCUS);
-               beats_ebox.set_state (GTK_STATE_ACTIVE);
+               beats_ebox.set_state (Gtk::STATE_ACTIVE);
                break;
        case Ticks:
                ticks_ebox.set_flags (Gtk::HAS_FOCUS);
-               ticks_ebox.set_state (GTK_STATE_ACTIVE);
+               ticks_ebox.set_state (Gtk::STATE_ACTIVE);
                break;
        }
 
        return FALSE;
 }
 
-gint
+bool
 AudioClock::field_focus_out_event (GdkEventFocus *ev, Field field)
 {
-       ARDOUR_UI::instance()->allow_focus (false);
-
        switch (field) {
 
        case SMPTE_Hours:
@@ -810,7 +823,7 @@ AudioClock::field_focus_out_event (GdkEventFocus *ev, Field field)
        return FALSE;
 }
 
-gint
+bool
 AudioClock::field_button_release_event (GdkEventButton *ev, Field field)
 {
 
@@ -890,7 +903,7 @@ AudioClock::field_button_release_event (GdkEventButton *ev, Field field)
        return TRUE;
 }
 
-gint
+bool
 AudioClock::field_button_press_event (GdkEventButton *ev, Field field)
 {
        if (session == 0) return FALSE;
@@ -967,7 +980,7 @@ AudioClock::field_button_press_event (GdkEventButton *ev, Field field)
        return TRUE;
 }
 
-gint
+bool
 AudioClock::field_motion_notify_event (GdkEventMotion *ev, Field field)
 {
        if (session == 0 || !dragging) {
@@ -1656,9 +1669,8 @@ AudioClock::set_mode (Mode m)
           started editing the clock and then we switch clock mode.
        */
 
-       if (ARDOUR_UI::instance()) {
-               ARDOUR_UI::instance()->allow_focus (false);
-       }
+       // GTK2FIX might need an equivalent here for drop focus
+
 
        if (_mode == m) {
                return;
@@ -1679,20 +1691,36 @@ AudioClock::set_mode (Mode m)
        switch (_mode) {
        case SMPTE:
                clock_base.add (smpte_packer_hbox);
+               Gtkmm2ext::set_size_request_to_display_given_text (hours_label, "-88", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (minutes_label, "88", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (seconds_label, "88", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (frames_label, "88", 0, 2);
                break;
+
        case BBT:
                clock_base.add (bbt_packer_hbox);
+               Gtkmm2ext::set_size_request_to_display_given_text (bars_label, "-888", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (beats_label, "88", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (ticks_label, "8888", 0, 2);
                break;
+
        case MinSec:
                clock_base.add (minsec_packer_hbox);
+               Gtkmm2ext::set_size_request_to_display_given_text (ms_hours_label, "99", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (ms_minutes_label, "99", 0, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (ms_seconds_label, "99", 0, 2);
                break;
+
        case Frames:
                clock_base.add (frames_packer_hbox);
+               Gtkmm2ext::set_size_request_to_display_given_text (audio_frames_label, "4294967296", 0, 2);
+
        case Off:
                break;
        }
-       
+
        set (last_when, true);
        clock_base.show_all ();
        key_entry_state = 0;
 }
+