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.
This commit is contained in:
Matthias Melcher
2024-01-17 19:47:41 +01:00
parent a038e55783
commit 554bccbecd
2 changed files with 33 additions and 10 deletions
+28 -7
View File
@@ -167,22 +167,43 @@ int Fl_Button::handle(int event) {
case FL_KEYBOARD : case FL_KEYBOARD :
if (Fl::focus() == this && Fl::event_key() == ' ' && if (Fl::focus() == this && Fl::event_key() == ' ' &&
!(Fl::event_state() & (FL_SHIFT | FL_CTRL | FL_ALT | FL_META))) { !(Fl::event_state() & (FL_SHIFT | FL_CTRL | FL_ALT | FL_META))) {
set_changed(); triggered_by_keyboard: // from FL_SHORTCUT
triggered_by_keyboard:
Fl_Widget_Tracker wp(this);
if (type() == FL_RADIO_BUTTON) { if (type() == FL_RADIO_BUTTON) {
if (!value_) { if (!value_) {
setonly(); 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) { } else if (type() == FL_TOGGLE_BUTTON) {
value(!value()); 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 { } else {
simulate_key_action(); 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; if (wp.deleted()) return 1;
if (when() & FL_WHEN_RELEASE) do_callback(FL_REASON_RELEASED); value(0);
set_changed();
do_callback(FL_REASON_RELEASED);
} else if (when() & FL_WHEN_RELEASE) {
value(0);
set_changed();
do_callback(FL_REASON_RELEASED);
}
}
return 1; return 1;
} }
/* FALLTHROUGH */ /* FALLTHROUGH */
+5 -3
View File
@@ -6,15 +6,17 @@ Function {button_cb(Fl_Button *b, void *)} {
comment {Buttons test callback} open private return_type void comment {Buttons test callback} open private return_type void
} { } {
code {char msg[256]; 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->value(msg);
cb_info->redraw(); cb_info->redraw();
printf("%s\\n",msg);} {} printf("%s\\n",msg);} {selected
}
} }
Function {} {open Function {} {open
} { } {
Fl_Window {} {open selected Fl_Window {} {open
xywh {470 366 369 214} type Double visible xywh {470 366 369 214} type Double visible
} { } {
Fl_Button {} { Fl_Button {} {