// This file is part of Desktop App Toolkit, // a set of libraries for developing nice desktop applications. // // For license and copyright information please follow this link: // https://github.com/desktop-app/legal/blob/master/LEGAL // #include "base/power_save_blocker.h" #include "base/platform/base_platform_power_save_blocker.h" #include #include namespace base { namespace { struct BlockersSet { flat_set> list; QPointer window; QString description; }; flat_map Blockers; QMutex Mutex; void Add(not_null blocker) { const auto lock = QMutexLocker(&Mutex); auto &set = Blockers[blocker->type()]; if (set.list.empty()) { set.description = blocker->description(); set.window = blocker->window(); Platform::BlockPowerSave( blocker->type(), set.description, set.window); } set.list.emplace(blocker); } void Remove(not_null blocker) { const auto lock = QMutexLocker(&Mutex); auto &set = Blockers[blocker->type()]; set.list.remove(blocker); if (set.description != blocker->description() || set.window != blocker->window()) { return; } Platform::UnblockPowerSave(blocker->type(), blocker->window()); if (!set.list.empty()) { const auto good = ranges::find_if(set.list, []( not_null blocker) { return blocker->window() != nullptr; }); const auto use = (good != end(set.list)) ? good : begin(set.list); set.description = (*use)->description(); set.window = (*use)->window(); Platform::BlockPowerSave( blocker->type(), set.description, set.window); } } } // namespace PowerSaveBlocker::PowerSaveBlocker( PowerSaveBlockType type, const QString &description, QWindow *window) : _type(type) , _description(description) , _window(window) { Add(this); } QPointer PowerSaveBlocker::window() const { return _window; } PowerSaveBlocker::~PowerSaveBlocker() { Remove(this); } } // namespace base