mirror of
				https://github.com/rad4day/Waybar.git
				synced 2025-11-03 17:22:43 +01:00 
			
		
		
		
	Added all callbacks
This commit is contained in:
		
							
								
								
									
										126
									
								
								src/modules/upower/upower.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								src/modules/upower/upower.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,126 @@
 | 
			
		||||
#include "modules/upower/upower.hpp"
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <map>
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
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<UPower*>(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<UPower*>(data);
 | 
			
		||||
  up->removeDevice(object_path);
 | 
			
		||||
  up->setDisplayDevice();
 | 
			
		||||
  // Update the widget
 | 
			
		||||
  up->dp.emit();
 | 
			
		||||
}
 | 
			
		||||
void UPower::deviceNotify_cb(gpointer data) {
 | 
			
		||||
  UPower* up = static_cast<UPower*>(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
 | 
			
		||||
		Reference in New Issue
	
	Block a user