diff options
author | Robin Gareus <robin@gareus.org> | 2014-06-13 23:50:07 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2014-06-14 00:22:32 +0200 |
commit | bb2970e5e98e4ce4f3975d12a703aa87edf4f17b (patch) | |
tree | 3bdf6be0c2a7f7665a0e289f056ca10cd5acc827 /gtk2_ardour/ardour_button.cc | |
parent | e977b659af1bbba244df43d15fd1c02e7f82fe78 (diff) |
allow ardour button to handle focused keyboard events
Diffstat (limited to 'gtk2_ardour/ardour_button.cc')
-rw-r--r-- | gtk2_ardour/ardour_button.cc | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/gtk2_ardour/ardour_button.cc b/gtk2_ardour/ardour_button.cc index 47c9871015..f33732c3b7 100644 --- a/gtk2_ardour/ardour_button.cc +++ b/gtk2_ardour/ardour_button.cc @@ -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,14 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *) cairo_fill (cr); } } + if (_focused) { + rounded_function (cr, 0, 0, get_width(), get_height(), _corner_radius); + cairo_set_source_rgba (cr, 0.905, 0.917, 0.925, 0.5); + double dashes = 1; + cairo_set_dash (cr, &dashes, 1, 0); + cairo_stroke (cr); + cairo_set_dash (cr, 0, 0, 0); + } } void @@ -921,6 +931,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) { |