modify Mackie surface code to use crossthreadchannel on all platforms
[ardour.git] / gtk2_ardour / gain_meter.cc
index 2f4942301cd000e9c73e798e4b74cc7e83d22985..7b7ad33f9ae5beda0146e2c1ebfac152b49a050b 100644 (file)
@@ -61,6 +61,26 @@ using namespace std;
 using Gtkmm2ext::Keyboard;
 using namespace ArdourMeter;
 
+
+static void
+reset_cursor_to_default (Gtk::Entry* widget)
+{
+       Glib::RefPtr<Gdk::Window> win = widget->get_text_window ();
+       if (win) {
+               /* C++ doesn't provide a pointer argument version of this
+                  (i.e. you cannot set to NULL to get the default/parent
+                  cursor)
+               */
+               gdk_window_set_cursor (win->gobj(), 0);
+       }
+}
+
+static void
+reset_cursor_to_default_state (Gtk::StateType, Gtk::Entry* widget)
+{
+       reset_cursor_to_default (widget);
+}
+
 GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int fader_girth)
        : gain_adjustment (gain_to_slider_position_with_max (1.0, Config->get_max_gain()), 0.0, 1.0, 0.01, 0.1)
        , gain_automation_style_button ("")
@@ -78,9 +98,9 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int
        _width = Wide;
 
        if (horizontal) {
-               gain_slider = manage (new HSliderController (&gain_adjustment, fader_length, fader_girth));
+               gain_slider = manage (new HSliderController (&gain_adjustment, boost::shared_ptr<PBD::Controllable>(), fader_length, fader_girth));
        } else {
-               gain_slider = manage (new VSliderController (&gain_adjustment, fader_length, fader_girth));
+               gain_slider = manage (new VSliderController (&gain_adjustment, boost::shared_ptr<PBD::Controllable>(), fader_length, fader_girth));
        }
 
        level_meter = new LevelMeterHBox(_session);
@@ -89,8 +109,9 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int
        meter_metric_area.signal_button_press_event().connect (sigc::mem_fun (*this, &GainMeterBase::level_meter_button_press));
        meter_metric_area.add_events (Gdk::BUTTON_PRESS_MASK);
 
-       gain_slider->signal_button_press_event().connect (sigc::mem_fun(*this, &GainMeter::gain_slider_button_press), false);
-       gain_slider->signal_button_release_event().connect (sigc::mem_fun(*this, &GainMeter::gain_slider_button_release), false);
+       gain_slider->set_tweaks (PixFader::Tweaks(PixFader::NoButtonForward | PixFader::NoVerticalScroll));
+       gain_slider->StartGesture.connect (sigc::mem_fun (*this, &GainMeter::amp_start_touch));
+       gain_slider->StopGesture.connect (sigc::mem_fun (*this, &GainMeter::amp_stop_touch));
        gain_slider->set_name ("GainFader");
 
        gain_display.set_name ("MixerStripGainDisplay");
@@ -104,8 +125,16 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int
        set_size_request_to_display_given_text (peak_display, "-80.g", 2, 6); /* note the descender */
        max_peak = minus_infinity();
        peak_display.set_text (_("-inf"));
-       peak_display.unset_flags (Gtk::CAN_FOCUS);
        peak_display.set_alignment(0.5);
+       
+       /* stuff related to the fact that the peak display is not, in
+          fact, supposed to be a text entry. 
+       */
+       peak_display.set_events (peak_display.get_events() & ~(Gdk::EventMask (Gdk::LEAVE_NOTIFY_MASK|Gdk::ENTER_NOTIFY_MASK|Gdk::POINTER_MOTION_MASK)));
+       peak_display.signal_map().connect (sigc::bind (sigc::ptr_fun (reset_cursor_to_default), &peak_display));
+       peak_display.signal_state_changed().connect (sigc::bind (sigc::ptr_fun (reset_cursor_to_default_state), &peak_display));
+       peak_display.unset_flags (Gtk::CAN_FOCUS);
+       peak_display.set_editable (false);
 
        gain_automation_style_button.set_name ("mixer strip button");
        gain_automation_state_button.set_name ("mixer strip button");
@@ -305,7 +334,15 @@ GainMeter::setup_meters (int len)
 {
        switch (_width) {
                case Wide:
-                       hbox.set_homogeneous(true);
+                       {
+                               uint32_t meter_channels = 0;
+                               if (_meter) {
+                                       meter_channels = _meter->input_streams().n_total();
+                               } else if (_route) {
+                                       meter_channels = _route->shared_peak_meter()->input_streams().n_total();
+                               }
+                               hbox.set_homogeneous(meter_channels < 7 ? true : false);
+                       }
                        break;
                case Narrow:
                        hbox.set_homogeneous(false);
@@ -573,7 +610,7 @@ next_meter_point (MeterPoint mp)
                break;
        }
 
-       /*NOTREACHED*/
+       abort(); /*NOTREACHED*/
        return MeterInput;
 }
 
@@ -682,25 +719,16 @@ GainMeterBase::meter_point_clicked ()
        }
 }
 
-bool
-GainMeterBase::gain_slider_button_press (GdkEventButton* ev)
+void
+GainMeterBase::amp_start_touch ()
 {
-       switch (ev->type) {
-       case GDK_BUTTON_PRESS:
-               _amp->gain_control()->start_touch (_amp->session().transport_frame());
-               break;
-       default:
-               return false;
-       }
-
-       return false;
+       _amp->gain_control()->start_touch (_amp->session().transport_frame());
 }
 
-bool
-GainMeterBase::gain_slider_button_release (GdkEventButton*)
+void
+GainMeterBase::amp_stop_touch ()
 {
        _amp->gain_control()->stop_touch (false, _amp->session().transport_frame());
-       return false;
 }
 
 gint
@@ -845,6 +873,12 @@ GainMeterBase::gain_automation_state_changed ()
        }
 }
 
+const ChanCount
+GainMeterBase::meter_channels() const
+{
+               if (_meter) { return _meter->input_streams(); }
+               else { return ChanCount(); }
+}
 void
 GainMeterBase::update_meters()
 {
@@ -1076,7 +1110,7 @@ GainMeterBase::get_controllable()
 bool
 GainMeterBase::level_meter_button_press (GdkEventButton* ev)
 {
-       return LevelMeterButtonPress (ev); /* EMIT SIGNAL */
+       return !!LevelMeterButtonPress (ev); /* EMIT SIGNAL */
 }
 
 void