#include "modules/upower/upower.hpp" #include #include #include namespace waybar::modules { UPower::UPower(const std::string& id, const Json::Value& config) : AModule(config, "tray", id), box_(Gtk::ORIENTATION_HORIZONTAL, 0), icon_(), label_(), devices() { box_.pack_start(icon_); box_.pack_start(label_); event_box_.add(box_); GError* error = NULL; client = up_client_new_full(NULL, &error); if (client == NULL) { throw std::runtime_error("Unable to create UPower client!"); } g_signal_connect(client, "device-added", G_CALLBACK(deviceAdded_cb), this); g_signal_connect(client, "device-removed", G_CALLBACK(deviceRemoved_cb), this); g_signal_connect(client, "notify", G_CALLBACK(deviceNotify_cb), this); resetDevices(); dp.emit(); } UPower::~UPower() {} void UPower::clicked() { printf("CLICK\n"); } void UPower::deviceAdded_cb(UpClient* client, UpDevice* device, gpointer data) { UPower* up = static_cast(data); up->addDevice(device); up->setDisplayDevice(); // Update the widget up->dp.emit(); } void UPower::deviceRemoved_cb(UpClient* client, const gchar* object_path, gpointer data) { UPower* up = static_cast(data); up->removeDevice(object_path); up->setDisplayDevice(); // Update the widget up->dp.emit(); } void UPower::deviceNotify_cb(gpointer data) { UPower* up = static_cast(data); // Update the widget up->dp.emit(); } void UPower::removeDevice(const std::string devicePath) { devices.erase(devicePath); } void UPower::addDevice(UpDevice* device) { if (device) { const gchar* objectPath = up_device_get_object_path(device); devices[objectPath] = device; g_signal_connect(devices[objectPath], "notify", G_CALLBACK(deviceNotify_cb), this); } } void UPower::setDisplayDevice() { displayDevice = up_client_get_display_device(client); g_signal_connect(displayDevice, "notify", G_CALLBACK(deviceNotify_cb), this); } /** Removes all devices and adds the current devices */ void UPower::resetDevices() { // Removes all devices if (devices.size() > 0) { auto it = devices.cbegin(); while (it != devices.cend()) { devices.erase(it++); } } // Adds all devices GPtrArray* newDevices = up_client_get_devices2(client); for (guint i = 0; i < newDevices->len; i++) { UpDevice* device = (UpDevice*)g_ptr_array_index(newDevices, i); if (device) addDevice(device); } setDisplayDevice(); // Update the widget dp.emit(); } auto UPower::update() -> void { printf("UPDATE!\n"); UpDeviceKind kind; UpDeviceState state; double percentage; gboolean is_power_supply; gboolean is_present; gchar* icon_name; g_object_get(displayDevice, "kind", &kind, "state", &state, "is-present", &is_present, "power-supply", &is_power_supply, "percentage", &percentage, "icon-name", &icon_name, NULL); printf("ICON: %s\n", icon_name); // Call parent update AModule::update(); } } // namespace waybar::modules