summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthias Melcher <github@matthiasm.com>2024-01-17 19:47:41 +0100
committerMatthias Melcher <github@matthiasm.com>2024-01-17 20:24:47 +0100
commit554bccbecdc2acdc73fd1ff851c541839ed8b523 (patch)
tree30d00ee8361e5bd926f183f2393c23b68bcaa39c /src
parenta038e557835a0b1e8700c53f267043856f22055f (diff)
Synchronize mouse and keyboard callbacks for Fl_Button (#877)
Keyboard behavior for button types was not consistent with mouse click behavior. This change avoids callbacks when pressed radio buttons are pressed again.
Diffstat (limited to 'src')
-rw-r--r--src/Fl_Button.cxx35
1 files changed, 28 insertions, 7 deletions
diff --git a/src/Fl_Button.cxx b/src/Fl_Button.cxx
index b8fe5a6a1..f7ec12144 100644
--- a/src/Fl_Button.cxx
+++ b/src/Fl_Button.cxx
@@ -167,22 +167,43 @@ int Fl_Button::handle(int event) {
case FL_KEYBOARD :
if (Fl::focus() == this && Fl::event_key() == ' ' &&
!(Fl::event_state() & (FL_SHIFT | FL_CTRL | FL_ALT | FL_META))) {
- set_changed();
- triggered_by_keyboard:
- Fl_Widget_Tracker wp(this);
+ triggered_by_keyboard: // from FL_SHORTCUT
if (type() == FL_RADIO_BUTTON) {
if (!value_) {
setonly();
- if (when() & FL_WHEN_CHANGED) do_callback(FL_REASON_CHANGED);
+ set_changed();
+ if (when() & FL_WHEN_CHANGED)
+ do_callback(FL_REASON_CHANGED);
+ else if (when() & FL_WHEN_RELEASE)
+ do_callback(FL_REASON_RELEASED);
+ } else {
+ if (when() & FL_WHEN_NOT_CHANGED)
+ do_callback(FL_REASON_SELECTED);
}
} else if (type() == FL_TOGGLE_BUTTON) {
value(!value());
- if (when() & FL_WHEN_CHANGED) do_callback(FL_REASON_CHANGED);
+ set_changed();
+ if (when() & FL_WHEN_CHANGED)
+ do_callback(FL_REASON_CHANGED);
+ else if (when() & FL_WHEN_RELEASE)
+ do_callback(FL_REASON_RELEASED);
} else {
simulate_key_action();
+ value(1);
+ if (when() & FL_WHEN_CHANGED) {
+ set_changed();
+ Fl_Widget_Tracker wp(this);
+ do_callback(FL_REASON_CHANGED);
+ if (wp.deleted()) return 1;
+ value(0);
+ set_changed();
+ do_callback(FL_REASON_RELEASED);
+ } else if (when() & FL_WHEN_RELEASE) {
+ value(0);
+ set_changed();
+ do_callback(FL_REASON_RELEASED);
+ }
}
- if (wp.deleted()) return 1;
- if (when() & FL_WHEN_RELEASE) do_callback(FL_REASON_RELEASED);
return 1;
}
/* FALLTHROUGH */