22 #include "gtk2ardour-config.h"
26 #include <sigc++/bind.h>
28 #include <gtkmm/accelmap.h>
30 #include <glibmm/threads.h>
36 #include "ardour/debug.h"
85 : Window (
Gtk::WINDOW_TOPLEVEL)
88 , _show_busses (false)
93 set_name (
"Meter Bridge");
102 set_wmclass (
X_(
"ardour_mixer"), PROGRAM_NAME);
105 geom.max_width = 1<<16;
108 geom.min_height = -1;
109 geom.height_inc = 16;
112 set_geometry_hints(*((Gtk::Window*)
this), geom, Gdk::HINT_MIN_SIZE | Gdk::HINT_MAX_SIZE | Gdk::HINT_RESIZE_INC);
114 set_keep_above (
true);
115 set_border_width (0);
135 Gtk::HBox * yspc = manage (
new Gtk::HBox());
136 yspc->set_size_request(-1, 1);
137 Gtk::VBox * xspc = manage (
new Gtk::VBox());
139 xspc->pack_start(*yspc,
false,
false);
144 scroller.set_shadow_type(Gtk::SHADOW_NONE);
147 scroller.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_NEVER);
173 Gtk::Viewport* viewport = (Gtk::Viewport*)
scroller.get_child();
174 viewport->set_shadow_type(Gtk::SHADOW_NONE);
175 viewport->set_border_width(0);
218 title +=
S_(
"Window|Meterbridge");
219 title += Glib::get_application_name ();
225 title += Glib::get_application_name ();
252 return just_hide_it(ev, static_cast<Gtk::Window *>(
this));
258 if (gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) {
267 if (gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) {
277 switch (ev->direction) {
278 case GDK_SCROLL_LEFT:
282 if (ev->state & Keyboard::TertiaryModifier) {
288 case GDK_SCROLL_RIGHT:
292 case GDK_SCROLL_DOWN:
293 if (ev->state & Keyboard::TertiaryModifier) {
306 if (!
scroller.get_hscrollbar())
return;
307 Adjustment* adj =
scroller.get_hscrollbar()->get_adjustment();
309 scroller.get_hscrollbar()->set_value (max (adj->get_lower(), adj->get_value() - adj->get_step_increment()));
315 if (!
scroller.get_hscrollbar())
return;
316 Adjustment* adj =
scroller.get_hscrollbar()->get_adjustment();
318 scroller.get_hscrollbar()->set_value (min (adj->get_upper(), adj->get_value() + adj->get_step_increment()));
325 Gtk::Window::on_size_request(r);
328 Gtk::Requisition mr =
meterarea.size_request();
331 geom.max_width = std::max(50, geom.max_width);
338 geom.height_inc = 16;
341 geom.min_height = -1;
342 set_geometry_hints(*((Gtk::Window*)
this), geom, Gdk::HINT_MIN_SIZE | Gdk::HINT_MAX_SIZE | Gdk::HINT_RESIZE_INC);
349 const Gtk::Scrollbar * hsc =
scroller.get_hscrollbar();
352 if (
scroller.get_hscrollbar_visible() && hsc) {
357 gint scrollbar_spacing;
358 gtk_widget_style_get (GTK_WIDGET (
scroller.gobj()),
359 "scrollbar-spacing", &scrollbar_spacing, NULL);
360 const int h = hsc->get_height() + scrollbar_spacing + 1;
367 Gtk::Window::on_size_allocate(a);
373 if (!
scroller.get_hscrollbar())
return;
375 Adjustment* adj =
scroller.get_hscrollbar()->get_adjustment();
376 int leftend = adj->get_value();
377 int rightend =
scroller.get_width() + leftend;
384 for (
unsigned int i = 0; i <
_metrics.size(); ++i) {
385 int sx, dx = 0, dy = 0;
386 int mm =
_metrics[i]->get_metric_mode();
387 sx = (mm & 2) ?
_metrics[i]->get_width() : 0;
391 if (dx < leftend && !(mm&2)) {
393 mt_left =
_metrics[i]->meter_type();
395 if (dx > rightend && (mm&2)) {
397 mt_right =
_metrics[i]->meter_type();
408 SessionHandlePtr::set_session (s);
452 for (list<MeterBridgeStrip>::iterator i =
strips.begin(); i !=
strips.end(); ++i) {
459 SessionHandlePtr::session_going_away ();
480 if ((prop = geometry->
property(
"x_size")) == 0) {
481 prop = geometry->
property (
"x-size");
486 if ((prop = geometry->
property(
"y_size")) == 0) {
487 prop = geometry->
property (
"y-size");
493 if ((prop = geometry->
property (
"x_pos")) == 0) {
494 prop = geometry->
property (
"x-pos");
500 if ((prop = geometry->
property (
"y_pos")) == 0) {
501 prop = geometry->
property (
"y-pos");
510 if ((prop = node.
property (
"show-meterbridge"))) {
530 snprintf(buf,
sizeof(buf),
"%d",
m_width);
532 snprintf(buf,
sizeof(buf),
"%d",
m_height);
534 snprintf(buf,
sizeof(buf),
"%d",
m_root_x);
536 snprintf(buf,
sizeof(buf),
"%d",
m_root_y);
565 for (list<MeterBridgeStrip>::iterator i =
strips.begin(); i !=
strips.end(); ++i) {
566 if (!(*i).visible)
continue;
567 (*i).s->fast_update ();
575 for (RouteList::iterator x = routes.begin(); x != routes.end(); ++x) {
588 meterarea.pack_start (*strip,
false,
false);
602 list<MeterBridgeStrip>::iterator i;
603 for (list<MeterBridgeStrip>::iterator i =
strips.begin(); i !=
strips.end(); ++i) {
604 if ( (*i).s == strip) {
625 unsigned int metrics = 0;
627 bool have_midi =
false;
630 for (list<MeterBridgeStrip>::iterator i =
strips.begin(); i !=
strips.end(); ++i) {
632 if (! (*i).s->route()->active()) {
634 (*i).visible =
false;
636 else if ((*i).s->route()->is_master()) {
643 (*i).visible =
false;
646 else if (boost::dynamic_pointer_cast<AudioTrack>((*i).s->route()) == 0
647 && boost::dynamic_pointer_cast<MidiTrack>((*i).s->route()) == 0
656 (*i).visible =
false;
659 else if (boost::dynamic_pointer_cast<MidiTrack>((*i).s->route())) {
666 (*i).visible =
false;
675 (*i).s->set_tick_bar(0);
680 (*i).s->set_tick_bar(1);
683 if ((*i).visible && nmt != lmt && vis == 1) {
686 }
else if ((*i).visible && nmt != lmt) {
691 (*i).s->set_tick_bar((*i).s->get_tick_bar() | 1);
699 _metrics[metrics]->set_metric_mode(have_midi ? 2 : 3, lmt);
712 _metrics[metrics]->set_metric_mode(1, lmt);
719 if ((*i).visible && (*i).s->has_midi()) {
723 meterarea.reorder_child(*((*i).s), pos++);
759 if (p ==
"show-busses-on-meterbridge") {
763 else if (p ==
"show-master-on-meterbridge") {
767 else if (p ==
"show-midi-on-meterbridge") {
771 else if (p ==
"meter-line-up-level") {
774 else if (p ==
"show-rec-on-meterbridge") {
777 else if (p ==
"show-mute-on-meterbridge") {
780 else if (p ==
"show-solo-on-meterbridge") {
783 else if (p ==
"show-name-on-meterbridge") {
786 else if (p ==
"meterbridge-label-height") {
789 else if (p ==
"show-monitor-on-meterbridge") {
792 else if (p ==
"track-name-number") {
int atoi(const string &s)
void set_session(ARDOUR::Session *s)
void session_going_away()
ARDOUR::MeterType _mt_left
sigc::connection super_rapid_connect(const sigc::slot< void > &slot)
void meter_clear_pattern_cache(int which=7)
const std::string & value() const
static PBD::Signal0< void > ConfigurationChanged
void parameter_changed(std::string const &p)
void on_size_allocate(Gtk::Allocation &)
sigc::signal< void > DPIReset
void fast_update_strips()
static ARDOUR_UI * instance()
void get_window_pos_and_size()
bool forward_key_press(GdkEventKey *ev)
void set_window_pos_and_size()
void on_size_request(Gtk::Requisition *)
static PBD::Signal1< void, MeterStrip * > CatchDeletion
bool is_auditioner() const
SessionConfiguration config
static Meterbridge * _instance
XMLNode & get_state(void)
#define ENSURE_GUI_THREAD(obj, method,...)
static Meterbridge * instance()
std::list< MeterBridgeStrip > strips
gint just_hide_it(GdkEventAny *, Gtk::Window *)
const std::string & get_string()
Gtk::HBox metrics_spacer_right
std::vector< MeterStrip * > _metrics
gboolean configure_handler(GdkEventConfigure *conf)
XMLProperty * property(const char *)
LIBARDOUR_API RCConfiguration * Config
ARDOUR::MeterType meter_type()
void set_metric_mode(int, ARDOUR::MeterType)
bool string_is_affirmative(const std::string &str)
int set_state(const XMLNode &)
PBD::Signal0< void > active_changed
PBD::Signal0< void > DirtyChanged
static PBD::Signal0< void > MetricChanged
bool deletion_in_progress() const
Gtk::VBox metrics_vpacker_left
boost::shared_ptr< RouteList > get_routes() const
LIBARDOUR_API XMLNode * find_named_node(const XMLNode &node, std::string name)
PBD::ScopedConnectionList _session_connections
static const int32_t default_height
PBD::Signal1< void, std::string > ParameterChanged
Gtk::HBox metrics_spacer_left
static const int max_height
LIBGTKMM2EXT_API void check_toggleaction(std::string)
static const int32_t default_width
XMLProperty * add_property(const char *name, const std::string &value)
std::string snap_name() const
void add_child_nocopy(XMLNode &)
PBD::Signal1< void, std::string > StateSaved
XMLNode * instant_xml(const std::string &str)
Gtk::ScrolledWindow scroller
bool on_scroll_event(GdkEventScroll *)
sigc::signal< void > ColorsChanged
Gtk::VBox metrics_vpacker_right
void add_strips(ARDOUR::RouteList &)
sigc::connection fast_screen_update_connection
Glib::Threads::Mutex _resync_mutex
bool on_key_press_event(GdkEventKey *)
bool hide_window(GdkEventAny *ev)
std::list< boost::shared_ptr< Route > > RouteList
ARDOUR::MeterType _mt_right
void remove_strip(MeterStrip *)
ARDOUR::Session * _session
sigc::connection scroll_connection
bool on_key_release_event(GdkEventKey *)
PBD::Signal1< void, RouteList & > RouteAdded
void set_session(ARDOUR::Session *)