summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/gain_meter.cc11
-rw-r--r--gtk2_ardour/gain_meter.h10
-rw-r--r--gtk2_ardour/level_meter.cc18
-rw-r--r--gtk2_ardour/level_meter.h6
-rw-r--r--gtk2_ardour/mixer_strip.cc47
-rw-r--r--gtk2_ardour/mixer_strip.h6
6 files changed, 92 insertions, 6 deletions
diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc
index c0a6958347..0618e5ee80 100644
--- a/gtk2_ardour/gain_meter.cc
+++ b/gtk2_ardour/gain_meter.cc
@@ -110,6 +110,10 @@ GainMeterBase::GainMeterBase (Session* s,
level_meter = new LevelMeter(_session);
+ level_meter->ButtonPress.connect_same_thread (_level_meter_connection, boost::bind (&GainMeterBase::level_meter_button_press, this, _1));
+ 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));
gain_slider->signal_button_release_event().connect (sigc::mem_fun(*this, &GainMeter::gain_slider_button_release));
gain_slider->set_name ("GainFader");
@@ -1105,6 +1109,12 @@ GainMeterBase::get_controllable()
}
}
+bool
+GainMeterBase::level_meter_button_press (GdkEventButton* ev)
+{
+ return LevelMeterButtonPress (ev); /* EMIT SIGNAL */
+}
+
void
GainMeter::meter_configuration_changed (ChanCount c)
{
@@ -1119,3 +1129,4 @@ GainMeter::meter_configuration_changed (ChanCount c)
style_changed = true;
meter_metric_area.queue_draw ();
}
+
diff --git a/gtk2_ardour/gain_meter.h b/gtk2_ardour/gain_meter.h
index cd65c17adb..e706606c76 100644
--- a/gtk2_ardour/gain_meter.h
+++ b/gtk2_ardour/gain_meter.h
@@ -88,6 +88,11 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr
LevelMeter& get_level_meter() const { return *level_meter; }
Gtkmm2ext::SliderController& get_gain_slider() const { return *gain_slider; }
+ /** Emitted in the GUI thread when a button is pressed over the level meter;
+ * return true if the event is handled.
+ */
+ PBD::Signal1<bool, GdkEventButton *> LevelMeterButtonPress;
+
protected:
friend class MixerStrip;
@@ -182,6 +187,11 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr
void color_handler(bool);
ARDOUR::DataType _data_type;
ARDOUR::ChanCount _previous_amp_output_streams;
+
+private:
+
+ bool level_meter_button_press (GdkEventButton *);
+ PBD::ScopedConnection _level_meter_connection;
};
class GainMeter : public GainMeterBase, public Gtk::VBox
diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc
index 4a65864050..b073d54a7a 100644
--- a/gtk2_ardour/level_meter.cc
+++ b/gtk2_ardour/level_meter.cc
@@ -201,8 +201,9 @@ LevelMeter::setup_meters (int len, int initial_width)
meters[n].meter = new FastMeter ((uint32_t) floor (Config->get_meter_hold()), width, FastMeter::Vertical, len, b, m, t, c);
meters[n].width = width;
meters[n].length = len;
- meters[n].meter->add_events (Gdk::BUTTON_RELEASE_MASK);
- meters[n].meter->signal_button_release_event().connect (sigc::bind (sigc::mem_fun(*this, &LevelMeter::meter_button_release), n));
+ meters[n].meter->add_events (Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK);
+ meters[n].meter->signal_button_press_event().connect (sigc::mem_fun (*this, &LevelMeter::meter_button_press));
+ meters[n].meter->signal_button_release_event().connect (sigc::mem_fun (*this, &LevelMeter::meter_button_release));
}
pack_end (*meters[n].meter, false, false);
@@ -213,12 +214,19 @@ LevelMeter::setup_meters (int len, int initial_width)
color_changed = false;
}
-gint
-LevelMeter::meter_button_release (GdkEventButton* ev, uint32_t /*which*/)
+bool
+LevelMeter::meter_button_press (GdkEventButton* ev)
+{
+ return ButtonPress (ev); /* EMIT SIGNAL */
+}
+
+bool
+LevelMeter::meter_button_release (GdkEventButton* ev)
{
if (ev->button == 1) {
- clear_meters();
+ clear_meters ();
}
+
return true;
}
diff --git a/gtk2_ardour/level_meter.h b/gtk2_ardour/level_meter.h
index e89266a407..0e51758858 100644
--- a/gtk2_ardour/level_meter.h
+++ b/gtk2_ardour/level_meter.h
@@ -67,6 +67,9 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr
void hide_meters ();
void setup_meters (int len=0, int width=3);
+ /** Emitted in the GUI thread when a button is pressed over the meter */
+ PBD::Signal1<bool, GdkEventButton *> ButtonPress;
+
private:
ARDOUR::PeakMeter* _meter;
@@ -96,7 +99,8 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr
PBD::ScopedConnection _parameter_connection;
void hide_all_meters ();
- gint meter_button_release (GdkEventButton*, uint32_t);
+ bool meter_button_press (GdkEventButton *);
+ bool meter_button_release (GdkEventButton *);
void parameter_changed (std::string);
void configuration_changed (ARDOUR::ChanCount in, ARDOUR::ChanCount out);
diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc
index 02e483fea4..bf82130b95 100644
--- a/gtk2_ardour/mixer_strip.cc
+++ b/gtk2_ardour/mixer_strip.cc
@@ -364,6 +364,8 @@ MixerStrip::init ()
parameter_changed (X_("mixer-strip-visibility"));
Config->ParameterChanged.connect (_config_connection, MISSING_INVALIDATOR, ui_bind (&MixerStrip::parameter_changed, this, _1), gui_context());
+
+ gpm.LevelMeterButtonPress.connect_same_thread (_level_meter_connection, boost::bind (&MixerStrip::level_meter_button_press, this, _1));
}
MixerStrip::~MixerStrip ()
@@ -2010,3 +2012,48 @@ MixerStrip::ab_plugins ()
processor_box.processor_operation (ProcessorBox::ProcessorsAB);
}
+bool
+MixerStrip::level_meter_button_press (GdkEventButton* ev)
+{
+ if (ev->button == 3) {
+ popup_level_meter_menu (ev);
+ return true;
+ }
+
+ return false;
+}
+
+void
+MixerStrip::popup_level_meter_menu (GdkEventButton* ev)
+{
+ using namespace Gtk::Menu_Helpers;
+
+ Gtk::Menu* m = manage (new Menu);
+ MenuList& items = m->items ();
+
+ RadioMenuItem::Group group;
+
+ add_level_meter_item (items, group, _("Input"), MeterInput);
+ add_level_meter_item (items, group, _("Pre-fader"), MeterPreFader);
+ add_level_meter_item (items, group, _("Post-fader"), MeterPostFader);
+ add_level_meter_item (items, group, _("Output"), MeterOutput);
+ add_level_meter_item (items, group, _("Custom"), MeterCustom);
+
+ m->popup (ev->button, ev->time);
+}
+
+void
+MixerStrip::add_level_meter_item (Menu_Helpers::MenuList& items, RadioMenuItem::Group& group, string const & name, MeterPoint point)
+{
+ using namespace Menu_Helpers;
+
+ items.push_back (RadioMenuElem (group, name, sigc::bind (sigc::mem_fun (*this, &MixerStrip::set_meter_point), point)));
+ RadioMenuItem* i = dynamic_cast<RadioMenuItem *> (&items.back ());
+ i->set_active (_route->meter_point() == point);
+}
+
+void
+MixerStrip::set_meter_point (MeterPoint p)
+{
+ _route->set_meter_point (p);
+}
diff --git a/gtk2_ardour/mixer_strip.h b/gtk2_ardour/mixer_strip.h
index 6aac87850d..ec12c5c9db 100644
--- a/gtk2_ardour/mixer_strip.h
+++ b/gtk2_ardour/mixer_strip.h
@@ -313,6 +313,12 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
void add_input_port (ARDOUR::DataType);
void add_output_port (ARDOUR::DataType);
+ bool level_meter_button_press (GdkEventButton *);
+ void popup_level_meter_menu (GdkEventButton *);
+ void add_level_meter_item (Gtk::Menu_Helpers::MenuList &, Gtk::RadioMenuItem::Group &, std::string const &, ARDOUR::MeterPoint);
+ void set_meter_point (ARDOUR::MeterPoint);
+ PBD::ScopedConnection _level_meter_connection;
+
static std::string meter_point_string (ARDOUR::MeterPoint);
};