Clean up the OSD click callback code

This commit is contained in:
Henrik Rydgård
2026-02-09 13:08:44 +01:00
parent 4ccd41110b
commit a92ff89d5f
9 changed files with 43 additions and 95 deletions
+6 -23
View File
@@ -12,29 +12,12 @@ OnScreenDisplay g_OSD;
// Effectively forever.
constexpr double forever_s = 10000000000.0;
OnScreenDisplay::~OnScreenDisplay() {
std::lock_guard<std::mutex> guard(mutex_);
double now = time_now_d();
for (auto &iter : entries_) {
if (iter.clickCallback) {
// Wasn't clicked, but let it free any data.
iter.clickCallback(false, iter.clickUserData);
}
}
}
void OnScreenDisplay::Update() {
std::lock_guard<std::mutex> guard(mutex_);
double now = time_now_d();
for (auto iter = entries_.begin(); iter != entries_.end(); ) {
if (now >= iter->endTime) {
if (iter->clickCallback) {
// Wasn't clicked, but let it free any data.
iter->clickCallback(false, iter->clickUserData);
iter->clickCallback = nullptr;
}
iter = entries_.erase(iter);
} else {
iter++;
@@ -61,9 +44,10 @@ float OnScreenDisplay::IngameAlpha() const {
void OnScreenDisplay::ClickEntry(size_t index, double now) {
std::lock_guard<std::mutex> guard(mutex_);
if (index < entries_.size() && entries_[index].type != OSDType::ACHIEVEMENT_CHALLENGE_INDICATOR) {
entries_[index].endTime = std::min(now + FadeoutTime(), entries_[index].endTime);
if (entries_[index].clickCallback) {
entries_[index].clickCallback(true, entries_[index].clickUserData);
entries_[index].clickCallback();
} else {
entries_[index].endTime = std::min(now + FadeoutTime(), entries_[index].endTime);
}
}
}
@@ -333,18 +317,17 @@ void OnScreenDisplay::ClearAchievementStuff() {
}
}
void OnScreenDisplay::SetClickCallback(const char *id, void (*callback)(bool, void *), void *userdata) {
void OnScreenDisplay::SetClickCallback(std::string_view id, std::function<void()> callback) {
_dbg_assert_(callback != nullptr);
for (auto &ent : entries_) {
// protect against dupes.
if (ent.id == id && !ent.clickCallback) {
if (ent.id == id) {
ent.clickCallback = callback;
ent.clickUserData = userdata;
}
}
}
void OnScreenDisplay::SetFlags(const char *id, OSDMessageFlags flags) {
void OnScreenDisplay::SetFlags(std::string_view id, OSDMessageFlags flags) {
for (auto &ent : entries_) {
// protect against dupes.
if (ent.id == id) {