Skip to content

Commit

Permalink
Merge pull request #2810 from ArneshRC/master
Browse files Browse the repository at this point in the history
feat(battery): added support for battery state-based classes on the entire waybar
  • Loading branch information
Alexays authored Jan 23, 2024
2 parents 8e2fa0f + 90b5b21 commit 0948a40
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 4 deletions.
5 changes: 4 additions & 1 deletion include/modules/battery.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include <vector>

#include "ALabel.hpp"
#include "bar.hpp"
#include "util/sleeper_thread.hpp"

namespace waybar::modules {
Expand All @@ -28,7 +29,7 @@ namespace fs = std::filesystem;

class Battery : public ALabel {
public:
Battery(const std::string&, const Json::Value&);
Battery(const std::string&, const waybar::Bar&, const Json::Value&);
virtual ~Battery();
auto update() -> void override;

Expand All @@ -40,6 +41,7 @@ class Battery : public ALabel {
const std::string getAdapterStatus(uint8_t capacity) const;
const std::tuple<uint8_t, float, std::string, float> getInfos();
const std::string formatTimeRemaining(float hoursRemaining);
void setBarClass(std::string&);

int global_watch;
std::map<fs::path, int> batteries_;
Expand All @@ -49,6 +51,7 @@ class Battery : public ALabel {
std::mutex battery_list_mutex_;
std::string old_status_;
bool warnFirstTime_{true};
const Bar& bar_;

Check warning on line 54 in include/modules/battery.hpp

View workflow job for this annotation

GitHub Actions / build

include/modules/battery.hpp:54:14 [readability-identifier-naming]

invalid case style for private member 'bar_'

util::SleeperThread thread_;
util::SleeperThread thread_battery_update_;
Expand Down
7 changes: 7 additions & 0 deletions man/waybar-battery.5.scd
Original file line number Diff line number Diff line change
Expand Up @@ -167,3 +167,10 @@ The *battery* module allows one to define custom formats based on up to two fact
- *<state>* can be defined in the *config*. For more information see *states*.
- *#battery.<status>.<state>*
- Combination of both *<status>* and *<state>*.

The following classes are applied to the entire Waybar rather than just the
battery widget:

- *window#waybar.battery-<state>*
- *<state>* can be defined in the *config*, as previously mentioned.

2 changes: 1 addition & 1 deletion src/factory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ waybar::AModule* waybar::Factory::makeModule(const std::string& name,
auto id = hash_pos != std::string::npos ? name.substr(hash_pos + 1) : "";
#if defined(__FreeBSD__) || (defined(__linux__) && !defined(NO_FILESYSTEM))
if (ref == "battery") {
return new waybar::modules::Battery(id, config_[name]);
return new waybar::modules::Battery(id, bar_, config_[name]);
}
#endif
#ifdef HAVE_GAMEMODE
Expand Down
42 changes: 40 additions & 2 deletions src/modules/battery.cpp
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
#include "modules/battery.hpp"
#include <algorithm>
#if defined(__FreeBSD__)
#include <sys/sysctl.h>
#endif
#include <spdlog/spdlog.h>

#include <iostream>
waybar::modules::Battery::Battery(const std::string& id, const Json::Value& config)
: ALabel(config, "battery", id, "{capacity}%", 60) {
waybar::modules::Battery::Battery(const std::string& id, const Bar& bar, const Json::Value& config)
: ALabel(config, "battery", id, "{capacity}%", 60), bar_(bar) {
#if defined(__linux__)
battery_watch_fd_ = inotify_init1(IN_CLOEXEC);
if (battery_watch_fd_ == -1) {
Expand Down Expand Up @@ -641,6 +642,7 @@ auto waybar::modules::Battery::update() -> void {
[](char ch) { return ch == ' ' ? '-' : std::tolower(ch); });
auto format = format_;
auto state = getState(capacity, true);
setBarClass(state);
auto time_remaining_formatted = formatTimeRemaining(time_remaining);
if (tooltipEnabled()) {
std::string tooltip_text_default;
Expand Down Expand Up @@ -689,3 +691,39 @@ auto waybar::modules::Battery::update() -> void {
// Call parent update
ALabel::update();
}

void waybar::modules::Battery::setBarClass(std::string& state) {
auto classes = bar_.window.get_style_context()->list_classes();
const std::string prefix = "battery-";

auto old_class_it = std::find_if(classes.begin(), classes.end(),

Check warning on line 699 in src/modules/battery.cpp

View workflow job for this annotation

GitHub Actions / build

src/modules/battery.cpp:699:8 [readability-identifier-naming]

invalid case style for variable 'old_class_it'
[&prefix](auto classname) {
return classname.rfind(prefix, 0) == 0;
});

auto new_class = prefix + state;

Check warning on line 704 in src/modules/battery.cpp

View workflow job for this annotation

GitHub Actions / build

src/modules/battery.cpp:704:8 [readability-identifier-naming]

invalid case style for variable 'new_class'

// If the bar doesn't have any `battery-` class
if(old_class_it == classes.end()) {
if(!state.empty()) {
bar_.window.get_style_context()->add_class(new_class);
}
return;
}

auto old_class = *old_class_it;

Check warning on line 714 in src/modules/battery.cpp

View workflow job for this annotation

GitHub Actions / build

src/modules/battery.cpp:714:8 [readability-identifier-naming]

invalid case style for variable 'old_class'

// If the bar has a `battery-` class,
// but `state` is empty
if(state.empty()) {
bar_.window.get_style_context()->remove_class(old_class);
return;
}

// If the bar has a `battery-` class,
// and `state` is NOT empty
if(old_class != new_class) {
bar_.window.get_style_context()->remove_class(old_class);
bar_.window.get_style_context()->add_class(new_class);
}
}

0 comments on commit 0948a40

Please sign in to comment.