mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-03-29 22:20:48 +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;
|
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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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:
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user