mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-03-14 01:27:00 +00:00
cellOsk: fix dialog abort w/o user interaction
This commit is contained in:
parent
70c291753c
commit
81a01134bb
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user