swkbd: Fix a bug where clicking Cancel hangs the game (#5294)

* swkbd: Fix a bug where clicking Cancel hangs the game

The text is validated in `Finalize`. If the validation fails, an error is returned and the applet is not actually finalized. This can result in hangs.

This is usually not a problem as the frontend is expected to validate the text passed to `Finalize`. However, when the user clicked on `Cancel`, the text is ignored and the frontend won't do any validation. Therefore, we should skip the validation here as well.

Also fixed a potential data race. All these functions should now be called on the same thread

* Address review comments

Renamed the fields
Remove close button
This commit is contained in:
Pengfei Zhu 2020-05-04 17:31:17 +08:00 committed by GitHub
parent 41bff0e3b7
commit 60669a7dd8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 21 additions and 13 deletions

View file

@ -120,12 +120,15 @@ ValidationError SoftwareKeyboard::ValidateButton(u8 button) const {
}
ValidationError SoftwareKeyboard::Finalize(const std::string& text, u8 button) {
ValidationError error;
if ((error = ValidateInput(text)) != ValidationError::None) {
return error;
}
if ((error = ValidateButton(button)) != ValidationError::None) {
return error;
// Skip check when OK is not pressed
if (button == static_cast<u8>(config.button_config)) {
ValidationError error;
if ((error = ValidateInput(text)) != ValidationError::None) {
return error;
}
if ((error = ValidateButton(button)) != ValidationError::None) {
return error;
}
}
data = {text, button};
data_ready = true;