mirror of
https://github.com/rad4day/Waybar.git
synced 2023-12-21 10:22:59 +01:00
feat: battery states && format-full/charging
This commit is contained in:
@ -34,7 +34,6 @@ waybar::modules::Battery::Battery(const Json::Value& config)
|
||||
for (auto const& bat : batteries_) {
|
||||
inotify_add_watch(fd_, (bat / "uevent").c_str(), IN_ACCESS);
|
||||
}
|
||||
label_.set_name("battery");
|
||||
worker();
|
||||
}
|
||||
|
||||
@ -63,7 +62,7 @@ void waybar::modules::Battery::worker()
|
||||
};
|
||||
}
|
||||
|
||||
auto waybar::modules::Battery::update() -> void
|
||||
std::tuple<uint16_t, std::string> waybar::modules::Battery::getInfos()
|
||||
{
|
||||
try {
|
||||
uint16_t total = 0;
|
||||
@ -79,28 +78,68 @@ auto waybar::modules::Battery::update() -> void
|
||||
total += capacity;
|
||||
}
|
||||
uint16_t capacity = total / batteries_.size();
|
||||
label_.set_text(fmt::format(format_, fmt::arg("capacity", capacity),
|
||||
fmt::arg("icon", getIcon(capacity))));
|
||||
label_.set_tooltip_text(status);
|
||||
bool charging = status == "Charging";
|
||||
if (charging) {
|
||||
label_.get_style_context()->add_class("charging");
|
||||
} else {
|
||||
label_.get_style_context()->remove_class("charging");
|
||||
}
|
||||
auto warning = config_["warning"].isUInt() ? config_["warning"].asUInt() : 30;
|
||||
auto critical = config_["critical"].isUInt() ? config_["critical"].asUInt() : 15;
|
||||
if (capacity <= critical && !charging) {
|
||||
label_.get_style_context()->add_class("critical");
|
||||
label_.get_style_context()->remove_class("warning");
|
||||
} else if (capacity <= warning && !charging) {
|
||||
label_.get_style_context()->add_class("warning");
|
||||
label_.get_style_context()->remove_class("critical");
|
||||
} else {
|
||||
label_.get_style_context()->remove_class("critical");
|
||||
label_.get_style_context()->remove_class("warning");
|
||||
}
|
||||
return {capacity, status};
|
||||
} catch (const std::exception& e) {
|
||||
std::cerr << e.what() << std::endl;
|
||||
return {0, "Unknown"};
|
||||
}
|
||||
}
|
||||
|
||||
std::string waybar::modules::Battery::getState(uint16_t capacity, bool charging)
|
||||
{
|
||||
// Get current state
|
||||
std::vector<std::pair<std::string, uint16_t>> states;
|
||||
if (config_["states"].isObject()) {
|
||||
for (auto it = config_["states"].begin(); it != config_["states"].end(); ++it) {
|
||||
if (it->isUInt() && it.key().isString()) {
|
||||
states.push_back({it.key().asString(), it->asUInt()});
|
||||
}
|
||||
}
|
||||
}
|
||||
// Sort states
|
||||
std::sort(states.begin(), states.end(), [](auto &a, auto &b) {
|
||||
return a.second < b.second;
|
||||
});
|
||||
std::string validState = "";
|
||||
for (auto state : states) {
|
||||
if (capacity <= state.second && !charging && validState.empty()) {
|
||||
label_.get_style_context()->add_class(state.first);
|
||||
validState = state.first;
|
||||
} else {
|
||||
label_.get_style_context()->remove_class(state.first);
|
||||
}
|
||||
}
|
||||
return validState;
|
||||
}
|
||||
|
||||
auto waybar::modules::Battery::update() -> void
|
||||
{
|
||||
auto [capacity, status] = getInfos();
|
||||
label_.set_tooltip_text(status);
|
||||
bool charging = status == "Charging";
|
||||
auto format = format_;
|
||||
if (charging) {
|
||||
label_.get_style_context()->add_class("charging");
|
||||
if (config_["format-charging"].isString()) {
|
||||
format = config_["format-charging"].asString();
|
||||
}
|
||||
} else {
|
||||
label_.get_style_context()->remove_class("charging");
|
||||
if (status == "Full" && config_["format-full"].isString()) {
|
||||
format = config_["format-full"].asString();
|
||||
}
|
||||
}
|
||||
auto state = getState(capacity, charging);
|
||||
if (!state.empty() && config_["format-" + state].isString()) {
|
||||
format = config_["format-" + state].asString();
|
||||
}
|
||||
if (format.empty()) {
|
||||
event_box_.hide();
|
||||
label_.set_name("");
|
||||
} else {
|
||||
event_box_.show();
|
||||
label_.set_name("battery");
|
||||
label_.set_text(fmt::format(format, fmt::arg("capacity", capacity),
|
||||
fmt::arg("icon", getIcon(capacity))));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user