overlays: show latching message for fatal errors

This commit is contained in:
Megamouse 2026-03-29 18:32:44 +02:00
parent bd2b2c2747
commit ab03d76ed6
12 changed files with 35 additions and 29 deletions

View File

@ -431,25 +431,25 @@ namespace rsx
m_is_compiled = false;
}
void overlay_element::set_text(const std::string& text)
void overlay_element::set_text(std::string_view text)
{
std::u32string new_text = utf8_to_u32string(text);
const bool is_dirty = this->text != new_text;
this->text = std::move(new_text);
if (is_dirty)
{
this->text = std::move(new_text);
m_is_compiled = false;
}
}
void overlay_element::set_unicode_text(const std::u32string& text)
void overlay_element::set_unicode_text(std::u32string_view text)
{
const bool is_dirty = this->text != text;
this->text = text;
if (is_dirty)
{
this->text = text;
m_is_compiled = false;
}
}

View File

@ -242,8 +242,8 @@ namespace rsx
// NOTE: Functions as a simple position offset. Top left corner is the anchor.
virtual void set_margin(u16 left, u16 top);
virtual void set_margin(u16 margin);
virtual void set_text(const std::string& text);
virtual void set_unicode_text(const std::u32string& text);
virtual void set_text(std::string_view text);
virtual void set_unicode_text(std::u32string_view text);
void set_text(localized_string_id id);
void set_text(const localized_string& container);
virtual void set_font(const char* font_name, u16 font_size);

View File

@ -95,12 +95,12 @@ namespace rsx
}
}
void edit_text::set_text(const std::string& text)
void edit_text::set_text(std::string_view text)
{
set_unicode_text(utf8_to_u32string(text));
}
void edit_text::set_unicode_text(const std::u32string& text)
void edit_text::set_unicode_text(std::u32string_view text)
{
value = text;

View File

@ -26,8 +26,8 @@ namespace rsx
using label::label;
void set_text(const std::string& text) override;
void set_unicode_text(const std::u32string& text) override;
void set_text(std::string_view text) override;
void set_unicode_text(std::u32string_view text) override;
void set_placeholder(const std::u32string& placeholder_text);

View File

@ -90,7 +90,7 @@ namespace rsx
return m_loc_id == id;
}
bool message_item::text_matches(const std::u32string& text) const
bool message_item::text_matches(std::u32string_view text) const
{
return m_text.text == text;
}

View File

@ -31,7 +31,7 @@ namespace rsx
compiled_resource& get_compiled() override;
bool id_matches(localized_string_id id) const;
bool text_matches(const std::u32string& text) const;
bool text_matches(std::u32string_view text) const;
void set_label_text(const std::string& text);

View File

@ -58,7 +58,7 @@ namespace rsx
set_pos(x + dx, y + dy);
}
void progress_bar::set_text(const std::string& str)
void progress_bar::set_text(std::string_view str)
{
text_view.set_text(str);
text_view.align_text(text_align::center);

View File

@ -24,7 +24,7 @@ namespace rsx
void set_pos(s16 _x, s16 _y) override;
void set_size(u16 _w, u16 _h) override;
void translate(s16 dx, s16 dy) override;
void set_text(const std::string& str) override;
void set_text(std::string_view str) override;
compiled_resource& get_compiled() override;
};

View File

