mirror of
https://github.com/rad4day/Waybar.git
synced 2023-12-21 10:22:59 +01:00
Merge pull request #1996 from Kuruyia/feat/brightness-control
Closes https://github.com/Alexays/Waybar/issues/1411
This commit is contained in:
commit
9049de583e
@ -6,6 +6,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
|
#include "giomm/dbusproxy.h"
|
||||||
#include "util/json.hpp"
|
#include "util/json.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
@ -50,6 +51,8 @@ class Backlight : public ALabel {
|
|||||||
template <class ForwardIt, class Inserter>
|
template <class ForwardIt, class Inserter>
|
||||||
static void enumerate_devices(ForwardIt first, ForwardIt last, Inserter inserter, udev *udev);
|
static void enumerate_devices(ForwardIt first, ForwardIt last, Inserter inserter, udev *udev);
|
||||||
|
|
||||||
|
bool handleScroll(GdkEventScroll* e);
|
||||||
|
|
||||||
const std::string preferred_device_;
|
const std::string preferred_device_;
|
||||||
static constexpr int EPOLL_MAX_EVENTS = 16;
|
static constexpr int EPOLL_MAX_EVENTS = 16;
|
||||||
|
|
||||||
@ -60,5 +63,7 @@ class Backlight : public ALabel {
|
|||||||
std::vector<BacklightDev> devices_;
|
std::vector<BacklightDev> devices_;
|
||||||
// thread must destruct before shared data
|
// thread must destruct before shared data
|
||||||
util::SleeperThread udev_thread_;
|
util::SleeperThread udev_thread_;
|
||||||
|
|
||||||
|
Glib::RefPtr<Gio::DBus::Proxy> login_proxy_;
|
||||||
};
|
};
|
||||||
} // namespace waybar::modules
|
} // namespace waybar::modules
|
||||||
|
@ -58,16 +58,25 @@ The *backlight* module displays the current backlight level.
|
|||||||
|
|
||||||
*on-scroll-up*: ++
|
*on-scroll-up*: ++
|
||||||
typeof: string ++
|
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*: ++
|
*on-scroll-down*: ++
|
||||||
typeof: string
|
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*: ++
|
*smooth-scrolling-threshold*: ++
|
||||||
typeof: double
|
typeof: double
|
||||||
Threshold to be used when scrolling.
|
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:
|
# EXAMPLE:
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@ -106,6 +106,15 @@ waybar::modules::Backlight::Backlight(const std::string &id, const Json::Value &
|
|||||||
dp.emit();
|
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] {
|
udev_thread_ = [this] {
|
||||||
std::unique_ptr<udev, UdevDeleter> udev{udev_new()};
|
std::unique_ptr<udev, UdevDeleter> udev{udev_new()};
|
||||||
check_nn(udev.get(), "Udev new failed");
|
check_nn(udev.get(), "Udev new failed");
|
||||||
@ -264,3 +273,71 @@ void waybar::modules::Backlight::enumerate_devices(ForwardIt first, ForwardIt la
|
|||||||
upsert_device(first, last, inserter, dev.get());
|
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;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user