diff --git a/rpcs3/Emu/Cell/Modules/cellOskDialog.cpp b/rpcs3/Emu/Cell/Modules/cellOskDialog.cpp index da7154acdd..fb6c9988c7 100644 --- a/rpcs3/Emu/Cell/Modules/cellOskDialog.cpp +++ b/rpcs3/Emu/Cell/Modules/cellOskDialog.cpp @@ -160,9 +160,11 @@ error_code cellOskDialogLoadAsync(u32 container, vm::ptr dia return; } - const bool accepted = status == CELL_MSGDIALOG_BUTTON_OK; + const bool keep_seperate_window_open = g_fxo->get().use_separate_windows.load() && (g_fxo->get().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_confirm_callback.exchange({})) { @@ -208,22 +210,40 @@ error_code cellOskDialogLoadAsync(u32 container, vm::ptr 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().use_separate_windows.load() && (g_fxo->get().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; } diff --git a/rpcs3/Emu/Cell/Modules/cellOskDialog.h b/rpcs3/Emu/Cell/Modules/cellOskDialog.h index 7c1acad8dd..10eecd7ef8 100644 --- a/rpcs3/Emu/Cell/Modules/cellOskDialog.h +++ b/rpcs3/Emu/Cell/Modules/cellOskDialog.h @@ -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 on_osk_close; diff --git a/rpcs3/Emu/RSX/Overlays/overlay_osk.cpp b/rpcs3/Emu/RSX/Overlays/overlay_osk.cpp index 424aaf845f..bbaaab5999 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_osk.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_osk.cpp @@ -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: diff --git a/rpcs3/Emu/RSX/Overlays/overlay_osk.h b/rpcs3/Emu/RSX/Overlays/overlay_osk.h index 7b0e70e707..0fb2e442b7 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_osk.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_osk.h @@ -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); diff --git a/rpcs3/rpcs3qt/osk_dialog_frame.cpp b/rpcs3/rpcs3qt/osk_dialog_frame.cpp index 18615f1e47..df145bddbc 100644 --- a/rpcs3/rpcs3qt/osk_dialog_frame.cpp +++ b/rpcs3/rpcs3qt/osk_dialog_frame.cpp @@ -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(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; + } } } diff --git a/rpcs3/rpcs3qt/osk_dialog_frame.h b/rpcs3/rpcs3qt/osk_dialog_frame.h index 0bde9bdde7..3beb4c67d1 100644 --- a/rpcs3/rpcs3qt/osk_dialog_frame.h +++ b/rpcs3/rpcs3qt/osk_dialog_frame.h @@ -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);