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; 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({})) 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; 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; 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 // 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 (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); 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); sysutil_send_system_cmd(CELL_SYSUTIL_OSKDIALOG_INPUT_CANCELED, 0);
break;
}
default:
{
sysutil_send_system_cmd(CELL_SYSUTIL_OSKDIALOG_FINISHED, 0);
break;
}
} }
} }
else else
@ -403,7 +423,7 @@ error_code cellOskDialogAbort()
} }
osk->osk_input_result = CELL_OSKDIALOG_INPUT_FIELD_RESULT_ABORT; osk->osk_input_result = CELL_OSKDIALOG_INPUT_FIELD_RESULT_ABORT;
osk->Close(false); osk->Close(-1);
return CELL_OK; return CELL_OK;
} }
@ -546,7 +566,7 @@ error_code cellOskDialogExtSendFinishMessage(u32 /*CellOskDialogFinishReason*/ f
return CELL_MSGDIALOG_ERROR_DIALOG_NOT_OPENED; return CELL_MSGDIALOG_ERROR_DIALOG_NOT_OPENED;
} }
osk->Close(finishReason == CELL_OSKDIALOG_CLOSE_CONFIRM); osk->Close(finishReason);
return CELL_OK; return CELL_OK;
} }

View File

@ -248,7 +248,11 @@ class OskDialogBase
{ {
public: 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 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(); virtual ~OskDialogBase();
std::function<void(s32 status)> on_osk_close; std::function<void(s32 status)> on_osk_close;

View File

@ -19,19 +19,19 @@ namespace rsx
auto_repeat_buttons.insert(pad_button::square); 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.current = color4f(1.f);
fade_animation.end = color4f(0.f); fade_animation.end = color4f(0.f);
fade_animation.duration = 0.5f; fade_animation.duration = 0.5f;
fade_animation.on_finish = [this, ok] fade_animation.on_finish = [this, status]
{ {
if (on_osk_close) 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: case pad_button::start:
{ {
Close(true); Close(CELL_OSKDIALOG_CLOSE_CONFIRM);
break; break;
} }
case pad_button::triangle: case pad_button::triangle:
@ -543,7 +543,7 @@ namespace rsx
} }
case pad_button::circle: case pad_button::circle:
{ {
Close(false); Close(CELL_OSKDIALOG_CLOSE_CANCEL);
break; break;
} }
case pad_button::L2: case pad_button::L2:

View File

@ -83,7 +83,7 @@ namespace rsx
~osk_dialog() override = default; ~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 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 initialize_layout(const std::u32string& title, const std::u32string& initial_text);
void add_panel(const osk_panel& panel); 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 // Events
connect(button_box, &QDialogButtonBox::accepted, m_dialog, &QDialog::accept); 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); switch (result)
}); {
case QDialog::Accepted:
connect(m_dialog, &QDialog::rejected, [this]() on_osk_close(CELL_OSKDIALOG_CLOSE_CONFIRM);
{ break;
on_osk_close(CELL_MSGDIALOG_BUTTON_ESCAPE); case QDialog::Rejected:
on_osk_close(CELL_OSKDIALOG_CLOSE_CANCEL);
break;
default:
on_osk_close(-1);
break;
}
}); });
// Fix size // 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)); 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) 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() = default;
~osk_dialog_frame(); ~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 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: private:
void SetOskText(const QString& text); void SetOskText(const QString& text);