2018-08-18 11:43:48 +02:00
|
|
|
#include "ALabel.hpp"
|
2018-10-29 18:04:09 +01:00
|
|
|
#include <util/command.hpp>
|
2018-08-18 11:43:48 +02:00
|
|
|
|
2018-08-27 01:36:25 +02:00
|
|
|
#include <iostream>
|
|
|
|
|
2018-11-23 11:57:37 +01:00
|
|
|
waybar::ALabel::ALabel(const Json::Value& config, const std::string format, uint16_t interval)
|
2019-04-18 17:52:00 +02:00
|
|
|
: config_(config),
|
|
|
|
format_(config_["format"].isString() ? config_["format"].asString() : format),
|
|
|
|
interval_(config_["interval"] == "once"
|
|
|
|
? std::chrono::seconds(100000000)
|
|
|
|
: std::chrono::seconds(
|
|
|
|
config_["interval"].isUInt() ? config_["interval"].asUInt() : interval)),
|
|
|
|
default_format_(format_) {
|
2018-08-27 01:36:25 +02:00
|
|
|
event_box_.add(label_);
|
2019-04-18 17:52:00 +02:00
|
|
|
if (config_["max-length"].isUInt()) {
|
2018-08-18 11:43:48 +02:00
|
|
|
label_.set_max_width_chars(config_["max-length"].asUInt());
|
|
|
|
label_.set_ellipsize(Pango::EllipsizeMode::ELLIPSIZE_END);
|
|
|
|
}
|
2018-10-26 09:27:16 +02:00
|
|
|
if (config_["format-alt"].isString()) {
|
2018-08-27 01:36:25 +02:00
|
|
|
event_box_.add_events(Gdk::BUTTON_PRESS_MASK);
|
2019-04-18 17:52:00 +02:00
|
|
|
event_box_.signal_button_press_event().connect(sigc::mem_fun(*this, &ALabel::handleToggle));
|
2018-10-29 18:04:09 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// configure events' user commands
|
2018-11-24 15:56:16 +01:00
|
|
|
if (config_["on-click"].isString() || config_["on-click-right"].isString()) {
|
2018-10-29 18:04:09 +01:00
|
|
|
event_box_.add_events(Gdk::BUTTON_PRESS_MASK);
|
2019-04-18 17:52:00 +02:00
|
|
|
event_box_.signal_button_press_event().connect(sigc::mem_fun(*this, &ALabel::handleToggle));
|
2018-10-29 18:04:09 +01:00
|
|
|
}
|
2018-11-24 15:56:16 +01:00
|
|
|
if (config_["on-scroll-up"].isString() || config_["on-scroll-down"].isString()) {
|
2019-02-16 09:56:53 +01:00
|
|
|
event_box_.add_events(Gdk::SCROLL_MASK | Gdk::SMOOTH_SCROLL_MASK);
|
2019-04-18 17:52:00 +02:00
|
|
|
event_box_.signal_scroll_event().connect(sigc::mem_fun(*this, &ALabel::handleScroll));
|
2018-08-27 01:36:25 +02:00
|
|
|
}
|
2018-08-18 11:43:48 +02:00
|
|
|
}
|
|
|
|
|
2018-10-29 18:04:09 +01:00
|
|
|
auto waybar::ALabel::update() -> void {
|
2018-08-18 11:43:48 +02:00
|
|
|
// Nothing here
|
|
|
|
}
|
|
|
|
|
2018-10-29 18:04:09 +01:00
|
|
|
bool waybar::ALabel::handleToggle(GdkEventButton* const& e) {
|
2018-11-01 09:27:00 +01:00
|
|
|
if (config_["on-click"].isString() && e->button == 1) {
|
|
|
|
waybar::util::command::forkExec(config_["on-click"].asString());
|
2019-03-02 20:07:12 +01:00
|
|
|
} else if (config_["on-click-middle"].isString() && e->button == 2) {
|
|
|
|
waybar::util::command::forkExec(config_["on-click-middle"].asString());
|
2018-11-24 15:56:16 +01:00
|
|
|
} else if (config_["on-click-right"].isString() && e->button == 3) {
|
|
|
|
waybar::util::command::forkExec(config_["on-click-right"].asString());
|
2019-03-02 20:07:12 +01:00
|
|
|
} else if (config_["on-click-forward"].isString() && e->button == 8) {
|
|
|
|
waybar::util::command::forkExec(config_["on-click-backward"].asString());
|
|
|
|
} else if (config_["on-click-backward"].isString() && e->button == 9) {
|
|
|
|
waybar::util::command::forkExec(config_["on-click-forward"].asString());
|
2019-03-04 21:00:44 +01:00
|
|
|
}
|
|
|
|
if (config_["format-alt-click"].isUInt() && e->button == config_["format-alt-click"].asUInt()) {
|
2019-01-13 22:36:37 +01:00
|
|
|
alt_ = !alt_;
|
2019-03-02 20:07:12 +01:00
|
|
|
if (alt_ && config_["format-alt"].isString()) {
|
2018-10-29 18:04:09 +01:00
|
|
|
format_ = config_["format-alt"].asString();
|
|
|
|
} else {
|
|
|
|
format_ = default_format_;
|
|
|
|
}
|
2018-08-27 01:36:25 +02:00
|
|
|
}
|
2018-10-29 18:04:09 +01:00
|
|
|
|
2018-08-27 01:36:25 +02:00
|
|
|
dp.emit();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2018-10-29 18:04:09 +01:00
|
|
|
bool waybar::ALabel::handleScroll(GdkEventScroll* e) {
|
|
|
|
// Avoid concurrent scroll event
|
2018-11-01 09:27:00 +01:00
|
|
|
std::lock_guard<std::mutex> lock(mutex_);
|
2019-04-18 17:52:00 +02:00
|
|
|
bool direction_up = false;
|
2018-10-29 18:04:09 +01:00
|
|
|
|
2018-11-01 09:27:00 +01:00
|
|
|
if (e->direction == GDK_SCROLL_UP) {
|
|
|
|
direction_up = true;
|
|
|
|
}
|
|
|
|
if (e->direction == GDK_SCROLL_DOWN) {
|
|
|
|
direction_up = false;
|
|
|
|
}
|
|
|
|
if (e->direction == GDK_SCROLL_SMOOTH) {
|
|
|
|
gdouble delta_x, delta_y;
|
2019-04-18 17:52:00 +02:00
|
|
|
gdk_event_get_scroll_deltas(reinterpret_cast<const GdkEvent*>(e), &delta_x, &delta_y);
|
2018-11-01 09:27:00 +01:00
|
|
|
if (delta_y < 0) {
|
2018-10-29 18:04:09 +01:00
|
|
|
direction_up = true;
|
2018-11-01 09:27:00 +01:00
|
|
|
} else if (delta_y > 0) {
|
2018-10-29 18:04:09 +01:00
|
|
|
direction_up = false;
|
|
|
|
}
|
|
|
|
}
|
2018-11-01 09:27:00 +01:00
|
|
|
if (direction_up && config_["on-scroll-up"].isString()) {
|
|
|
|
waybar::util::command::forkExec(config_["on-scroll-up"].asString());
|
|
|
|
} else if (config_["on-scroll-down"].isString()) {
|
|
|
|
waybar::util::command::forkExec(config_["on-scroll-down"].asString());
|
|
|
|
}
|
|
|
|
dp.emit();
|
2018-10-29 18:04:09 +01:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2019-04-18 17:52:00 +02:00
|
|
|
std::string waybar::ALabel::getIcon(uint16_t percentage, const std::string& alt) {
|
2018-08-29 23:50:41 +02:00
|
|
|
auto format_icons = config_["format-icons"];
|
|
|
|
if (format_icons.isObject()) {
|
2018-12-25 21:03:13 +01:00
|
|
|
if (!alt.empty() && (format_icons[alt].isString() || format_icons[alt].isArray())) {
|
2018-08-29 23:50:41 +02:00
|
|
|
format_icons = format_icons[alt];
|
|
|
|
} else {
|
|
|
|
format_icons = format_icons["default"];
|
|
|
|
}
|
2018-08-27 01:36:25 +02:00
|
|
|
}
|
2018-08-29 23:50:41 +02:00
|
|
|
if (format_icons.isArray()) {
|
|
|
|
auto size = format_icons.size();
|
|
|
|
auto idx = std::clamp(percentage / (100 / size), 0U, size - 1);
|
|
|
|
format_icons = format_icons[idx];
|
|
|
|
}
|
|
|
|
if (format_icons.isString()) {
|
|
|
|
return format_icons.asString();
|
|
|
|
}
|
|
|
|
return "";
|
2018-08-27 01:36:25 +02:00
|
|
|
}
|
|
|
|
|
2019-04-18 17:52:00 +02:00
|
|
|
bool waybar::ALabel::tooltipEnabled() {
|
2019-02-24 09:25:34 +01:00
|
|
|
return config_["tooltip"].isBool() ? config_["tooltip"].asBool() : true;
|
2019-02-22 11:35:26 +01:00
|
|
|
}
|
|
|
|
|
2018-10-29 18:04:09 +01:00
|
|
|
waybar::ALabel::operator Gtk::Widget&() { return event_box_; }
|