summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthias Melcher <fltk@matthiasm.com>2010-11-14 11:02:18 +0000
committerMatthias Melcher <fltk@matthiasm.com>2010-11-14 11:02:18 +0000
commite7c93053b64e72a0321db09a5675ba58c040567e (patch)
tree040f76fd597ca3490b68dda021911f5656ada2c1 /src
parente729fccaf9cdc743b34691367161c8c6f0586bcd (diff)
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
Diffstat (limited to 'src')
-rw-r--r--src/Fl_Button.cxx33
-rw-r--r--src/Fl_Return_Button.cxx1
2 files changed, 34 insertions, 0 deletions
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 <FL/Fl_Group.H>
#include <FL/Fl_Window.H>
+
+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
diff --git a/src/Fl_Return_Button.cxx b/src/Fl_Return_Button.cxx
index 1ad4becd4..3ebe9da50 100644
--- a/src/Fl_Return_Button.cxx
+++ b/src/Fl_Return_Button.cxx
@@ -61,6 +61,7 @@ void Fl_Return_Button::draw() {
int Fl_Return_Button::handle(int event) {
if (event == FL_SHORTCUT &&
(Fl::event_key() == FL_Enter || Fl::event_key() == FL_KP_Enter)) {
+ simulate_key_action();
do_callback();
return 1;
} else