[Kernel] Fixed issue with WINE crash while opening played titles or achievements tab

This commit is contained in:
Gliniak
2025-10-06 21:40:38 +02:00
committed by Radosław Gliński
parent 703531d541
commit 2e9c459846
5 changed files with 20 additions and 17 deletions

View File

@@ -89,13 +89,15 @@ struct NtSystemClock {
return sys_time{cdp.time_since_epoch()}; return sys_time{cdp.time_since_epoch()};
} }
// TODO(Gliniak): Disable until WINE will implement tzdb.
/*
template <Domain domain_fresh_ = domain_> template <Domain domain_fresh_ = domain_>
static constexpr std::enable_if_t< static constexpr std::enable_if_t<
domain_fresh_ == Domain::Host, domain_fresh_ == Domain::Host,
std::chrono::local_time<std::chrono::system_clock::duration>> std::chrono::local_time<std::chrono::system_clock::duration>>
to_local(const time_point& tp) { to_local(const time_point& tp) {
return std::chrono::current_zone()->to_local(to_sys(tp)); return std::chrono::current_zone()->to_local(to_sys(tp));
} }*/
template <Domain domain_fresh_ = domain_> template <Domain domain_fresh_ = domain_>
static constexpr std::enable_if_t<domain_fresh_ == Domain::Host, time_point> static constexpr std::enable_if_t<domain_fresh_ == Domain::Host, time_point>

View File

@@ -103,21 +103,21 @@ xe::ui::ImmediateTexture* GameAchievementsUI::GetIcon(
std::string GameAchievementsUI::GetUnlockedTime( std::string GameAchievementsUI::GetUnlockedTime(
const Achievement& achievement_entry) const { const Achievement& achievement_entry) const {
if (achievement_entry.IsUnlockedOnline()) { if (achievement_entry.IsUnlockedOnline()) {
const auto unlock_time = chrono::WinSystemClock::to_local( const auto unlock_time =
achievement_entry.unlock_time.to_time_point()); std::chrono::system_clock::to_time_t(chrono::WinSystemClock::to_sys(
achievement_entry.unlock_time.to_time_point()));
return fmt::format( return fmt::format("Unlocked: {:%Y-%m-%d %H:%M}",
"Unlocked: {:%Y-%m-%d %H:%M}", fmt::localtime(unlock_time));
std::chrono::system_clock::time_point(unlock_time.time_since_epoch()));
} }
if (achievement_entry.unlock_time.is_valid()) { if (achievement_entry.unlock_time.is_valid()) {
const auto unlock_time = chrono::WinSystemClock::to_local( const auto unlock_time =
achievement_entry.unlock_time.to_time_point()); std::chrono::system_clock::to_time_t(chrono::WinSystemClock::to_sys(
achievement_entry.unlock_time.to_time_point()));
return fmt::format( return fmt::format("Unlocked: Offline ({:%Y-%m-%d %H:%M})",
"Unlocked: Offline ({:%Y-%m-%d %H:%M})", fmt::localtime(unlock_time));
std::chrono::system_clock::time_point(unlock_time.time_since_epoch()));
} }
return fmt::format("Unlocked: Offline"); return fmt::format("Unlocked: Offline");
} }

View File

@@ -86,8 +86,9 @@ void TitleListUI::DrawTitleEntry(ImGuiIO& io, TitleInfo& entry) {
if (entry.WasTitlePlayed()) { if (entry.WasTitlePlayed()) {
ImGui::TextUnformatted( ImGui::TextUnformatted(
fmt::format("Last played: {:%Y-%m-%d %H:%M}", fmt::format("Last played: {:%Y-%m-%d %H:%M}",
std::chrono::system_clock::time_point( fmt::localtime(std::chrono::system_clock::to_time_t(
entry.last_played.time_since_epoch())) std::chrono::system_clock::time_point(
entry.last_played.time_since_epoch()))))
.c_str()); .c_str());
} else { } else {
ImGui::TextUnformatted("Last played: Unknown"); ImGui::TextUnformatted("Last played: Unknown");

View File

@@ -235,8 +235,8 @@ std::optional<TitleInfo> UserTracker::GetUserTitleInfo(
info.icon = game_gpd->second.GetImage(kXdbfIdTitle); info.icon = game_gpd->second.GetImage(kXdbfIdTitle);
if (title_data->last_played.is_valid()) { if (title_data->last_played.is_valid()) {
info.last_played = chrono::WinSystemClock::to_local( info.last_played =
title_data->last_played.to_time_point()); chrono::WinSystemClock::to_sys(title_data->last_played.to_time_point());
} }
return info; return info;
@@ -270,7 +270,7 @@ std::vector<TitleInfo> UserTracker::GetPlayedTitles(uint64_t xuid) const {
info.title_name = user->dashboard_gpd_.GetTitleName(title_data->title_id); info.title_name = user->dashboard_gpd_.GetTitleName(title_data->title_id);
if (title_data->last_played.is_valid()) { if (title_data->last_played.is_valid()) {
info.last_played = chrono::WinSystemClock::to_local( info.last_played = chrono::WinSystemClock::to_sys(
title_data->last_played.to_time_point()); title_data->last_played.to_time_point());
} }

View File

@@ -34,7 +34,7 @@ struct TitleInfo {
X_XDBF_AVATARAWARDS_COUNTER all_avatar_awards; X_XDBF_AVATARAWARDS_COUNTER all_avatar_awards;
X_XDBF_AVATARAWARDS_COUNTER male_avatar_awards; X_XDBF_AVATARAWARDS_COUNTER male_avatar_awards;
X_XDBF_AVATARAWARDS_COUNTER female_avatar_awards; X_XDBF_AVATARAWARDS_COUNTER female_avatar_awards;
std::chrono::local_time<std::chrono::system_clock::duration> last_played; std::chrono::sys_time<std::chrono::system_clock::duration> last_played;
std::span<const uint8_t> icon; std::span<const uint8_t> icon;