95 lines
2.8 KiB
C++
95 lines
2.8 KiB
C++
#pragma once
|
|
|
|
#include <giomm/dbusconnection.h>
|
|
#include <gtkmm/icontheme.h>
|
|
#include <libupower-glib/upower.h>
|
|
|
|
#include <unordered_map>
|
|
|
|
#include "AIconLabel.hpp"
|
|
|
|
namespace waybar::modules {
|
|
|
|
class UPower final : public AIconLabel {
|
|
public:
|
|
UPower(const std::string &, const Json::Value &);
|
|
virtual ~UPower();
|
|
auto update() -> void override;
|
|
|
|
private:
|
|
const std::string NO_BATTERY{"battery-missing-symbolic"};
|
|
|
|
// Config
|
|
bool showIcon_{true};
|
|
bool hideIfEmpty_{true};
|
|
int iconSize_{20};
|
|
int tooltip_spacing_{4};
|
|
int tooltip_padding_{4};
|
|
Gtk::Box contentBox_; // tooltip box
|
|
std::string tooltipFormat_;
|
|
|
|
// UPower device info
|
|
struct upDevice_output {
|
|
UpDevice *upDevice{NULL};
|
|
double percentage{0.0};
|
|
double temperature{0.0};
|
|
guint64 time_full{0u};
|
|
guint64 time_empty{0u};
|
|
gchar *icon_name{(char *)'\0'};
|
|
bool upDeviceValid{false};
|
|
UpDeviceState state;
|
|
UpDeviceKind kind;
|
|
char *nativePath{(char *)'\0'};
|
|
char *model{(char *)'\0'};
|
|
};
|
|
|
|
// Technical variables
|
|
std::string nativePath_;
|
|
std::string model_;
|
|
std::string lastStatus_;
|
|
Glib::ustring label_markup_;
|
|
std::mutex mutex_;
|
|
Glib::RefPtr<Gtk::IconTheme> gtkTheme_;
|
|
bool sleeping_;
|
|
|
|
// Technical functions
|
|
void addDevice(UpDevice *);
|
|
void removeDevice(const gchar *);
|
|
void removeDevices();
|
|
void resetDevices();
|
|
void setDisplayDevice();
|
|
const Glib::ustring getText(const upDevice_output &upDevice_, const std::string &format);
|
|
bool queryTooltipCb(int, int, bool, const Glib::RefPtr<Gtk::Tooltip> &);
|
|
|
|
// DBUS variables
|
|
guint watcherID_;
|
|
Glib::RefPtr<Gio::DBus::Connection> conn_;
|
|
guint subscrID_{0u};
|
|
|
|
// UPower variables
|
|
UpClient *upClient_;
|
|
upDevice_output upDevice_; // Device to display
|
|
typedef std::unordered_map<std::string, upDevice_output> Devices;
|
|
Devices devices_;
|
|
bool upRunning_{true};
|
|
|
|
// DBus callbacks
|
|
void getConn_cb(Glib::RefPtr<Gio::AsyncResult> &result);
|
|
void onAppear(const Glib::RefPtr<Gio::DBus::Connection> &, const Glib::ustring &,
|
|
const Glib::ustring &);
|
|
void onVanished(const Glib::RefPtr<Gio::DBus::Connection> &, const Glib::ustring &);
|
|
void prepareForSleep_cb(const Glib::RefPtr<Gio::DBus::Connection> &connection,
|
|
const Glib::ustring &sender_name, const Glib::ustring &object_path,
|
|
const Glib::ustring &interface_name, const Glib::ustring &signal_name,
|
|
const Glib::VariantContainerBase ¶meters);
|
|
|
|
// UPower callbacks
|
|
static void deviceAdded_cb(UpClient *client, UpDevice *device, gpointer data);
|
|
static void deviceRemoved_cb(UpClient *client, const gchar *objectPath, gpointer data);
|
|
static void deviceNotify_cb(UpDevice *device, GParamSpec *pspec, gpointer user_data);
|
|
// UPower secondary functions
|
|
void getUpDeviceInfo(upDevice_output &upDevice_);
|
|
};
|
|
|
|
} // namespace waybar::modules
|