cellOsk: fix dialog abort w/o user interaction

This commit is contained in:
Megamouse 2021-09-19 21:12:42 +02:00
parent 70c291753c
commit 81a01134bb
6 changed files with 66 additions and 25 deletions

View File

@ -160,9 +160,11 @@ error_code cellOskDialogLoadAsync(u32 container, vm::ptr<CellOskDialogParam> dia
return;
}
const bool accepted = status == CELL_MSGDIALOG_BUTTON_OK;
const bool keep_seperate_window_open = g_fxo->get<osk_info>().use_separate_windows.load() && (g_fxo->get<osk_info>().osk_continuous_mode.load() != CELL_OSKDIALOG_CONTINUOUS_MODE_NONE);
if (accepted)
switch (status)
{
case CELL_OSKDIALOG_CLOSE_CONFIRM:
{
if (auto ccb = g_fxo->get<osk_info>().osk_confirm_callback.exchange({}))
{
@ -208,22 +210,40 @@ error_code cellOskDialogLoadAsync(u32 container, vm::ptr<CellOskDialogParam> dia
{
osk->osk_input_result = CELL_OSKDIALOG_INPUT_FIELD_RESULT_OK;
}
break;
}
else
case CELL_OSKDIALOG_CLOSE_CANCEL:
{
osk->osk_input_result = CELL_OSKDIALOG_INPUT_FIELD_RESULT_CANCELED;
break;
}
default:
{
osk->osk_input_result = CELL_OSKDIALOG_INPUT_FIELD_RESULT_ABORT;
break;
}
}
// Send OSK status
if (g_fxo->get<osk_info>().use_separate_windows.load() && (g_fxo->get<osk_info>().osk_continuous_mode.load() != CELL_OSKDIALOG_CONTINUOUS_MODE_NONE))
{
if (accepted)
switch (status)
{
case CELL_OSKDIALOG_CLOSE_CONFIRM:
{
sysutil_send_system_cmd(CELL_SYSUTIL_OSKDIALOG_INPUT_ENTERED, 0);
break;
}
else
case CELL_OSKDIALOG_CLOSE_CANCEL:
{
sysutil_send_system_cmd(CELL_SYSUTIL_OSKDIALOG_INPUT_CANCELED, 0);
break;
}
default:
{
sysutil_send_system_cmd(CELL_SYSUTIL_OSKDIALOG_FINISHED, 0);
break;
}
}
}
else
@ -403,7 +423,7 @@ error_code cellOskDialogAbort()
}
osk->osk_input_result = CELL_OSKDIALOG_INPUT_FIELD_RESULT_ABORT;
osk->Close(false);
osk->Close(-1);
return CELL_OK;
}
@ -546,7 +566,7 @@ error_code cellOskDialogExtSendFinishMessage(u32 /*CellOskDialogFinishReason*/ f
return CELL_MSGDIALOG_ERROR_DIALOG_NOT_OPENED;
}
osk->Close(finishReason == CELL_OSKDIALOG_CLOSE_CONFIRM);
osk->Close(finishReason);
return CELL_OK;
}

View File

@ -248,7 +248,11 @@ class OskDialogBase
{
public:
virtual void Create(const std::string& title, const std::u16string& message, char16_t* init_text, u32 charlimit, u32 prohibit_flags, u32 panel_flag, u32 first_view_panel) = 0;
virtual void Close(bool accepted) = 0;
// Closes the dialog.
// Set status to CELL_OSKDIALOG_CLOSE_CONFIRM or CELL_OSKDIALOG_CLOSE_CANCEL for user input.
// Set status to -1 if closed by the game or system.
virtual void Close(s32 status) = 0;
virtual ~OskDialogBase();
std::function<void(s32 status)> on_osk_close;

View File

@ -19,19 +19,19 @@ namespace rsx
auto_repeat_buttons.insert(pad_button::square);
}
void osk_dialog::Close(bool ok)
void osk_dialog::Close(s32 status)
{
fade_animation.current = color4f(1.f);
fade_animation.end = color4f(0.f);
fade_animation.duration = 0.5f;
fade_animation.on_finish = [this, ok]
fade_animation.on_finish = [this, status]
{
if (on_osk_close)
{
Emu.CallAfter([this, ok]()
Emu.CallAfter([this, status]()
{
on_osk_close(ok ? CELL_MSGDIALOG_BUTTON_OK : CELL_MSGDIALOG_BUTTON_ESCAPE);
on_osk_close(status);
});
}
@ -522,7 +522,7 @@ namespace rsx
}
case pad_button::start:
{
Close(true);
Close(CELL_OSKDIALOG_CLOSE_CONFIRM);
break;
}
case pad_button::triangle:
@ -543,7 +543,7 @@ namespace rsx
}
case pad_button::circle:
{
Close(false);
Close(CELL_OSKDIALOG_CLOSE_CANCEL);
break;
}
case pad_button::L2:

View File

@ -83,7 +83,7 @@ namespace rsx
~osk_dialog() override = default;
void Create(const std::string& title, const std::u16string& message, char16_t* init_text, u32 charlimit, u32 prohibit_flags, u32 panel_flag, u32 first_view_panel) override;
void Close(bool ok) override;
void Close(s32 status) override;
void initialize_layout(const std::u32string& title, const std::u32string& initial_text);
void add_panel(const osk_panel& panel);

View File

@ -159,14 +159,20 @@ void osk_dialog_frame::Create(const std::string& title, const std::u16string& me
// Events
connect(button_box, &QDialogButtonBox::accepted, m_dialog, &QDialog::accept);
connect(m_dialog, &QDialog::accepted, [this]()
connect(m_dialog, &QDialog::finished, [this](int result)
{
on_osk_close(CELL_MSGDIALOG_BUTTON_OK);
});
connect(m_dialog, &QDialog::rejected, [this]()
{
on_osk_close(CELL_MSGDIALOG_BUTTON_ESCAPE);
switch (result)
{
case QDialog::Accepted:
on_osk_close(CELL_OSKDIALOG_CLOSE_CONFIRM);
break;
case QDialog::Rejected:
on_osk_close(CELL_OSKDIALOG_CLOSE_CANCEL);
break;
default:
on_osk_close(-1);
break;
}
});
// Fix size
@ -179,10 +185,21 @@ void osk_dialog_frame::SetOskText(const QString& text)
std::memcpy(osk_text, utils::bless<char16_t>(text.constData()), (text.size() + 1u) * sizeof(char16_t));
}
void osk_dialog_frame::Close(bool accepted)
void osk_dialog_frame::Close(s32 status)
{
if (m_dialog)
{
m_dialog->done(accepted ? QDialog::Accepted : QDialog::Rejected);
switch (status)
{
case CELL_OSKDIALOG_CLOSE_CONFIRM:
m_dialog->done(QDialog::Accepted);
break;
case CELL_OSKDIALOG_CLOSE_CANCEL:
m_dialog->done(QDialog::Rejected);
break;
default:
m_dialog->done(-1);
break;
}
}
}

View File

@ -17,7 +17,7 @@ public:
osk_dialog_frame() = default;
~osk_dialog_frame();
void Create(const std::string& title, const std::u16string& message, char16_t* init_text, u32 charlimit, u32 prohibit_flags, u32 panel_flag, u32 first_view_panel) override;
void Close(bool accepted) override;
void Close(s32 status) override;
private:
void SetOskText(const QString& text);