@ -60,7 +60,7 @@ static auto s_ascii_lowering_map = []()
}();
template<typename F>
void process_multibyte(const std::string& s, F&& func)
void process_multibyte(std::string_view s, F&& func)
{
const usz end = s.length();
for (usz index = 0; index < end; ++index)
@ -110,7 +110,7 @@ void process_multibyte(const std::string& s, F&& func)
}
}
std::string utf8_to_ascii8(const std::string& utf8_string)
std::string utf8_to_ascii8(std::string_view utf8_string)
{
std::string out;
out.reserve(utf8_string.length());
@ -135,7 +135,7 @@ std::string utf8_to_ascii8(const std::string& utf8_string)
return out;
}
std::string utf16_to_ascii8(const std::u16string& utf16_string)
std::string utf16_to_ascii8(std::u16string_view utf16_string)
{
// Strip extended codes, map to '#' instead (placeholder)
std::string out;
@ -152,7 +152,7 @@ std::string utf16_to_ascii8(const std::u16string& utf16_string)
return out;
}
std::u16string ascii8_to_utf16(const std::string& ascii_string)
std::u16string ascii8_to_utf16(std::string_view ascii_string)
{
std::u16string out;
out.reserve(ascii_string.length());
@ -168,7 +168,7 @@ std::u16string ascii8_to_utf16(const std::string& ascii_string)
return out;
}
std::u32string utf8_to_u32string(const std::string& utf8_string)
std::u32string utf8_to_u32string(std::string_view utf8_string)
{
std::u32string result;
result.reserve(utf8_string.size());
@ -181,7 +181,7 @@ std::u32string utf8_to_u32string(const std::string& utf8_string)
return result;
}
std::u16string u32string_to_utf16(const std::u32string& utf32_string)
std::u16string u32string_to_utf16(std::u32string_view utf32_string)
{
std::u16string result;
result.reserve(utf32_string.size());
@ -194,7 +194,7 @@ std::u16string u32string_to_utf16(const std::u32string& utf32_string)
return result;
}
std::u32string utf16_to_u32string(const std::u16string& utf16_string)
std::u32string utf16_to_u32string(std::u16string_view utf16_string)
{
std::u32string result;
result.reserve(utf16_string.size());

View File

@ -218,9 +218,9 @@ void operator < (const vector3_base<T>& lhs, T rhs)
using vector3i = vector3_base<int>;
using vector3f = vector3_base<float>;
std::string utf8_to_ascii8(const std::string& utf8_string);
std::string utf16_to_ascii8(const std::u16string& utf16_string);
std::u16string ascii8_to_utf16(const std::string& ascii_string);
std::u32string utf8_to_u32string(const std::string& utf8_string);
std::u16string u32string_to_utf16(const std::u32string& utf32_string);
std::u32string utf16_to_u32string(const std::u16string& utf16_string);
std::string utf8_to_ascii8(std::string_view utf8_string);
std::string utf16_to_ascii8(std::u16string_view utf16_string);
std::u16string ascii8_to_utf16(std::string_view ascii_string);
std::u32string utf8_to_u32string(std::string_view utf8_string);
std::u16string u32string_to_utf16(std::u32string_view utf32_string);
std::u32string utf16_to_u32string(std::u16string_view utf16_string);

View File

@ -2837,7 +2837,7 @@ bool Emulator::Pause(bool freeze_emulation, bool show_resume_message)
auto msg_ref = std::make_shared<atomic_t<u32>>(1);
// No timeout
rsx::overlays::queue_message(status == system_state::paused ? localized_string_id::EMULATION_PAUSED_RESUME_WITH_START : localized_string_id::EMULATION_FROZEN, -1, msg_ref);
rsx::overlays::queue_message(status == system_state::paused ? localized_string_id::EMULATION_PAUSED_RESUME_WITH_START : localized_string_id::EMULATION_FROZEN, umax, msg_ref);
m_pause_msgs_refs.emplace_back(msg_ref);
auto refresh_l = [this, msg_ref, status]()

View File

@ -69,6 +69,7 @@ DYNAMIC_IMPORT("ntdll.dll", NtSetTimerResolution, NTSTATUS(ULONG DesiredResoluti
#include "rpcs3_version.h"
#include "Emu/System.h"
#include "Emu/system_utils.hpp"
#include "Emu/RSX/Overlays/overlay_message.h"
#include <thread>
#include <charconv>
@ -312,7 +313,8 @@ public:
{
if (msg == logs::level::fatal || (msg == logs::level::always && m_log_always))
{
std::string _msg = "RPCS3: ";
static const std::string rpcs3_prefix = "RPCS3: ";
std::string _msg = rpcs3_prefix;
if (!prefix.empty())
{
@ -351,7 +353,11 @@ public:
#endif
if (msg == logs::level::fatal)
{
std::string overlay_msg = "Fatal error: " + _msg.substr(rpcs3_prefix.size());
fmt::trim_back(overlay_msg, " \t\n");
// Pause emulation if fatal error encountered
rsx::overlays::queue_message(overlay_msg, umax);
Emu.Pause(true);
}
}