diff options
| -rw-r--r-- | src/Fl_Button.cxx | 35 | ||||
| -rw-r--r-- | test/radio.fl | 8 |
2 files changed, 33 insertions, 10 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 */ diff --git a/test/radio.fl b/test/radio.fl index 13ef9bfd0..f21c02b0d 100644 --- a/test/radio.fl +++ b/test/radio.fl @@ -6,15 +6,17 @@ Function {button_cb(Fl_Button *b, void *)} { comment {Buttons test callback} open private return_type void } { code {char msg[256]; -sprintf(msg, "Label: '%s'\\nValue: %d", b->label(),b->value()); +sprintf(msg, "Label: '%s'\\nValue: %d\\nChanged: %d", + b->label(), b->value(), b->changed()); cb_info->value(msg); cb_info->redraw(); -printf("%s\\n",msg);} {} +printf("%s\\n",msg);} {selected + } } Function {} {open } { - Fl_Window {} {open selected + Fl_Window {} {open xywh {470 366 369 214} type Double visible } { Fl_Button {} { |
