X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Flevel_meter.cc;h=75cd5e60eb2635caf3939b08c34e12d41b00c7e1;hb=5e7d9d30e28e8022661497244ccd43a1f5a836c6;hp=509513da926651ce5b5d41d6f603567a30f03505;hpb=4ed3dcd51d31a56885ce910c551c60b65905200c;p=ardour.git diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index 509513da92..75cd5e60eb 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -51,6 +51,8 @@ LevelMeterBase::LevelMeterBase (Session* s, PBD::EventLoop::InvalidationRecord* , thin_meter_width(2) , max_peak (minus_infinity()) , meter_type (MeterPeak) + , visible_meter_type (MeterType(0)) + , visible_meter_count (0) , color_changed (false) { set_session (s); @@ -78,7 +80,7 @@ LevelMeterBase::set_meter (PeakMeter* meter) _meter_type_connection.disconnect(); _meter = meter; - color_changed = true; + color_changed = true; // force update if (_meter) { _meter->ConfigurationChanged.connect (_configuration_connection, parent_invalidator, boost::bind (&LevelMeterBase::configuration_changed, this, _1, _2), gui_context()); @@ -209,7 +211,6 @@ LevelMeterBase::parameter_changed (string p) void LevelMeterBase::configuration_changed (ChanCount /*in*/, ChanCount /*out*/) { - color_changed = true; setup_meters (meter_length, regular_meter_width, thin_meter_width); } @@ -217,7 +218,6 @@ void LevelMeterBase::meter_type_changed (MeterType t) { meter_type = t; - color_changed = true; setup_meters (meter_length, regular_meter_width, thin_meter_width); MeterTypeChanged(t); } @@ -236,9 +236,9 @@ LevelMeterBase::hide_all_meters () void LevelMeterBase::setup_meters (int len, int initial_width, int thin_width) { - hide_all_meters (); if (!_meter) { + hide_all_meters (); return; /* do it later or never */ } @@ -251,6 +251,7 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width) guint16 width; if (nmeters == 0) { + hide_all_meters (); return; } @@ -262,6 +263,27 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width) width = rint (width * ARDOUR_UI::ui_scale); + if ( meters.size() > 0 + && nmeters == visible_meter_count + && meters[0].width == width + && meters[0].length == len + && !color_changed + && meter_type == visible_meter_type) { + return; + } + +#if 0 + printf("Meter redraw: %s %s %s %s %s %s\n", + (meters.size() > 0) ? "yes" : "no", + (meters.size() > 0 && meters[0].width == width) ? "yes" : "no", + (meters.size() > 0 && meters[0].length == len) ? "yes" : "no", + (nmeters == visible_meter_count) ? "yes" : "no", + (meter_type == visible_meter_type) ? "yes" : "no", + !color_changed ? "yes" : "no" + ); +#endif + + hide_all_meters (); while (meters.size() < nmeters) { meters.push_back (MeterInfo()); } @@ -443,6 +465,7 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width) //show(); color_changed = false; visible_meter_type = meter_type; + visible_meter_count = nmeters; } void @@ -455,7 +478,7 @@ LevelMeterBase::set_type(MeterType t) bool LevelMeterBase::meter_button_press (GdkEventButton* ev) { - return !!ButtonPress (ev); /* EMIT SIGNAL */ + return static_cast(ButtonPress (ev)); /* EMIT SIGNAL */ } bool