diff --git a/gtk2_ardour/ardour3_ui_default.conf.in b/gtk2_ardour/ardour3_ui_default.conf.in
index f3a8de0706..f322bb02a1 100644
--- a/gtk2_ardour/ardour3_ui_default.conf.in
+++ b/gtk2_ardour/ardour3_ui_default.conf.in
@@ -81,12 +81,10 @@
-
-
-
-
-
-
+
+
+
+
@@ -161,8 +159,8 @@
-
-
+
+
@@ -181,333 +179,252 @@
+
+
-
+
-
-
+
-
-
+
-
+
-
-
+
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
+
+
-
+
-
-
-
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
+
+
-
+
-
-
-
-
+
+
-
+
-
+
-
-
+
-
+
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
+
+
-
+
-
-
-
-
+
+
-
+
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
+
+
-
+
-
-
-
-
+
+
-
-
-
-
+
+
-
+
-
-
-
-
+
+
-
+
-
-
-
-
+
+
-
+
-
-
-
-
+
+
-
+
-
-
-
-
+
+
-
+
-
-
-
-
+
+
@@ -552,10 +469,8 @@
-
-
-
-
+
+
diff --git a/gtk2_ardour/ardour_button.cc b/gtk2_ardour/ardour_button.cc
index 1337bb9eeb..4cfa5f2562 100644
--- a/gtk2_ardour/ardour_button.cc
+++ b/gtk2_ardour/ardour_button.cc
@@ -33,6 +33,8 @@
#include "ardour/rc_configuration.h" // for widget prelight preference
+#include "canvas/utils.h"
+
#include "ardour_button.h"
#include "ardour_ui.h"
#include "global_signals.h"
@@ -65,21 +67,15 @@ ArdourButton::ArdourButton (Element e)
, _angle(0)
, _xalign(.5)
, _yalign(.5)
- , bg_color (0)
- , border_color (0)
- , fill_start_inactive_color (0)
- , fill_end_inactive_color (0)
- , fill_start_active_color (0)
- , fill_end_active_color (0)
+ , fill_inactive_color (0)
+ , fill_active_color (0)
, text_active_color(0)
, text_inactive_color(0)
, led_active_color(0)
, led_inactive_color(0)
- , fill_pattern (0)
- , fill_pattern_active (0)
- , shine_pattern (0)
+ , convex_pattern (0)
+ , concave_pattern (0)
, led_inset_pattern (0)
- , reflection_pattern (0)
, _led_rect (0)
, _act_on_release (true)
, _led_left (false)
@@ -103,21 +99,15 @@ ArdourButton::ArdourButton (const std::string& str, Element e)
, _angle(0)
, _xalign(.5)
, _yalign(.5)
- , bg_color (0)
- , border_color (0)
- , fill_start_inactive_color (0)
- , fill_end_inactive_color (0)
- , fill_start_active_color (0)
- , fill_end_active_color (0)
+ , fill_inactive_color (0)
+ , fill_active_color (0)
, text_active_color(0)
, text_inactive_color(0)
, led_active_color(0)
, led_inactive_color(0)
- , fill_pattern (0)
- , fill_pattern_active (0)
- , shine_pattern (0)
+ , convex_pattern (0)
+ , concave_pattern (0)
, led_inset_pattern (0)
- , reflection_pattern (0)
, _led_rect (0)
, _act_on_release (true)
, _led_left (false)
@@ -134,25 +124,17 @@ ArdourButton::~ArdourButton()
{
delete _led_rect;
- if (shine_pattern) {
- cairo_pattern_destroy (shine_pattern);
- }
-
- if (fill_pattern) {
- cairo_pattern_destroy (fill_pattern);
+ if (convex_pattern) {
+ cairo_pattern_destroy (convex_pattern);
}
- if (fill_pattern_active) {
- cairo_pattern_destroy (fill_pattern_active);
+ if (concave_pattern) {
+ cairo_pattern_destroy (concave_pattern);
}
if (led_inset_pattern) {
cairo_pattern_destroy (led_inset_pattern);
}
-
- if (reflection_pattern) {
- cairo_pattern_destroy (reflection_pattern);
- }
}
@@ -201,6 +183,16 @@ ArdourButton::set_alignment (const float xa, const float ya)
void
ArdourButton::render (cairo_t* cr, cairo_rectangle_t *)
{
+ uint32_t text_color;
+ uint32_t led_color;
+ if ( active_state() == Gtkmm2ext::ExplicitActive ) {
+ text_color = text_active_color;
+ led_color = led_active_color;
+ } else {
+ text_color = text_inactive_color;
+ led_color = led_inactive_color;
+ }
+
void (*rounded_function)(cairo_t*, double, double, double, double, double);
switch (_corner_mask) {
@@ -223,9 +215,8 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *)
if (!_fixed_diameter) {
_diameter = std::min (get_width(), get_height());
}
-
- float r,g,b,a;
-
+
+ //border and background fill
if ((_elements & Body)==Body) {
if (_elements & Edge) {
@@ -238,67 +229,49 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *)
rounded_function (cr, 0, 0, get_width(), get_height(), _corner_radius);
}
- if (active_state() == Gtkmm2ext::ImplicitActive) {
+ if (active_state() == Gtkmm2ext::ImplicitActive && !((_elements & Indicator)==Indicator)) {
- if (!(_tweaks & ImplicitUsesSolidColor)) {
- cairo_set_source (cr, fill_pattern);
- } else {
- cairo_set_source (cr, fill_pattern_active);
- }
+ ArdourCanvas::set_source_rgba (cr, fill_inactive_color);
cairo_fill (cr);
-
- if (!(_tweaks & ImplicitUsesSolidColor)) {
- //border
- UINT_TO_RGBA (fill_end_active_color, &r, &g, &b, &a);
- cairo_set_line_width (cr, 1.0);
- rounded_function (cr, 2, 2, get_width()-4, get_height()-4, _corner_radius - 1.5);
- cairo_set_source_rgba (cr, r/255.0, g/255.0, b/255.0, a/255.0);
- cairo_stroke (cr);
- }
+
+ //border
+ cairo_set_line_width (cr, 2.0);
+ rounded_function (cr, 2, 2, get_width()-4, get_height()-4, _corner_radius - 1.5);
+ ArdourCanvas::set_source_rgba (cr, fill_active_color);
+ cairo_stroke (cr);
- } else if (active_state() == Gtkmm2ext::ExplicitActive || ((_elements & Indicator)==Indicator) ) {
+ } else if ( (active_state() == Gtkmm2ext::ExplicitActive) && !((_elements & Indicator)==Indicator) ) {
//background color
- cairo_set_source (cr, fill_pattern_active);
+ ArdourCanvas::set_source_rgba (cr, fill_active_color);
cairo_fill (cr);
- } else {
+ } else { //inactive, or it has an indicator
//background color
- cairo_set_source (cr, fill_pattern);
+ ArdourCanvas::set_source_rgba (cr, fill_inactive_color);
cairo_fill (cr);
}
}
- if ( ((_elements & Inset)==Inset) && (active_state() != Gtkmm2ext::ExplicitActive) ) {
-
- if ( !_flat_buttons ) {
- float rheight = get_height()*0.5-REFLECTION_HEIGHT;
- Gtkmm2ext::rounded_rectangle (cr, 2, 3, get_width()-4, rheight, _corner_radius-1);
- cairo_set_source (cr, shine_pattern);
+ //show the "convex" or "concave" gradient
+ if (!_flat_buttons) {
+ if ( active_state() == Gtkmm2ext::ExplicitActive && !((_elements & Indicator)==Indicator) ) {
+ //concave
+ float width = get_width(); float height = get_height();
+ cairo_set_source (cr, concave_pattern);
+ Gtkmm2ext::rounded_rectangle (cr, 1, 1, width-2, height-2, _corner_radius - 1.5);
cairo_fill (cr);
- }
-
- if (active_state() == Gtkmm2ext::ExplicitActive) {
-
- UINT_TO_RGBA (fill_start_active_color, &r, &g, &b, &a);
- cairo_set_line_width (cr, 2.0);
- rounded_function (cr, 2, 2, get_width()-4, get_height()-4, _corner_radius - 2.0);
- cairo_set_source_rgba (cr, r/255.0, g/255.0, b/255.0, a/255.0);
- cairo_fill (cr);
-
} else {
-
- UINT_TO_RGBA (fill_start_inactive_color, &r, &g, &b, &a);
- cairo_set_line_width (cr, 2.0);
- rounded_function (cr, 2, 2, get_width()-4, get_height()-4, _corner_radius - 2.0);
- cairo_set_source_rgba (cr, r/255.0, g/255.0, b/255.0, a/255.0);
+ float width = get_width(); float height = get_height();
+ cairo_set_source (cr, convex_pattern);
+ Gtkmm2ext::rounded_rectangle (cr, 1, 1, width-2, height-2, _corner_radius - 1.5);
cairo_fill (cr);
-
}
}
+ //Pixbuf, if any
if (_pixbuf) {
double x,y;
@@ -312,9 +285,15 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *)
cairo_translate (cr, -8,0 );
}
- cairo_rectangle (cr, x, y, _pixbuf->get_width(), _pixbuf->get_height());
- gdk_cairo_set_source_pixbuf (cr, _pixbuf->gobj(), x, y);
- cairo_fill (cr);
+ if (_grabbed) {
+ cairo_rectangle (cr, x+1, y+1, _pixbuf->get_width(), _pixbuf->get_height());
+ gdk_cairo_set_source_pixbuf (cr, _pixbuf->gobj(), x+1, y+1);
+ cairo_fill (cr);
+ } else {
+ cairo_rectangle (cr, x, y, _pixbuf->get_width(), _pixbuf->get_height());
+ gdk_cairo_set_source_pixbuf (cr, _pixbuf->gobj(), x, y);
+ cairo_fill (cr);
+ }
//..and then return to our previous drawing position
if (((_elements & Menu)==Menu)) {
@@ -322,23 +301,22 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *)
}
}
- /* text, if any */
-
int text_margin;
-
if (get_width() < 75) {
text_margin = 5;
} else {
text_margin = 10;
}
+ // Text, if any
if ( !_pixbuf && ((_elements & Text)==Text) && !_text.empty()) {
+
cairo_save (cr);
cairo_rectangle (cr, 2, 1, get_width()-4, get_height()-2);
cairo_clip(cr);
cairo_new_path (cr);
- cairo_set_source_rgba (cr, text_r, text_g, text_b, text_a);
+ ArdourCanvas::set_source_rgba (cr, text_color);
if ( (_elements & Menu) == Menu) {
cairo_move_to (cr, text_margin, get_height()/2.0 - _text_height/2.0);
@@ -382,6 +360,7 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *)
cairo_restore (cr);
}
+ //Menu "triangle"
if (((_elements & Menu)==Menu)) {
cairo_save (cr);
@@ -401,6 +380,7 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *)
cairo_restore (cr);
}
+ //Indicator LED
if (((_elements & Indicator)==Indicator)) {
/* move to the center of the indicator/led */
@@ -428,7 +408,7 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *)
cairo_fill(cr);
//led color
- cairo_set_source_rgba (cr, led_r, led_g, led_b, led_a);
+ ArdourCanvas::set_source_rgba (cr, led_color);
cairo_arc (cr, 0, 0, _diameter/2-3, 0, 2 * M_PI);
cairo_fill(cr);
@@ -436,27 +416,14 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *)
}
- /* a partially transparent gray layer to indicate insensitivity */
-
+ // a transparent gray layer to indicate insensitivity
if ((visual_state() & Gtkmm2ext::Insensitive)) {
- rounded_function (cr, 0, 0, get_width(), get_height(), _corner_radius);
+ rounded_function (cr, 1, 1, get_width()-2, get_height()-2, _corner_radius);
cairo_set_source_rgba (cr, 0.505, 0.517, 0.525, 0.6);
cairo_fill (cr);
}
- //reflection
- bool show_reflection = (active_state() == Gtkmm2ext::ExplicitActive);
- show_reflection &= !_flat_buttons;
- show_reflection &= !((_elements & Indicator)==Indicator);
- if ( show_reflection ) {
- float rheight = get_height()*0.5-REFLECTION_HEIGHT;
- Gtkmm2ext::rounded_rectangle (cr, 2, get_height()*0.5-1, get_width()-4, rheight, _corner_radius-1);
- cairo_set_source (cr, shine_pattern);
- cairo_fill (cr);
- }
-
- /* if requested, show hovering */
-
+ // if requested, show hovering
if (ARDOUR::Config->get_widget_prelight()
&& !((visual_state() & Gtkmm2ext::Insensitive))) {
if (_hovering) {
@@ -465,12 +432,24 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *)
cairo_fill (cr);
}
}
- if (visual_state() & Gtkmm2ext::Selected) {
- cairo_set_line_width(cr,2);
- rounded_function (cr, 0, 0, get_width(), get_height(), _corner_radius);
- cairo_set_source_rgba (cr, 1, 0, 0, 0.5);
- cairo_stroke (cr);
+
+ //user is currently pressing the button. black outline helps to indicate this
+ if ( _grabbed && !((_elements & Menu)==Menu) ) {
+ cairo_set_line_width(cr,1);
+ rounded_function (cr, 1, 1, get_width()-2, get_height()-2, _corner_radius - 1);
+ cairo_set_source_rgba (cr, 0, 0, 0, 1.0);
+ cairo_stroke (cr);
}
+
+ //some buttons (like processor boxes) can be selected (so they can be deleted). Draw a white box around them
+ if (visual_state() & Gtkmm2ext::Selected) {
+ cairo_set_line_width(cr,2);
+ rounded_function (cr, 0, 0, get_width(), get_height(), _corner_radius);
+ cairo_set_source_rgba (cr, 1, 1, 1, 0.75);
+ cairo_stroke (cr);
+ }
+
+ //I guess this means we have keyboard focus. I don't think this works currently
if (_focused) {
rounded_function (cr, 1.5, 1.5, get_width() - 3, get_height() - 3, _corner_radius);
cairo_set_source_rgba (cr, 0.905, 0.917, 0.925, 0.8);
@@ -569,13 +548,8 @@ ArdourButton::set_colors ()
}
std::string name = get_name();
- border_color = ARDOUR_UI::config()->color_by_name ("button border");
-
- fill_start_active_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill start active", name));
- fill_end_active_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill end active", name));
-
- fill_start_inactive_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill start", name));
- fill_end_inactive_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill end", name));
+ fill_active_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill active", name));
+ fill_inactive_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill", name));
text_active_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: text active", name));
text_inactive_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: text", name));
@@ -592,7 +566,8 @@ void ArdourButton::set_fixed_colors (const uint32_t color_active, const uint32_t
{
_fixed_colors_set = true;
- fill_start_active_color = fill_end_active_color = color_active;
+ fill_active_color = color_active;
+ fill_inactive_color = color_inactive;
unsigned char r, g, b, a;
UINT_TO_RGBA(color_active, &r, &g, &b, &a);
@@ -605,13 +580,25 @@ void ArdourButton::set_fixed_colors (const uint32_t color_active, const uint32_t
(max (double(g), 0.) - min (double(g), 0.)) +
(max (double(b), 0.) - min (double(b), 0.));
- text_active_color =
- text_inactive_color = (white_contrast > black_contrast) ?
+ text_active_color = (white_contrast > black_contrast) ?
RGBA_TO_UINT(255, 255, 255, 255) : /* use white */
RGBA_TO_UINT( 0, 0, 0, 255); /* use black */
- fill_start_inactive_color = fill_end_inactive_color = color_inactive;
+ UINT_TO_RGBA(color_inactive, &r, &g, &b, &a);
+
+ white_contrast = (max (double(r), 255.) - min (double(r), 255.)) +
+ (max (double(g), 255.) - min (double(g), 255.)) +
+ (max (double(b), 255.) - min (double(b), 255.));
+
+ black_contrast = (max (double(r), 0.) - min (double(r), 0.)) +
+ (max (double(g), 0.) - min (double(g), 0.)) +
+ (max (double(b), 0.) - min (double(b), 0.));
+
+ text_inactive_color = (white_contrast > black_contrast) ?
+ RGBA_TO_UINT(255, 255, 255, 255) : /* use white */
+ RGBA_TO_UINT( 0, 0, 0, 255); /* use black */
+
/* XXX what about led colors ? */
build_patterns ();
@@ -621,118 +608,38 @@ void ArdourButton::set_fixed_colors (const uint32_t color_active, const uint32_t
void
ArdourButton::build_patterns ()
{
- uint32_t start_color;
- uint32_t end_color;
- uint32_t text_color;
- uint32_t led_color;
- uint32_t r, g, b, a;
-
- if (shine_pattern) {
- cairo_pattern_destroy (shine_pattern);
- shine_pattern = 0;
+ if (convex_pattern) {
+ cairo_pattern_destroy (convex_pattern);
+ convex_pattern = 0;
}
- if (fill_pattern) {
- cairo_pattern_destroy (fill_pattern);
- fill_pattern = 0;
- }
-
- if (fill_pattern_active) {
- cairo_pattern_destroy (fill_pattern_active);
- fill_pattern_active = 0;
- }
-
- if (_elements & Body) {
-
- if (_flat_buttons) {
- end_color = start_color = fill_start_active_color;
- } else {
- start_color = fill_start_active_color;
- end_color = fill_end_active_color;
- }
- UINT_TO_RGBA (start_color, &r, &g, &b, &a);
-
- active_r = r/255.0;
- active_g = g/255.0;
- active_b = b/255.0;
- active_a = a/255.0;
-
- shine_pattern = cairo_pattern_create_linear (0.0, 0.0, 0.0, get_height());
- cairo_pattern_add_color_stop_rgba (shine_pattern, 0, 1,1,1,0.0);
- cairo_pattern_add_color_stop_rgba (shine_pattern, 0.5, 1,1,1,0.1);
- cairo_pattern_add_color_stop_rgba (shine_pattern, 0.7, 1,1,1,0.2);
- cairo_pattern_add_color_stop_rgba (shine_pattern, 1, 1,1,1,0.1);
-
- fill_pattern = cairo_pattern_create_linear (0.0, 0.0, 0.0, get_height()-3);
- if (_flat_buttons) {
- end_color = start_color = fill_start_inactive_color;
- } else {
- start_color = fill_start_inactive_color;
- end_color = fill_end_inactive_color;
- }
- UINT_TO_RGBA (start_color, &r, &g, &b, &a);
- cairo_pattern_add_color_stop_rgba (fill_pattern, 0, r/255.0,g/255.0,b/255.0, a/255.0);
- UINT_TO_RGBA (end_color, &r, &g, &b, &a);
- cairo_pattern_add_color_stop_rgba (fill_pattern, 1, r/255.0,g/255.0,b/255.0, a/255.0);
-
- fill_pattern_active = cairo_pattern_create_linear (0.0, 0.0, 0.0, get_height()-3);
- if (_flat_buttons) {
- if (active_state() == Gtkmm2ext::ImplicitActive && (_tweaks & ImplicitUsesSolidColor)) {
- end_color = start_color = led_active_color;
- } else {
- end_color = start_color = fill_end_active_color;
- }
- } else {
- if (active_state() == Gtkmm2ext::ImplicitActive && (_tweaks & ImplicitUsesSolidColor)) {
- end_color = start_color = led_active_color;
- } else {
- start_color = fill_start_active_color;
- end_color = fill_end_active_color;
- }
- }
- UINT_TO_RGBA (start_color, &r, &g, &b, &a);
- cairo_pattern_add_color_stop_rgba (fill_pattern_active, 0, r/255.0,g/255.0,b/255.0, a/255.0);
- UINT_TO_RGBA (end_color, &r, &g, &b, &a);
- cairo_pattern_add_color_stop_rgba (fill_pattern_active, 1, r/255.0,g/255.0,b/255.0, a/255.0);
+ if (concave_pattern) {
+ cairo_pattern_destroy (concave_pattern);
+ concave_pattern = 0;
}
if (led_inset_pattern) {
cairo_pattern_destroy (led_inset_pattern);
}
- if (reflection_pattern) {
- cairo_pattern_destroy (reflection_pattern);
- }
+ float width = get_width(); float height = get_height();
+
+ //convex gradient
+ convex_pattern = cairo_pattern_create_linear (0.0, 0, 0.0, height);
+ cairo_pattern_add_color_stop_rgba (convex_pattern, 0.0, 0,0,0, 0.0);
+ cairo_pattern_add_color_stop_rgba (convex_pattern, 1.0, 0,0,0, 0.35);
+
+ //concave gradient
+ concave_pattern = cairo_pattern_create_linear (0.0, 0, 0.0, height);
+ cairo_pattern_add_color_stop_rgba (concave_pattern, 0.0, 0,0,0, 0.5);
+ cairo_pattern_add_color_stop_rgba (concave_pattern, 0.7, 0,0,0, 0.0);
if (_elements & Indicator) {
led_inset_pattern = cairo_pattern_create_linear (0.0, 0.0, 0.0, _diameter);
cairo_pattern_add_color_stop_rgba (led_inset_pattern, 0, 0,0,0, 0.4);
cairo_pattern_add_color_stop_rgba (led_inset_pattern, 1, 1,1,1, 0.7);
-
- reflection_pattern = cairo_pattern_create_linear (0.0, 0.0, 0.0, _diameter/2-3);
- cairo_pattern_add_color_stop_rgba (reflection_pattern, 0, 1,1,1, active_state() ? 0.4 : 0.2);
- cairo_pattern_add_color_stop_rgba (reflection_pattern, 1, 1,1,1, 0.0);
}
- if (active_state() == Gtkmm2ext::ExplicitActive || ((_tweaks & ImplicitUsesSolidColor) && active_state() == Gtkmm2ext::ImplicitActive)) {
- text_color = text_active_color;
- led_color = led_active_color;
- } else {
- text_color = text_inactive_color;
- led_color = led_inactive_color;
- }
-
- UINT_TO_RGBA (text_color, &r, &g, &b, &a);
- text_r = r/255.0;
- text_g = g/255.0;
- text_b = b/255.0;
- text_a = a/255.0;
- UINT_TO_RGBA (led_color, &r, &g, &b, &a);
- led_r = r/255.0;
- led_g = g/255.0;
- led_b = b/255.0;
- led_a = a/255.0;
-
set_dirty ();
}
@@ -752,14 +659,13 @@ ArdourButton::on_button_press_event (GdkEventButton *ev)
}
}
- if (_tweaks & ShowClick) {
- set_active_state (Gtkmm2ext::ExplicitActive);
- }
+ _grabbed = true;
+ queue_draw ();
if (binding_proxy.button_press_handler (ev)) {
return true;
}
-
+
if (!_act_on_release) {
if (_action) {
_action->activate ();
@@ -781,9 +687,9 @@ ArdourButton::on_button_release_event (GdkEventButton *ev)
}
}
- if (_tweaks & ShowClick) {
- unset_active_state ();
- }
+ _grabbed = false;
+ queue_draw ();
+
if (_hovering) {
signal_clicked ();
@@ -1060,13 +966,6 @@ ArdourButton::action_tooltip_changed ()
ARDOUR_UI::instance()->set_tip (*this, str);
}
-void
-ArdourButton::set_rounded_corner_mask (int mask)
-{
- _corner_mask = mask;
- queue_draw ();
-}
-
void
ArdourButton::set_elements (Element e)
{
diff --git a/gtk2_ardour/ardour_button.h b/gtk2_ardour/ardour_button.h
index 260e0b21ab..d36445d181 100644
--- a/gtk2_ardour/ardour_button.h
+++ b/gtk2_ardour/ardour_button.h
@@ -37,7 +37,7 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
Body = 0x2,
Text = 0x4,
Indicator = 0x8,
- Inset = 0x10,
+ unused = 0x10,
Menu = 0x20,
};
@@ -53,9 +53,9 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
virtual ~ArdourButton ();
enum Tweaks {
- ShowClick = 0x1,
- NoModel = 0x2,
- ImplicitUsesSolidColor = 0x4,
+ unused1 = 0x1,
+ unused2 = 0x2,
+ unused3 = 0x4,
};
Tweaks tweaks() const { return _tweaks; }
@@ -64,12 +64,13 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
void set_active_state (Gtkmm2ext::ActiveState);
void set_visual_state (Gtkmm2ext::VisualState);
+ void set_act_on_release (bool onRelease) { _act_on_release = onRelease; }
+
Element elements() const { return _elements; }
void set_elements (Element);
void add_elements (Element);
void set_corner_radius (float);
- void set_rounded_corner_mask (int);
void set_diameter (float);
void set_text (const std::string&);
@@ -132,40 +133,22 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
double _angle;
float _xalign, _yalign;
- uint32_t bg_color;
- uint32_t border_color;
- uint32_t fill_start_inactive_color;
- uint32_t fill_end_inactive_color;
- uint32_t fill_start_active_color;
- uint32_t fill_end_active_color;
- uint32_t text_active_color;
- uint32_t text_inactive_color;
- uint32_t led_active_color;
- uint32_t led_inactive_color;
+ uint32_t fill_inactive_color;
+ uint32_t fill_active_color;
+
+ uint32_t text_active_color;
+ uint32_t text_inactive_color;
+
+ uint32_t led_active_color;
+ uint32_t led_inactive_color;
- cairo_pattern_t* fill_pattern;
- cairo_pattern_t* fill_pattern_active;
- cairo_pattern_t* shine_pattern;
+ cairo_pattern_t* convex_pattern;
+ cairo_pattern_t* concave_pattern;
+
cairo_pattern_t* led_inset_pattern;
- cairo_pattern_t* reflection_pattern;
cairo_rectangle_t* _led_rect;
- double text_r;
- double text_g;
- double text_b;
- double text_a;
-
- double led_r;
- double led_g;
- double led_b;
- double led_a;
-
- double active_r;
- double active_g;
- double active_b;
- double active_a;
-
bool _act_on_release;
bool _led_left;
bool _fixed_diameter;
diff --git a/gtk2_ardour/ardour_knob.cc b/gtk2_ardour/ardour_knob.cc
index 92b10a3cea..de99946763 100644
--- a/gtk2_ardour/ardour_knob.cc
+++ b/gtk2_ardour/ardour_knob.cc
@@ -118,10 +118,10 @@ ArdourKnob::render (cairo_t* cr, cairo_rectangle_t *)
//look up the arc colors from the config
double red_start, green_start, blue_start, unused;
- ArdourCanvas::Color arc_start_color = ARDOUR_UI::config()->color_by_name ( "processor fader: fill start");
+ ArdourCanvas::Color arc_start_color = ARDOUR_UI::config()->color_by_name ( string_compose ("%1: arc start", get_name()));
ArdourCanvas::color_to_rgba( arc_start_color, red_start, green_start, blue_start, unused );
double red_end, green_end, blue_end;
- ArdourCanvas::Color arc_end_color = ARDOUR_UI::config()->color_by_name ( "processor fader: fill end" );
+ ArdourCanvas::Color arc_end_color = ARDOUR_UI::config()->color_by_name ( string_compose ("%1: arc end", get_name()) );
ArdourCanvas::color_to_rgba( arc_end_color, red_end, green_end, blue_end, unused );
//vary the arc color over the travel of the knob
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc
index 1b842de30a..73982bb436 100644
--- a/gtk2_ardour/ardour_ui.cc
+++ b/gtk2_ardour/ardour_ui.cc
@@ -265,10 +265,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
rec_button.set_name ("transport recenable button");
midi_panic_button.set_name ("transport button");
- goto_start_button.set_tweaks (ArdourButton::ShowClick);
- goto_end_button.set_tweaks (ArdourButton::ShowClick);
- midi_panic_button.set_tweaks (ArdourButton::ShowClick);
-
last_configure_time= 0;
last_peak_grab = 0;
@@ -1133,8 +1129,7 @@ ARDOUR_UI::every_point_zero_something_seconds ()
float mpeak = editor_meter->update_meters();
if (mpeak > editor_meter_max_peak) {
if (mpeak >= Config->get_meter_peak()) {
- editor_meter_peak_display.set_name ("meterbridge peakindicator on");
- editor_meter_peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body));
+ editor_meter_peak_display.set_active_state ( Gtkmm2ext::ExplicitActive );
}
}
}
@@ -2482,7 +2477,7 @@ ARDOUR_UI::transport_rec_enable_blink (bool onoff)
if (onoff) {
rec_button.set_active_state (Gtkmm2ext::ExplicitActive);
} else {
- rec_button.set_active_state (Gtkmm2ext::ImplicitActive);
+ rec_button.set_active_state (Gtkmm2ext::Off);
}
} else if (r == Session::Recording && h) {
rec_button.set_active_state (Gtkmm2ext::ExplicitActive);
@@ -4416,8 +4411,7 @@ ARDOUR_UI::reset_peak_display ()
if (!_session || !_session->master_out() || !editor_meter) return;
editor_meter->clear_meters();
editor_meter_max_peak = -INFINITY;
- editor_meter_peak_display.set_name ("meterbridge peakindicator");
- editor_meter_peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body));
+ editor_meter_peak_display.set_active_state ( Gtkmm2ext::Off );
}
void
diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc
index 9456a11b64..bd06f346f8 100644
--- a/gtk2_ardour/ardour_ui2.cc
+++ b/gtk2_ardour/ardour_ui2.cc
@@ -145,7 +145,7 @@ ARDOUR_UI::setup_tooltips ()
set_tip (feedback_alert_button, _("When active, there is a feedback loop."));
set_tip (primary_clock, _("Primary Clock right-click to set display mode. Click to edit, click+drag a digit or mouse-over+scroll wheel to modify.\nText edits: right-to-left overwrite Esc: cancel; Enter: confirm; postfix the edit with '+' or '-' to enter delta times.\n"));
set_tip (secondary_clock, _("Secondary Clock right-click to set display mode. Click to edit, click+drag a digit or mouse-over+scroll wheel to modify.\nText edits: right-to-left overwrite Esc: cancel; Enter: confirm; postfix the edit with '+' or '-' to enter delta times.\n"));
- set_tip (editor_meter_peak_display, _("Reset Level Meter"));
+ set_tip (editor_meter_peak_display, _("Reset All Peak Indicators"));
synchronize_sync_source_and_video_pullup ();
diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc
index 6fef5b94e4..f23e91069e 100644
--- a/gtk2_ardour/ardour_ui_dialogs.cc
+++ b/gtk2_ardour/ardour_ui_dialogs.cc
@@ -222,10 +222,9 @@ ARDOUR_UI::set_session (Session *s)
ArdourMeter::ResetGroupPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_group_peak_display));
editor_meter_peak_display.set_name ("meterbridge peakindicator");
- editor_meter_peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body));
editor_meter_peak_display.unset_flags (Gtk::CAN_FOCUS);
- editor_meter_peak_display.set_size_request(6, -1);
- editor_meter_peak_display.set_corner_radius(2);
+ editor_meter_peak_display.set_size_request(10, -1);
+ editor_meter_peak_display.set_corner_radius(1);
editor_meter_max_peak = -INFINITY;
editor_meter_peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &ARDOUR_UI::editor_meter_peak_button_release), false);
@@ -571,7 +570,7 @@ ARDOUR_UI::editor_meter_peak_button_release (GdkEventButton* ev)
} else if (_session->master_out()) {
ArdourMeter::ResetRoutePeakDisplays (_session->master_out().get());
}
- return true;
+ return false;
}
void
diff --git a/gtk2_ardour/canvas_vars.h b/gtk2_ardour/canvas_vars.h
index 4277149a35..6d44073428 100644
--- a/gtk2_ardour/canvas_vars.h
+++ b/gtk2_ardour/canvas_vars.h
@@ -90,13 +90,6 @@ CANVAS_VARIABLE(canvasvar_MidiMeterColor8, "midi meter fill: 8")
CANVAS_VARIABLE(canvasvar_MidiMeterColor9, "midi meter fill: 9")
CANVAS_VARIABLE(canvasvar_MeterBackgroundBot, "meter background: bottom")
CANVAS_VARIABLE(canvasvar_MeterBackgroundTop, "meter background: top")
-CANVAS_VARIABLE(canvasvar_MeterBridgePeakindicatorOffFillStart, "meterbridge peakindicator: fill start")
-CANVAS_VARIABLE(canvasvar_MeterBridgePeakindicatorOffFillEnd, "meterbridge peakindicator: fill end")
-CANVAS_VARIABLE(canvasvar_MeterBridgePeakindicatorOnFillStart, "meterbridge peakindicator on: fill start")
-CANVAS_VARIABLE(canvasvar_MeterBridgePeakindicatorOnFillEnd, "meterbridge peakindicator on: fill end")
-CANVAS_VARIABLE(canvasvar_MeterBridgeLabelFillStart, "meterbridge label: fill start")
-CANVAS_VARIABLE(canvasvar_MeterBridgeLabelFillEnd, "meterbridge label: fill end")
-CANVAS_VARIABLE(canvasvar_MeterBridgeLabelText, "meterbridge label: text")
CANVAS_VARIABLE(canvasvar_MeterMarker, "meter marker")
CANVAS_VARIABLE(canvasvar_MidiBusBase, "midi bus base")
CANVAS_VARIABLE(canvasvar_MidiFrameBase, "midi frame base")
@@ -170,9 +163,8 @@ CANVAS_VARIABLE(canvasvar_TimeAxisFrame, "time axis frame")
CANVAS_VARIABLE(canvasvar_SelectedTimeAxisFrame, "selected time axis frame")
CANVAS_VARIABLE(canvasvar_TimeStretchFill, "time stretch fill")
CANVAS_VARIABLE(canvasvar_TimeStretchOutline, "time stretch outline")
-CANVAS_VARIABLE(canvasvar_TrackNumberLabelFillStart, "tracknumber label: fill start")
-CANVAS_VARIABLE(canvasvar_TrackNumberLabelFillEnd, "tracknumber label: fill end")
-CANVAS_VARIABLE(canvasvar_TrackNumberLabelText, "tracknumber label: text")
+CANVAS_VARIABLE(canvasvar_MonitorKnobArcStart, "monitor knob: arc start")
+CANVAS_VARIABLE(canvasvar_MonitorKnobArcEnd, "monitor knob: arc end")
CANVAS_VARIABLE(canvasvar_TransportDragRect, "transport drag rect")
CANVAS_VARIABLE(canvasvar_TransportLoopRect, "transport loop rect")
CANVAS_VARIABLE(canvasvar_TransportMarkerBar, "transport marker bar")
@@ -193,10 +185,8 @@ CANVAS_VARIABLE(canvasvar_MonitorSectionKnob, "monitor knob")
CANVAS_VARIABLE(canvasvar_ButtonBorder, "border color")
#define BUTTON_VARS(root,name) \
-CANVAS_VARIABLE(canvasvar_ ## root ## FillStart, name ": fill start") \
-CANVAS_VARIABLE(canvasvar_ ## root ## FillEnd, name ": fill end") \
-CANVAS_VARIABLE(canvasvar_ ## root ## FillStartActive, name ": fill start active") \
-CANVAS_VARIABLE(canvasvar_ ## root ## FillEndActive, name ": fill end active") \
+CANVAS_VARIABLE(canvasvar_ ## root ## Fill, name ": fill") \
+CANVAS_VARIABLE(canvasvar_ ## root ## FillActive, name ": fill active") \
CANVAS_VARIABLE(canvasvar_ ## root ## LED, name ": led") \
CANVAS_VARIABLE(canvasvar_ ## root ## LEDActive, name ": led active") \
CANVAS_VARIABLE(canvasvar_ ## root ## Text, name ": text") \
@@ -210,6 +200,8 @@ BUTTON_VARS(MonitorButton, "monitor button")
BUTTON_VARS(SoloIsolateButton, "solo isolate")
BUTTON_VARS(SoloSafeButton, "solo safe")
BUTTON_VARS(MidiDeviceButton, "midi device")
+BUTTON_VARS(MeterBridgePeakIndicator, "meterbridge peakindicator")
+BUTTON_VARS(MeterBridgeLabel, "meterbridge label")
BUTTON_VARS(MonitorSectionCutButton, "monitor section cut")
BUTTON_VARS(MonitorSectionDimButton, "monitor section dim")
BUTTON_VARS(MonitorSectionSoloButton, "monitor section solo")
@@ -231,6 +223,7 @@ BUTTON_VARS(TransportButton, "transport button")
BUTTON_VARS(TransportRecenableButton, "transport recenable button")
BUTTON_VARS(TransportOptionButton, "transport option button")
BUTTON_VARS(TransportActiveOptionButton, "transport active option button")
+BUTTON_VARS(TrackNumberLabel, "tracknumber label")
BUTTON_VARS(PluginBypassButton, "plugin bypass button")
BUTTON_VARS(PunchButton, "punch button")
BUTTON_VARS(MouseModeButton, "mouse mode button")
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index 692f4efff0..a365b6a7a1 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -673,11 +673,9 @@ Editor::Editor ()
/* nudge stuff */
nudge_forward_button.set_name ("nudge button");
-// nudge_forward_button.add_elements (ArdourButton::Inset);
nudge_forward_button.set_image(::get_icon("nudge_right"));
nudge_backward_button.set_name ("nudge button");
-// nudge_backward_button.add_elements (ArdourButton::Inset);
nudge_backward_button.set_image(::get_icon("nudge_left"));
fade_context_menu.set_name ("ArdourContextMenu");
@@ -2881,28 +2879,21 @@ Editor::setup_toolbar ()
zoom_preset_selector.set_size_request (42, -1);
zoom_in_button.set_name ("zoom button");
-// zoom_in_button.add_elements ( ArdourButton::Inset );
- zoom_in_button.set_tweaks ((ArdourButton::Tweaks) (ArdourButton::ShowClick) );
zoom_in_button.set_image(::get_icon ("zoom_in"));
act = ActionManager::get_action (X_("Editor"), X_("temporal-zoom-in"));
zoom_in_button.set_related_action (act);
zoom_out_button.set_name ("zoom button");
-// zoom_out_button.add_elements ( ArdourButton::Inset );
- zoom_out_button.set_tweaks ((ArdourButton::Tweaks) (ArdourButton::ShowClick) );
zoom_out_button.set_image(::get_icon ("zoom_out"));
act = ActionManager::get_action (X_("Editor"), X_("temporal-zoom-out"));
zoom_out_button.set_related_action (act);
zoom_out_full_button.set_name ("zoom button");
-// zoom_out_full_button.add_elements ( ArdourButton::Inset );
- zoom_out_full_button.set_tweaks ((ArdourButton::Tweaks) (ArdourButton::ShowClick) );
zoom_out_full_button.set_image(::get_icon ("zoom_full"));
act = ActionManager::get_action (X_("Editor"), X_("zoom-to-session"));
zoom_out_full_button.set_related_action (act);
zoom_focus_selector.set_name ("zoom button");
-// zoom_focus_selector.add_elements (ArdourButton::Inset);
if (ARDOUR::Profile->get_mixbus()) {
_zoom_box.pack_start (zoom_preset_selector, false, false);
@@ -2918,7 +2909,6 @@ Editor::setup_toolbar ()
/* Track zoom buttons */
visible_tracks_selector.set_name ("zoom button");
-// visible_tracks_selector.add_elements ( ArdourButton::Inset );
if (Profile->get_mixbus()) {
visible_tracks_selector.set_image(::get_icon ("tav_exp"));
visible_tracks_selector.set_size_request (42, -1);
@@ -2927,16 +2917,12 @@ Editor::setup_toolbar ()
}
tav_expand_button.set_name ("zoom button");
-// tav_expand_button.add_elements ( ArdourButton::FlatFace );
- tav_expand_button.set_tweaks ((ArdourButton::Tweaks) (ArdourButton::ShowClick) );
tav_expand_button.set_size_request (-1, 20);
tav_expand_button.set_image(::get_icon ("tav_exp"));
act = ActionManager::get_action (X_("Editor"), X_("expand-tracks"));
tav_expand_button.set_related_action (act);
tav_shrink_button.set_name ("zoom button");
-// tav_shrink_button.add_elements ( ArdourButton::FlatFace );
- tav_shrink_button.set_tweaks ((ArdourButton::Tweaks) (ArdourButton::ShowClick) );
tav_shrink_button.set_size_request (-1, 20);
tav_shrink_button.set_image(::get_icon ("tav_shrink"));
act = ActionManager::get_action (X_("Editor"), X_("shrink-tracks"));
@@ -2992,9 +2978,6 @@ Editor::setup_toolbar ()
nudge_forward_button.signal_button_release_event().connect (sigc::mem_fun(*this, &Editor::nudge_forward_release), false);
nudge_backward_button.signal_button_release_event().connect (sigc::mem_fun(*this, &Editor::nudge_backward_release), false);
- nudge_forward_button.set_tweaks ((ArdourButton::Tweaks) (ArdourButton::ShowClick) );
- nudge_backward_button.set_tweaks ((ArdourButton::Tweaks) (ArdourButton::ShowClick) );
-
nudge_box->pack_start (nudge_backward_button, false, false);
nudge_box->pack_start (nudge_forward_button, false, false);
nudge_box->pack_start (*nudge_clock, false, false);
diff --git a/gtk2_ardour/editor_routes.cc b/gtk2_ardour/editor_routes.cc
index 025633b090..8372287509 100644
--- a/gtk2_ardour/editor_routes.cc
+++ b/gtk2_ardour/editor_routes.cc
@@ -679,12 +679,12 @@ EditorRoutes::routes_added (list routes)
t->RecordEnableChanged.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_rec_display, this), gui_context());
}
- if ((*x)->is_midi_track()) {
- boost::shared_ptr t = boost::dynamic_pointer_cast ((*x)->route());
+ if ((*x)->is_midi_track()) {
+ boost::shared_ptr t = boost::dynamic_pointer_cast ((*x)->route());
t->StepEditStatusChange.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_rec_display, this), gui_context());
- t->InputActiveChanged.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_input_active_display, this), gui_context());
- }
-
+ t->InputActiveChanged.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_input_active_display, this), gui_context());
+ }
+
(*x)->route()->mute_changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_mute_display, this), gui_context());
(*x)->route()->solo_changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_solo_display, this, _1), gui_context());
(*x)->route()->listen_changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_solo_display, this, _1), gui_context());
diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc
index fd38da65e6..6c1b110356 100644
--- a/gtk2_ardour/meter_strip.cc
+++ b/gtk2_ardour/meter_strip.cc
@@ -154,6 +154,7 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr rt)
// peak display
peak_display.set_name ("meterbridge peakindicator");
peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body));
+ ARDOUR_UI::instance()->set_tip (peak_display, _("Reset Peak"));
max_peak = minus_infinity();
peak_display.unset_flags (Gtk::CAN_FOCUS);
peak_display.set_size_request(12, 8);
@@ -205,7 +206,6 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr rt)
rec_enable_button->set_corner_radius(2);
rec_enable_button->set_size_request(16, 16);
- rec_enable_button->set_image (::get_icon (X_("record_normal_red")));
mute_button->set_corner_radius(2);
mute_button->set_size_request(16, 16);
@@ -340,9 +340,9 @@ MeterStrip::set_session (Session* s)
}
void
-MeterStrip::update_rec_display ()
+MeterStrip::blink_rec_display (bool onoff)
{
- RouteUI::update_rec_display ();
+ RouteUI::blink_rec_display (onoff);
}
std::string
@@ -393,6 +393,13 @@ MeterStrip::strip_property_changed (const PropertyChange& what_changed)
}
}
+void
+MeterStrip::route_color_changed ()
+{
+ number_label.set_fixed_colors (gdk_color_to_rgba (color()), gdk_color_to_rgba (color()));
+}
+
+
void
MeterStrip::fast_update ()
{
@@ -400,8 +407,7 @@ MeterStrip::fast_update ()
if (mpeak > max_peak) {
max_peak = mpeak;
if (mpeak >= Config->get_meter_peak()) {
- peak_display.set_name ("meterbridge peakindicator on");
- peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body));
+ peak_display.set_active_state ( Gtkmm2ext::ExplicitActive );
}
}
}
@@ -645,8 +651,7 @@ MeterStrip::reset_peak_display ()
_route->shared_peak_meter()->reset_max();
level_meter->clear_meters();
max_peak = -INFINITY;
- peak_display.set_name ("meterbridge peakindicator");
- peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body));
+ peak_display.set_active_state ( Gtkmm2ext::Off );
}
bool
@@ -661,7 +666,7 @@ MeterStrip::peak_button_release (GdkEventButton* ev)
} else {
ResetRoutePeakDisplays (_route.get());
}
- return true;
+ return false;
}
void
diff --git a/gtk2_ardour/meter_strip.h b/gtk2_ardour/meter_strip.h
index 0ccf21d60c..d8370b45f0 100644
--- a/gtk2_ardour/meter_strip.h
+++ b/gtk2_ardour/meter_strip.h
@@ -88,7 +88,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI
void on_size_request (Gtk::Requisition*);
/* route UI */
- void update_rec_display ();
+ void blink_rec_display (bool onoff);
std::string state_id() const;
void set_button_names ();
@@ -142,6 +142,8 @@ class MeterStrip : public Gtk::VBox, public RouteUI
void update_button_box ();
void update_name_box ();
void name_changed ();
+
+ void route_color_changed ();
bool _suspend_menu_callbacks;
bool level_meter_button_release (GdkEventButton* ev);
diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc
index 7352198e45..a7f8360ef7 100644
--- a/gtk2_ardour/mixer_strip.cc
+++ b/gtk2_ardour/mixer_strip.cc
@@ -324,12 +324,16 @@ MixerStrip::init ()
_session->engine().Running.connect (*this, invalidator (*this), boost::bind (&MixerStrip::engine_running, this), gui_context());
input_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MixerStrip::input_press), false);
- output_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MixerStrip::output_press), false);
+ input_button.signal_button_release_event().connect (sigc::mem_fun(*this, &MixerStrip::input_release), false);
- /* ditto for this button and busses */
+ output_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MixerStrip::output_press), false);
+ output_button.signal_button_release_event().connect (sigc::mem_fun(*this, &MixerStrip::output_release), false);
number_label.signal_button_press_event().connect (sigc::mem_fun(*this, &MixerStrip::number_button_button_press), false);
+
name_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MixerStrip::name_button_button_press), false);
+ name_button.signal_button_release_event().connect (sigc::mem_fun(*this, &MixerStrip::name_button_button_release), false);
+
group_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MixerStrip::select_route_group), false);
_width = (Width) -1;
@@ -759,6 +763,18 @@ struct RouteCompareByName {
}
};
+gint
+MixerStrip::output_release (GdkEventButton *ev)
+{
+ switch (ev->button) {
+ case 1:
+ edit_output_configuration ();
+ break;
+ }
+
+ return false;
+}
+
gint
MixerStrip::output_press (GdkEventButton *ev)
{
@@ -773,8 +789,7 @@ MixerStrip::output_press (GdkEventButton *ev)
switch (ev->button) {
case 1:
- edit_output_configuration ();
- break;
+ return false; //wait for the mouse-up to pop the dialog
case 3:
{
@@ -836,6 +851,23 @@ MixerStrip::output_press (GdkEventButton *ev)
return TRUE;
}
+gint
+MixerStrip::input_release (GdkEventButton *ev)
+{
+ switch (ev->button) {
+
+ case 1:
+ edit_input_configuration ();
+ break;
+ default:
+ break;
+
+ }
+
+ return false;
+}
+
+
gint
MixerStrip::input_press (GdkEventButton *ev)
{
@@ -857,8 +889,7 @@ MixerStrip::input_press (GdkEventButton *ev)
switch (ev->button) {
case 1:
- edit_input_configuration ();
- break;
+ return false; //don't handle the mouse-down here. wait for mouse-up to pop the menu
case 3:
{
@@ -1479,11 +1510,23 @@ MixerStrip::build_route_ops_menu ()
gboolean
MixerStrip::name_button_button_press (GdkEventButton* ev)
{
- /* show menu for either button 1 or 3, so as not to confuse people
- and also not hide stuff from them.
- */
+ if (ev->button == 3) {
+ list_route_operations ();
- if (ev->button == 3 || ev->button == 1) {
+ /* do not allow rename if the track is record-enabled */
+ rename_menu_item->set_sensitive (!_route->record_enabled());
+ route_ops_menu->popup (1, ev->time);
+
+ return true;
+ }
+
+ return false;
+}
+
+gboolean
+MixerStrip::name_button_button_release (GdkEventButton* ev)
+{
+ if (ev->button == 1) {
list_route_operations ();
/* do not allow rename if the track is record-enabled */
@@ -1503,6 +1546,8 @@ MixerStrip::number_button_button_press (GdkEventButton* ev)
/* do not allow rename if the track is record-enabled */
rename_menu_item->set_sensitive (!_route->record_enabled());
route_ops_menu->popup (1, ev->time);
+
+ return true;
}
return false;
@@ -1914,7 +1959,7 @@ MixerStrip::set_button_names ()
{
switch (_width) {
case Wide:
- rec_enable_button->set_text (_("Rec"));
+// rec_enable_button->set_text (_("Rec"));
mute_button->set_text (_("Mute"));
monitor_input_button->set_text (_("In"));
monitor_disk_button->set_text (_("Disk"));
@@ -1941,7 +1986,7 @@ MixerStrip::set_button_names ()
break;
default:
- rec_enable_button->set_text (_("R"));
+// rec_enable_button->set_text (_("R"));
mute_button->set_text (_("M"));
monitor_input_button->set_text (_("I"));
monitor_disk_button->set_text (_("D"));
diff --git a/gtk2_ardour/mixer_strip.h b/gtk2_ardour/mixer_strip.h
index 464a49da63..bd3c3a289b 100644
--- a/gtk2_ardour/mixer_strip.h
+++ b/gtk2_ardour/mixer_strip.h
@@ -205,7 +205,10 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
RouteGroupMenu *group_menu;
gint input_press (GdkEventButton *);
+ gint input_release (GdkEventButton *);
+
gint output_press (GdkEventButton *);
+ gint output_release (GdkEventButton *);
Gtk::Menu input_menu;
std::list > input_menu_bundles;
@@ -242,6 +245,7 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
Gtk::Menu* route_ops_menu;
void build_route_ops_menu ();
gboolean name_button_button_press (GdkEventButton*);
+ gboolean name_button_button_release (GdkEventButton*);
gboolean number_button_button_press (GdkEventButton*);
void list_route_operations ();
diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc
index e819f9ec44..b31299a3ec 100644
--- a/gtk2_ardour/route_time_axis.cc
+++ b/gtk2_ardour/route_time_axis.cc
@@ -149,7 +149,6 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt)
mute_changed (0);
update_solo_display ();
- route_color_changed();
timestretch_rect = 0;
no_redraw = false;
@@ -2276,9 +2275,9 @@ RouteTimeAxisView::can_edit_name () const
}
void
-RouteTimeAxisView::update_rec_display ()
+RouteTimeAxisView::blink_rec_display (bool onoff)
{
- RouteUI::update_rec_display ();
+ RouteUI::blink_rec_display (onoff);
}
void
diff --git a/gtk2_ardour/route_time_axis.h b/gtk2_ardour/route_time_axis.h
index cfc71d89fa..8e0941d591 100644
--- a/gtk2_ardour/route_time_axis.h
+++ b/gtk2_ardour/route_time_axis.h
@@ -208,7 +208,7 @@ protected:
void route_property_changed (const PBD::PropertyChange&);
void name_entry_changed ();
- void update_rec_display ();
+ void blink_rec_display (bool onoff);
virtual void label_view ();
diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc
index a9d63a53b5..a413c0d3e0 100644
--- a/gtk2_ardour/route_ui.cc
+++ b/gtk2_ardour/route_ui.cc
@@ -79,6 +79,7 @@ RouteUI::RouteUI (ARDOUR::Session* sess)
, comment_window(0)
, input_selector (0)
, output_selector (0)
+ , comment_area(0)
, _invert_menu(0)
{
if (sess) init ();
@@ -97,6 +98,9 @@ RouteUI::~RouteUI()
delete input_selector;
delete output_selector;
delete _invert_menu;
+
+ send_blink_connection.disconnect ();
+ rec_blink_connection.disconnect ();
}
void
@@ -140,9 +144,11 @@ RouteUI::init ()
rec_enable_button = manage (new ArdourButton);
rec_enable_button->set_name ("record enable button");
-// rec_enable_button->set_tweaks (ArdourButton::ImplicitUsesSolidColor);
+ rec_enable_button->set_image (::get_icon (X_("record_normal_red")));
UI::instance()->set_tip (rec_enable_button, _("Enable recording on this track"), "");
+ rec_blink_connection = ARDOUR_UI::instance()->Blink.connect (sigc::mem_fun (*this, &RouteUI::blink_rec_display));
+
show_sends_button = manage (new ArdourButton);
show_sends_button->set_name ("send alert button");
UI::instance()->set_tip (show_sends_button, _("make mixer strips show sends to this bus"), "");
@@ -268,8 +274,6 @@ RouteUI::set_route (boost::shared_ptr rp)
set up the name entry/name label display.
*/
- update_rec_display ();
-
if (is_track()) {
boost::shared_ptr