ensure that all waveviews have ALL their colors set accurately before first render
[ardour.git] / gtk2_ardour / ardour_button.cc
index 47c98710150c1e984acdd9c374c72db2b9e58477..cc36fa483d902793218ad3eebd0fd6ec6557cc9e 100644 (file)
@@ -86,6 +86,7 @@ ArdourButton::ArdourButton (Element e)
        , _fixed_diameter (true)
        , _distinct_led_click (false)
        , _hovering (false)
+       , _focused (false)
 {
        ColorsChanged.connect (sigc::mem_fun (*this, &ArdourButton::color_handler));
 }
@@ -122,6 +123,7 @@ ArdourButton::ArdourButton (const std::string& str, Element e)
        , _fixed_diameter (true)
        , _distinct_led_click (false)
        , _hovering (false)
+       , _focused (false)
 {
        set_text (str);
 }
@@ -447,6 +449,16 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *)
                        cairo_fill (cr);
                }
        }
+       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);
+               double dashes = 1;
+               cairo_set_dash (cr, &dashes, 1, 0);
+               cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT);
+               cairo_set_line_width (cr, 1.0);
+               cairo_stroke (cr);
+               cairo_set_dash (cr, 0, 0, 0);
+       }
 }
 
 void
@@ -921,6 +933,37 @@ ArdourButton::set_visual_state (Gtkmm2ext::VisualState s)
        }
 }
        
+
+bool
+ArdourButton::on_focus_in_event (GdkEventFocus* ev)
+{
+       _focused = true;
+       queue_draw ();
+       return CairoWidget::on_focus_in_event (ev);
+}
+
+bool
+ArdourButton::on_focus_out_event (GdkEventFocus* ev)
+{
+       _focused = false;
+       queue_draw ();
+       return CairoWidget::on_focus_out_event (ev);
+}
+
+bool
+ArdourButton::on_key_release_event (GdkEventKey *ev) {
+       if (_focused &&
+                       (ev->keyval == GDK_KEY_space || ev->keyval == GDK_Return))
+       {
+               signal_clicked();
+               if (_action) {
+                       _action->activate ();
+               }
+               return true;
+       }
+       return CairoWidget::on_key_release_event (ev);
+}
+
 bool
 ArdourButton::on_enter_notify_event (GdkEventCrossing* ev)
 {