Merge branch 'master' into master
commit
46f07d24dd
|
@ -36,6 +36,23 @@ class AModule : public IModule {
|
||||||
std::vector<int> pid_;
|
std::vector<int> pid_;
|
||||||
gdouble distance_scrolled_y_;
|
gdouble distance_scrolled_y_;
|
||||||
gdouble distance_scrolled_x_;
|
gdouble distance_scrolled_x_;
|
||||||
|
static const inline std::map<std::pair<uint, GdkEventType>, std::string> eventMap_{
|
||||||
|
{std::make_pair(1, GdkEventType::GDK_BUTTON_PRESS), "on-click"},
|
||||||
|
{std::make_pair(1, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click"},
|
||||||
|
{std::make_pair(1, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click"},
|
||||||
|
{std::make_pair(2, GdkEventType::GDK_BUTTON_PRESS), "on-click-middle"},
|
||||||
|
{std::make_pair(2, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click-middle"},
|
||||||
|
{std::make_pair(2, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click-middle"},
|
||||||
|
{std::make_pair(3, GdkEventType::GDK_BUTTON_PRESS), "on-click-right"},
|
||||||
|
{std::make_pair(3, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click-right"},
|
||||||
|
{std::make_pair(3, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click-right"},
|
||||||
|
{std::make_pair(8, GdkEventType::GDK_BUTTON_PRESS), "on-click-backward"},
|
||||||
|
{std::make_pair(8, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click-backward"},
|
||||||
|
{std::make_pair(8, GdkEventType::GDK_2BUTTON_PRESS), "on-triple-click-backward"},
|
||||||
|
{std::make_pair(9, GdkEventType::GDK_BUTTON_PRESS), "on-click-forward"},
|
||||||
|
{std::make_pair(9, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click-forward"},
|
||||||
|
{std::make_pair(9, GdkEventType::GDK_2BUTTON_PRESS), "on-triple-click-forward"}
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar
|
} // namespace waybar
|
||||||
|
|
|
@ -34,6 +34,10 @@ class UPower : public AModule {
|
||||||
const gchar *object_path, const gchar *interface_name,
|
const gchar *object_path, const gchar *interface_name,
|
||||||
const gchar *signal_name, GVariant *parameters,
|
const gchar *signal_name, GVariant *parameters,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
|
static void upowerAppear(GDBusConnection *conn, const gchar *name, const gchar *name_owner,
|
||||||
|
gpointer data);
|
||||||
|
static void upowerDisappear(GDBusConnection *connection, const gchar *name, gpointer user_data);
|
||||||
|
|
||||||
void removeDevice(const gchar *objectPath);
|
void removeDevice(const gchar *objectPath);
|
||||||
void addDevice(UpDevice *device);
|
void addDevice(UpDevice *device);
|
||||||
void setDisplayDevice();
|
void setDisplayDevice();
|
||||||
|
@ -67,6 +71,8 @@ class UPower : public AModule {
|
||||||
UPowerTooltip *upower_tooltip;
|
UPowerTooltip *upower_tooltip;
|
||||||
std::string lastStatus;
|
std::string lastStatus;
|
||||||
bool showAltText;
|
bool showAltText;
|
||||||
|
bool upowerRunning;
|
||||||
|
guint upowerWatcher_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules::upower
|
} // namespace waybar::modules::upower
|
||||||
|
|
|
@ -71,4 +71,6 @@ depending on the charging state.
|
||||||
- *#upower*
|
- *#upower*
|
||||||
- *#upower.charging*
|
- *#upower.charging*
|
||||||
- *#upower.discharging*
|
- *#upower.discharging*
|
||||||
|
- *#upower.full*
|
||||||
|
- *#upower.empty*
|
||||||
- *#upower.unknown-status*
|
- *#upower.unknown-status*
|
||||||
|
|
|
@ -359,6 +359,7 @@ if scdoc.found()
|
||||||
'waybar-wlr-workspaces.5.scd',
|
'waybar-wlr-workspaces.5.scd',
|
||||||
'waybar-bluetooth.5.scd',
|
'waybar-bluetooth.5.scd',
|
||||||
'waybar-sndio.5.scd',
|
'waybar-sndio.5.scd',
|
||||||
|
'waybar-upower.5.scd',
|
||||||
]
|
]
|
||||||
|
|
||||||
if (giounix.found() and not get_option('logind').disabled())
|
if (giounix.found() and not get_option('logind').disabled())
|
||||||
|
|
|
@ -10,16 +10,24 @@ AModule::AModule(const Json::Value& config, const std::string& name, const std::
|
||||||
, distance_scrolled_y_(0.0)
|
, distance_scrolled_y_(0.0)
|
||||||
, distance_scrolled_x_(0.0) {
|
, distance_scrolled_x_(0.0) {
|
||||||
// configure events' user commands
|
// configure events' user commands
|
||||||
if (config_["on-click"].isString() || config_["on-click-middle"].isString() ||
|
if (enable_click) {
|
||||||
config_["on-click-backward"].isString() || config_["on-click-forward"].isString() ||
|
|
||||||
config_["on-click-right"].isString() || enable_click) {
|
|
||||||
event_box_.add_events(Gdk::BUTTON_PRESS_MASK);
|
event_box_.add_events(Gdk::BUTTON_PRESS_MASK);
|
||||||
event_box_.signal_button_press_event().connect(sigc::mem_fun(*this, &AModule::handleToggle));
|
event_box_.signal_button_press_event().connect(sigc::mem_fun(*this, &AModule::handleToggle));
|
||||||
|
} else {
|
||||||
|
std::map<std::pair<uint, GdkEventType>, std::string>::const_iterator it{eventMap_.cbegin()};
|
||||||
|
while(it != eventMap_.cend()) {
|
||||||
|
if (config_[it->second].isString()) {
|
||||||
|
event_box_.add_events(Gdk::BUTTON_PRESS_MASK);
|
||||||
|
event_box_.signal_button_press_event().connect(sigc::mem_fun(*this, &AModule::handleToggle));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
++it;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (config_["on-scroll-up"].isString() || config_["on-scroll-down"].isString() || enable_scroll) {
|
if (config_["on-scroll-up"].isString() || config_["on-scroll-down"].isString() || enable_scroll) {
|
||||||
event_box_.add_events(Gdk::SCROLL_MASK | Gdk::SMOOTH_SCROLL_MASK);
|
event_box_.add_events(Gdk::SCROLL_MASK | Gdk::SMOOTH_SCROLL_MASK);
|
||||||
event_box_.signal_scroll_event().connect(sigc::mem_fun(*this, &AModule::handleScroll));
|
event_box_.signal_scroll_event().connect(sigc::mem_fun(*this, &AModule::handleScroll));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AModule::~AModule() {
|
AModule::~AModule() {
|
||||||
|
@ -30,7 +38,6 @@ AModule::~AModule() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
auto AModule::update() -> void {
|
auto AModule::update() -> void {
|
||||||
// Run user-provided update handler if configured
|
// Run user-provided update handler if configured
|
||||||
if (config_["on-update"].isString()) {
|
if (config_["on-update"].isString()) {
|
||||||
|
@ -39,18 +46,14 @@ auto AModule::update() -> void {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AModule::handleToggle(GdkEventButton* const& e) {
|
bool AModule::handleToggle(GdkEventButton* const& e) {
|
||||||
std::string format;
|
const std::map<std::pair<uint, GdkEventType>, std::string>::const_iterator& rec{eventMap_.find(std::pair(e->button, e->type))};
|
||||||
if (config_["on-click"].isString() && e->button == 1) {
|
std::string format{ (rec != eventMap_.cend()) ? rec->second : std::string{""}};
|
||||||
format = config_["on-click"].asString();
|
|
||||||
} else if (config_["on-click-middle"].isString() && e->button == 2) {
|
if (!format.empty()) {
|
||||||
format = config_["on-click-middle"].asString();
|
if (config_[format].isString()) format = config_[format].asString();
|
||||||
} else if (config_["on-click-right"].isString() && e->button == 3) {
|
else format.clear();
|
||||||
format = config_["on-click-right"].asString();
|
|
||||||
} else if (config_["on-click-backward"].isString() && e->button == 8) {
|
|
||||||
format = config_["on-click-backward"].asString();
|
|
||||||
} else if (config_["on-click-forward"].isString() && e->button == 9) {
|
|
||||||
format = config_["on-click-forward"].asString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!format.empty()) {
|
if (!format.empty()) {
|
||||||
pid_.push_back(util::command::forkExec(format));
|
pid_.push_back(util::command::forkExec(format));
|
||||||
}
|
}
|
||||||
|
|
|
@ -88,8 +88,9 @@ void waybar::modules::Battery::refreshBatteries() {
|
||||||
auto dir_name = node.path().filename();
|
auto dir_name = node.path().filename();
|
||||||
auto bat_defined = config_["bat"].isString();
|
auto bat_defined = config_["bat"].isString();
|
||||||
if (((bat_defined && dir_name == config_["bat"].asString()) || !bat_defined) &&
|
if (((bat_defined && dir_name == config_["bat"].asString()) || !bat_defined) &&
|
||||||
fs::exists(node.path() / "capacity") && fs::exists(node.path() / "uevent") &&
|
(fs::exists(node.path() / "capacity") || fs::exists(node.path() / "charge_now")) &&
|
||||||
fs::exists(node.path() / "status") && fs::exists(node.path() / "type")) {
|
fs::exists(node.path() / "uevent") && fs::exists(node.path() / "status") &&
|
||||||
|
fs::exists(node.path() / "type")) {
|
||||||
std::string type;
|
std::string type;
|
||||||
std::ifstream(node.path() / "type") >> type;
|
std::ifstream(node.path() / "type") >> type;
|
||||||
|
|
||||||
|
@ -168,14 +169,21 @@ const std::tuple<uint8_t, float, std::string, float> waybar::modules::Battery::g
|
||||||
|
|
||||||
// Some battery will report current and charge in μA/μAh.
|
// Some battery will report current and charge in μA/μAh.
|
||||||
// Scale these by the voltage to get μW/μWh.
|
// Scale these by the voltage to get μW/μWh.
|
||||||
if (fs::exists(bat / "current_now")) {
|
if (fs::exists(bat / "current_now") || fs::exists(bat / "current_avg")) {
|
||||||
uint32_t voltage_now;
|
uint32_t voltage_now;
|
||||||
uint32_t current_now;
|
uint32_t current_now;
|
||||||
uint32_t charge_now;
|
uint32_t charge_now;
|
||||||
uint32_t charge_full;
|
uint32_t charge_full;
|
||||||
uint32_t charge_full_design;
|
uint32_t charge_full_design;
|
||||||
std::ifstream(bat / "voltage_now") >> voltage_now;
|
// Some batteries have only *_avg, not *_now
|
||||||
std::ifstream(bat / "current_now") >> current_now;
|
if (fs::exists(bat / "voltage_now"))
|
||||||
|
std::ifstream(bat / "voltage_now") >> voltage_now;
|
||||||
|
else
|
||||||
|
std::ifstream(bat / "voltage_avg") >> voltage_now;
|
||||||
|
if (fs::exists(bat / "current_now"))
|
||||||
|
std::ifstream(bat / "current_now") >> current_now;
|
||||||
|
else
|
||||||
|
std::ifstream(bat / "current_avg") >> current_now;
|
||||||
std::ifstream(bat / "charge_full") >> charge_full;
|
std::ifstream(bat / "charge_full") >> charge_full;
|
||||||
std::ifstream(bat / "charge_full_design") >> charge_full_design;
|
std::ifstream(bat / "charge_full_design") >> charge_full_design;
|
||||||
if (fs::exists(bat / "charge_now"))
|
if (fs::exists(bat / "charge_now"))
|
||||||
|
|
|
@ -22,6 +22,7 @@ UPower::UPower(const std::string& id, const Json::Value& config)
|
||||||
showAltText(false) {
|
showAltText(false) {
|
||||||
box_.pack_start(icon_);
|
box_.pack_start(icon_);
|
||||||
box_.pack_start(label_);
|
box_.pack_start(label_);
|
||||||
|
box_.set_name(name_);
|
||||||
event_box_.add(box_);
|
event_box_.add(box_);
|
||||||
|
|
||||||
// Icon Size
|
// Icon Size
|
||||||
|
@ -67,6 +68,14 @@ UPower::UPower(const std::string& id, const Json::Value& config)
|
||||||
box_.signal_query_tooltip().connect(sigc::mem_fun(*this, &UPower::show_tooltip_callback));
|
box_.signal_query_tooltip().connect(sigc::mem_fun(*this, &UPower::show_tooltip_callback));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
upowerWatcher_id = g_bus_watch_name(G_BUS_TYPE_SYSTEM,
|
||||||
|
"org.freedesktop.UPower",
|
||||||
|
G_BUS_NAME_WATCHER_FLAGS_AUTO_START,
|
||||||
|
upowerAppear,
|
||||||
|
upowerDisappear,
|
||||||
|
this,
|
||||||
|
NULL);
|
||||||
|
|
||||||
GError* error = NULL;
|
GError* error = NULL;
|
||||||
client = up_client_new_full(NULL, &error);
|
client = up_client_new_full(NULL, &error);
|
||||||
if (client == NULL) {
|
if (client == NULL) {
|
||||||
|
@ -105,6 +114,7 @@ UPower::~UPower() {
|
||||||
g_dbus_connection_signal_unsubscribe(login1_connection, login1_id);
|
g_dbus_connection_signal_unsubscribe(login1_connection, login1_id);
|
||||||
login1_id = 0;
|
login1_id = 0;
|
||||||
}
|
}
|
||||||
|
g_bus_unwatch_name(upowerWatcher_id);
|
||||||
removeDevices();
|
removeDevices();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,6 +151,17 @@ void UPower::prepareForSleep_cb(GDBusConnection* system_bus, const gchar* sender
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void UPower::upowerAppear(GDBusConnection* conn, const gchar* name, const gchar* name_owner,
|
||||||
|
gpointer data) {
|
||||||
|
UPower* up = static_cast<UPower*>(data);
|
||||||
|
up->upowerRunning = true;
|
||||||
|
up->event_box_.set_visible(true);
|
||||||
|
}
|
||||||
|
void UPower::upowerDisappear(GDBusConnection* conn, const gchar* name, gpointer data) {
|
||||||
|
UPower* up = static_cast<UPower*>(data);
|
||||||
|
up->upowerRunning = false;
|
||||||
|
up->event_box_.set_visible(false);
|
||||||
|
}
|
||||||
|
|
||||||
void UPower::removeDevice(const gchar* objectPath) {
|
void UPower::removeDevice(const gchar* objectPath) {
|
||||||
std::lock_guard<std::mutex> guard(m_Mutex);
|
std::lock_guard<std::mutex> guard(m_Mutex);
|
||||||
|
@ -226,11 +247,13 @@ const std::string UPower::getDeviceStatus(UpDeviceState& state) {
|
||||||
case UP_DEVICE_STATE_CHARGING:
|
case UP_DEVICE_STATE_CHARGING:
|
||||||
case UP_DEVICE_STATE_PENDING_CHARGE:
|
case UP_DEVICE_STATE_PENDING_CHARGE:
|
||||||
return "charging";
|
return "charging";
|
||||||
case UP_DEVICE_STATE_EMPTY:
|
|
||||||
case UP_DEVICE_STATE_FULLY_CHARGED:
|
|
||||||
case UP_DEVICE_STATE_DISCHARGING:
|
case UP_DEVICE_STATE_DISCHARGING:
|
||||||
case UP_DEVICE_STATE_PENDING_DISCHARGE:
|
case UP_DEVICE_STATE_PENDING_DISCHARGE:
|
||||||
return "discharging";
|
return "discharging";
|
||||||
|
case UP_DEVICE_STATE_FULLY_CHARGED:
|
||||||
|
return "full";
|
||||||
|
case UP_DEVICE_STATE_EMPTY:
|
||||||
|
return "empty";
|
||||||
default:
|
default:
|
||||||
return "unknown-status";
|
return "unknown-status";
|
||||||
}
|
}
|
||||||
|
@ -258,6 +281,9 @@ std::string UPower::timeToString(gint64 time) {
|
||||||
auto UPower::update() -> void {
|
auto UPower::update() -> void {
|
||||||
std::lock_guard<std::mutex> guard(m_Mutex);
|
std::lock_guard<std::mutex> guard(m_Mutex);
|
||||||
|
|
||||||
|
// Don't update widget if the UPower service isn't running
|
||||||
|
if (!upowerRunning) return;
|
||||||
|
|
||||||
UpDeviceKind kind;
|
UpDeviceKind kind;
|
||||||
UpDeviceState state;
|
UpDeviceState state;
|
||||||
double percentage;
|
double percentage;
|
||||||
|
@ -344,7 +370,7 @@ auto UPower::update() -> void {
|
||||||
label_.set_markup(onlySpaces ? "" : label_format);
|
label_.set_markup(onlySpaces ? "" : label_format);
|
||||||
|
|
||||||
// Set icon
|
// Set icon
|
||||||
if (!Gtk::IconTheme::get_default()->has_icon(icon_name)) {
|
if (icon_name == NULL || !Gtk::IconTheme::get_default()->has_icon(icon_name)) {
|
||||||
icon_name = (char*)"battery-missing-symbolic";
|
icon_name = (char*)"battery-missing-symbolic";
|
||||||
}
|
}
|
||||||
icon_.set_from_icon_name(icon_name, Gtk::ICON_SIZE_INVALID);
|
icon_.set_from_icon_name(icon_name, Gtk::ICON_SIZE_INVALID);
|
||||||
|
|
|
@ -62,7 +62,9 @@ uint UPowerTooltip::updateTooltip(Devices& devices) {
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
// Skip Line_Power and BAT0 devices
|
// Skip Line_Power and BAT0 devices
|
||||||
if (kind == UP_DEVICE_KIND_LINE_POWER || strcmp(native_path, "BAT0") == 0) continue;
|
if (kind == UP_DEVICE_KIND_LINE_POWER || native_path == NULL || strlen(native_path) == 0 ||
|
||||||
|
strcmp(native_path, "BAT0") == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
Gtk::Box* modelBox = new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL);
|
Gtk::Box* modelBox = new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL);
|
||||||
box->add(*modelBox);
|
box->add(*modelBox);
|
||||||
|
@ -77,6 +79,7 @@ uint UPowerTooltip::updateTooltip(Devices& devices) {
|
||||||
modelBox->add(*deviceIcon);
|
modelBox->add(*deviceIcon);
|
||||||
|
|
||||||
// Set model
|
// Set model
|
||||||
|
if (model == NULL) model = (gchar*)"";
|
||||||
Gtk::Label* modelLabel = new Gtk::Label(model);
|
Gtk::Label* modelLabel = new Gtk::Label(model);
|
||||||
modelBox->add(*modelLabel);
|
modelBox->add(*modelLabel);
|
||||||
|
|
||||||
|
@ -86,7 +89,7 @@ uint UPowerTooltip::updateTooltip(Devices& devices) {
|
||||||
// Set icon
|
// Set icon
|
||||||
Gtk::Image* icon = new Gtk::Image();
|
Gtk::Image* icon = new Gtk::Image();
|
||||||
icon->set_pixel_size(iconSize);
|
icon->set_pixel_size(iconSize);
|
||||||
if (!Gtk::IconTheme::get_default()->has_icon(icon_name)) {
|
if (icon_name == NULL || !Gtk::IconTheme::get_default()->has_icon(icon_name)) {
|
||||||
icon_name = (char*)"battery-missing-symbolic";
|
icon_name = (char*)"battery-missing-symbolic";
|
||||||
}
|
}
|
||||||
icon->set_from_icon_name(icon_name, Gtk::ICON_SIZE_INVALID);
|
icon->set_from_icon_name(icon_name, Gtk::ICON_SIZE_INVALID);
|
||||||
|
|
Loading…
Reference in New Issue