temperature: allow hwmon-path-abs as array

This commit is contained in:
giskard 2024-05-08 21:00:52 +08:00
parent 2ead1bbf84
commit e298bf922f
1 changed files with 29 additions and 20 deletions

View File

@ -1,6 +1,9 @@
#include "modules/temperature.hpp" #include "modules/temperature.hpp"
#include <bits/ranges_algo.h>
#include <filesystem> #include <filesystem>
#include <string>
#if defined(__FreeBSD__) #if defined(__FreeBSD__)
#include <sys/sysctl.h> #include <sys/sysctl.h>
@ -11,26 +14,32 @@ waybar::modules::Temperature::Temperature(const std::string& id, const Json::Val
#if defined(__FreeBSD__) #if defined(__FreeBSD__)
// FreeBSD uses sysctlbyname instead of read from a file // FreeBSD uses sysctlbyname instead of read from a file
#else #else
auto& hwmon_path = config_["hwmon-path"]; auto traverseAsArray = [](const Json::Value& value, auto&& check_set_path) {
if (hwmon_path.isString()) { if (value.isString())
file_path_ = hwmon_path.asString(); check_set_path(value.asString());
} else if (hwmon_path.isArray()) { else if (value.isArray())
for (const auto& item : value)
if (check_set_path(item.asString())) break;
};
// if hwmon_path is an array, loop to find first valid item // if hwmon_path is an array, loop to find first valid item
for (auto& item : hwmon_path) { traverseAsArray(config_["hwmon-path"], [this](const std::string& path) {
auto path = item.asString(); if (!std::filesystem::exists(path)) return false;
if (std::filesystem::exists(path)) {
file_path_ = path; file_path_ = path;
break; return true;
} });
}
} else if (config_["hwmon-path-abs"].isString() && config_["input-filename"].isString()) { if (file_path_.empty() && config_["input-filename"].isString()) {
for (const auto& hwmon : // fallback to hwmon_paths-abs
std::filesystem::directory_iterator(config_["hwmon-path-abs"].asString())) { traverseAsArray(config_["hwmon-path-abs"], [this](const std::string& path) {
if (hwmon.path().filename().string().starts_with("hwmon")) { if (!std::filesystem::is_directory(path)) return false;
return std::ranges::any_of(
std::filesystem::directory_iterator(path), [this](const auto& hwmon) {
if (!hwmon.path().filename().string().starts_with("hwmon")) return false;
file_path_ = hwmon.path().string() + "/" + config_["input-filename"].asString(); file_path_ = hwmon.path().string() + "/" + config_["input-filename"].asString();
break; return true;
} });
} });
} }
if (file_path_.empty()) { if (file_path_.empty()) {