mirror of
https://github.com/fltk/fltk.git
synced 2026-05-31 22:04:26 +08:00
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:
+28
-7
@@ -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
@@ -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 {} {
|
||||||
|
|||||||
Reference in New Issue
Block a user