summaryrefslogtreecommitdiff
path: root/gtk2_ardour/ardour_button.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2014-06-13 23:50:07 +0200
committerRobin Gareus <robin@gareus.org>2014-06-14 00:22:32 +0200
commitbb2970e5e98e4ce4f3975d12a703aa87edf4f17b (patch)
tree3bdf6be0c2a7f7665a0e289f056ca10cd5acc827 /gtk2_ardour/ardour_button.cc
parente977b659af1bbba244df43d15fd1c02e7f82fe78 (diff)
allow ardour button to handle focused keyboard events
Diffstat (limited to 'gtk2_ardour/ardour_button.cc')
-rw-r--r--gtk2_ardour/ardour_button.cc41
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)
{