Bugfix: wxWidgets on Windows needs Skip() on kill focus to prevent nasty focus bugs. #1873

This commit is contained in:
Alessandro Ranellucci 2014-04-19 18:05:01 +02:00
parent a248c98192
commit 10a5a061d4

View File

@ -182,11 +182,21 @@ sub _build_field {
$value ||= 0 if $opt->{type} =~ /^(i|f|percent)$/; # prevent crash trying to pass empty strings to Config $value ||= 0 if $opt->{type} =~ /^(i|f|percent)$/; # prevent crash trying to pass empty strings to Config
$self->_on_change($opt_key, $value); $self->_on_change($opt_key, $value);
}; };
my $on_kill_focus = sub {
my ($s, $event) = @_;
# Without this, there will be nasty focus bugs on Windows.
# Also, docs for wxEvent::Skip() say "In general, it is recommended to skip all
# non-command events to allow the default handling to take place."
$event->Skip(1);
$self->on_kill_focus($opt_key);
};
if ($opt->{type} eq 'i') { if ($opt->{type} eq 'i') {
$field = Wx::SpinCtrl->new($self->parent, -1, $opt->{default}, wxDefaultPosition, $size, $style, $opt->{min} || 0, $opt->{max} || 2147483647, $opt->{default}); $field = Wx::SpinCtrl->new($self->parent, -1, $opt->{default}, wxDefaultPosition, $size, $style, $opt->{min} || 0, $opt->{max} || 2147483647, $opt->{default});
$self->_setters->{$opt_key} = sub { $field->SetValue($_[0]) }; $self->_setters->{$opt_key} = sub { $field->SetValue($_[0]) };
EVT_SPINCTRL ($self->parent, $field, $on_change); EVT_SPINCTRL ($self->parent, $field, $on_change);
EVT_KILL_FOCUS($field, sub { $self->on_kill_focus($opt_key) }); EVT_KILL_FOCUS($field, $on_kill_focus);
} elsif ($opt->{values}) { } elsif ($opt->{values}) {
$field = Wx::ComboBox->new($self->parent, -1, $opt->{default}, wxDefaultPosition, $size, $opt->{labels} || $opt->{values}); $field = Wx::ComboBox->new($self->parent, -1, $opt->{default}, wxDefaultPosition, $size, $opt->{labels} || $opt->{values});
$self->_setters->{$opt_key} = sub { $self->_setters->{$opt_key} = sub {
@ -197,12 +207,12 @@ sub _build_field {
$self->_on_change($opt_key, $on_change); $self->_on_change($opt_key, $on_change);
}); });
EVT_TEXT($self->parent, $field, $on_change); EVT_TEXT($self->parent, $field, $on_change);
EVT_KILL_FOCUS($field, sub { $self->on_kill_focus($opt_key) }); EVT_KILL_FOCUS($field, $on_kill_focus);
} else { } else {
$field = Wx::TextCtrl->new($self->parent, -1, $opt->{default}, wxDefaultPosition, $size, $style); $field = Wx::TextCtrl->new($self->parent, -1, $opt->{default}, wxDefaultPosition, $size, $style);
$self->_setters->{$opt_key} = sub { $field->ChangeValue($_[0]) }; $self->_setters->{$opt_key} = sub { $field->ChangeValue($_[0]) };
EVT_TEXT($self->parent, $field, $on_change); EVT_TEXT($self->parent, $field, $on_change);
EVT_KILL_FOCUS($field, sub { $self->on_kill_focus($opt_key) }); EVT_KILL_FOCUS($field, $on_kill_focus);
} }
$field->Disable if $opt->{readonly}; $field->Disable if $opt->{readonly};
$tooltip .= " (default: " . $opt->{default} . ")" if ($opt->{default}); $tooltip .= " (default: " . $opt->{default} . ")" if ($opt->{default});
@ -230,7 +240,7 @@ sub _build_field {
} }
foreach my $field ($x_field, $y_field) { foreach my $field ($x_field, $y_field) {
EVT_TEXT($self->parent, $field, sub { $self->_on_change($opt_key, [ $x_field->GetValue, $y_field->GetValue ]) }); EVT_TEXT($self->parent, $field, sub { $self->_on_change($opt_key, [ $x_field->GetValue, $y_field->GetValue ]) });
EVT_KILL_FOCUS($field, sub { $self->on_kill_focus($opt_key) }); EVT_KILL_FOCUS($field, $on_kill_focus);
} }
$self->_setters->{$opt_key} = sub { $self->_setters->{$opt_key} = sub {
$x_field->SetValue($_[0][0]); $x_field->SetValue($_[0][0]);