Skip to content

Commit

Permalink
Merge pull request #1996 from Kuruyia/feat/brightness-control
Browse files Browse the repository at this point in the history
Closes #1411
  • Loading branch information
Alexays committed Feb 9, 2023
2 parents a6eaaad + 973aa09 commit 9049de5
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 2 deletions.
5 changes: 5 additions & 0 deletions include/modules/backlight.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include <vector>

#include "ALabel.hpp"
#include "giomm/dbusproxy.h"
#include "util/json.hpp"
#include "util/sleeper_thread.hpp"

Expand Down Expand Up @@ -50,6 +51,8 @@ class Backlight : public ALabel {
template <class ForwardIt, class Inserter>
static void enumerate_devices(ForwardIt first, ForwardIt last, Inserter inserter, udev *udev);

bool handleScroll(GdkEventScroll* e);

const std::string preferred_device_;
static constexpr int EPOLL_MAX_EVENTS = 16;

Expand All @@ -60,5 +63,7 @@ class Backlight : public ALabel {
std::vector<BacklightDev> devices_;
// thread must destruct before shared data
util::SleeperThread udev_thread_;

Glib::RefPtr<Gio::DBus::Proxy> login_proxy_;
};
} // namespace waybar::modules
13 changes: 11 additions & 2 deletions man/waybar-backlight.5.scd
Original file line number Diff line number Diff line change
Expand Up @@ -58,16 +58,25 @@ The *backlight* module displays the current backlight level.

*on-scroll-up*: ++
typeof: string ++
Command to execute when performing a scroll up on the module.
Command to execute when performing a scroll up on the module. This replaces the default behaviour of brightness control.

*on-scroll-down*: ++
typeof: string
Command to execute when performing a scroll down on the module.
Command to execute when performing a scroll down on the module. This replaces the default behaviour of brightness control.

*smooth-scrolling-threshold*: ++
typeof: double
Threshold to be used when scrolling.

*reverse-scrolling*: ++
typeof: bool ++
Option to reverse the scroll direction.

*scroll-step*: ++
typeof: float ++
default: 1.0 ++
The speed in which to change the brightness when scrolling.

# EXAMPLE:

```
Expand Down
77 changes: 77 additions & 0 deletions src/modules/backlight.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,15 @@ waybar::modules::Backlight::Backlight(const std::string &id, const Json::Value &
dp.emit();
}

// Set up scroll handler
event_box_.add_events(Gdk::SCROLL_MASK | Gdk::SMOOTH_SCROLL_MASK);
event_box_.signal_scroll_event().connect(sigc::mem_fun(*this, &Backlight::handleScroll));

// Connect to the login interface
login_proxy_ = Gio::DBus::Proxy::create_for_bus_sync(
Gio::DBus::BusType::BUS_TYPE_SYSTEM, "org.freedesktop.login1",
"/org/freedesktop/login1/session/self", "org.freedesktop.login1.Session");

udev_thread_ = [this] {
std::unique_ptr<udev, UdevDeleter> udev{udev_new()};
check_nn(udev.get(), "Udev new failed");
Expand Down Expand Up @@ -264,3 +273,71 @@ void waybar::modules::Backlight::enumerate_devices(ForwardIt first, ForwardIt la
upsert_device(first, last, inserter, dev.get());
}
}

bool waybar::modules::Backlight::handleScroll(GdkEventScroll *e) {
// Check if the user has set a custom command for scrolling
if (config_["on-scroll-up"].isString() || config_["on-scroll-down"].isString()) {
return AModule::handleScroll(e);
}

// Fail fast if the proxy could not be initialized
if (!login_proxy_) {
return true;
}

// Check scroll direction
auto dir = AModule::getScrollDir(e);
if (dir == SCROLL_DIR::NONE) {
return true;
}

if (config_["reverse-scrolling"].asBool()) {
if (dir == SCROLL_DIR::UP) {
dir = SCROLL_DIR::DOWN;
} else if (dir == SCROLL_DIR::DOWN) {
dir = SCROLL_DIR::UP;
}
}

// Get scroll step
double step = 1;

if (config_["scroll-step"].isDouble()) {
step = config_["scroll-step"].asDouble();
}

// Get the best device
decltype(devices_) devices;
{
std::scoped_lock<std::mutex> lock(udev_thread_mutex_);
devices = devices_;
}
const auto best = best_device(devices.cbegin(), devices.cend(), preferred_device_);

if (best == nullptr) {
return true;
}

// Compute the absolute step
const auto abs_step = static_cast<int>(round(step * best->get_max() / 100.0f));

// Compute the new value
int new_value = best->get_actual();

if (dir == SCROLL_DIR::UP) {
new_value += abs_step;
} else if (dir == SCROLL_DIR::DOWN) {
new_value -= abs_step;
}

// Clamp the value
new_value = std::clamp(new_value, 0, best->get_max());

// Set the new value
auto call_args = Glib::VariantContainerBase(
g_variant_new("(ssu)", "backlight", std::string(best->name()).c_str(), new_value));

login_proxy_->call_sync("SetBrightness", call_args);

return true;
}

0 comments on commit 9049de5

Please sign in to comment.