From e7c93053b64e72a0321db09a5675ba58c040567e Mon Sep 17 00:00:00 2001 From: Matthias Melcher Date: Sun, 14 Nov 2010 11:02:18 +0000 Subject: Added visual indication for buttons activated by a keyboard shortcut (STR 2372 git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@7826 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- src/Fl_Button.cxx | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'src/Fl_Button.cxx') diff --git a/src/Fl_Button.cxx b/src/Fl_Button.cxx index 167f5287c..1354a49a4 100644 --- a/src/Fl_Button.cxx +++ b/src/Fl_Button.cxx @@ -30,6 +30,10 @@ #include #include + +Fl_Widget_Tracker *Fl_Button::key_release_tracker = 0; + + // There are a lot of subclasses, named Fl_*_Button. Some of // them are implemented by setting the type() value and testing it // here. This includes Fl_Radio_Button and Fl_Toggle_Button @@ -156,6 +160,8 @@ int Fl_Button::handle(int event) { } else if (type() == FL_TOGGLE_BUTTON) { value(!value()); if (when() & FL_WHEN_CHANGED) do_callback(); + } else { + simulate_key_action(); } if (wp.deleted()) return 1; if (when() & FL_WHEN_RELEASE) do_callback(); @@ -166,6 +172,33 @@ int Fl_Button::handle(int event) { } } +void Fl_Button::simulate_key_action() +{ + if (key_release_tracker) { + Fl::remove_timeout(key_release_timeout, key_release_tracker); + key_release_timeout(key_release_tracker); + } + value(1); + redraw(); + key_release_tracker = new Fl_Widget_Tracker(this); + Fl::add_timeout(0.15, key_release_timeout, key_release_tracker); +} + +void Fl_Button::key_release_timeout(void *d) +{ + Fl_Widget_Tracker *wt = (Fl_Widget_Tracker*)d; + if (!wt) + return; + if (wt==key_release_tracker) + key_release_tracker = 0L; + Fl_Button *btn = (Fl_Button*)wt->widget(); + if (btn) { + btn->value(0); + btn->redraw(); + } + delete wt; +} + /** The constructor creates the button using the given position, size and label. \param[in] X, Y, W, H position and size of the widget -- cgit v1.2.3