2020-01-21 16:04:54 +00:00
|
|
|
#pragma once
|
|
|
|
|
2022-11-24 11:28:52 +00:00
|
|
|
#include "ALabel.hpp"
|
2022-05-02 16:11:21 +00:00
|
|
|
#ifdef WANT_RFKILL
|
2020-01-23 16:17:29 +00:00
|
|
|
#include "util/rfkill.hpp"
|
2022-05-02 16:11:21 +00:00
|
|
|
#endif
|
2020-01-22 10:37:47 +00:00
|
|
|
|
2020-01-21 16:04:54 +00:00
|
|
|
namespace waybar::modules {
|
|
|
|
|
2022-11-24 11:28:52 +00:00
|
|
|
class Bluetooth : public ALabel {
|
2022-05-06 15:01:43 +00:00
|
|
|
struct ControllerInfo {
|
2022-05-02 16:11:21 +00:00
|
|
|
std::string path;
|
|
|
|
std::string address;
|
|
|
|
std::string address_type;
|
|
|
|
// std::string name; // just use alias instead
|
|
|
|
std::string alias;
|
|
|
|
bool powered;
|
|
|
|
bool discoverable;
|
|
|
|
bool pairable;
|
|
|
|
bool discovering;
|
|
|
|
};
|
|
|
|
|
|
|
|
// NOTE: there are some properties that not all devices provide
|
2022-05-06 15:01:43 +00:00
|
|
|
struct DeviceInfo {
|
2022-05-02 16:11:21 +00:00
|
|
|
std::string path;
|
2022-05-05 22:38:04 +00:00
|
|
|
std::string paired_controller;
|
2022-05-02 16:11:21 +00:00
|
|
|
std::string address;
|
|
|
|
std::string address_type;
|
|
|
|
// std::optional<std::string> name; // just use alias instead
|
|
|
|
std::string alias;
|
|
|
|
std::optional<std::string> icon;
|
|
|
|
bool paired;
|
|
|
|
bool trusted;
|
|
|
|
bool blocked;
|
|
|
|
bool connected;
|
|
|
|
bool services_resolved;
|
2022-05-06 14:17:11 +00:00
|
|
|
// NOTE: experimental feature in bluez
|
2022-05-02 16:11:21 +00:00
|
|
|
std::optional<unsigned char> battery_percentage;
|
|
|
|
};
|
|
|
|
|
2020-01-21 16:04:54 +00:00
|
|
|
public:
|
|
|
|
Bluetooth(const std::string&, const Json::Value&);
|
2023-03-02 13:57:07 +00:00
|
|
|
virtual ~Bluetooth() = default;
|
|
|
|
auto update() -> void override;
|
2020-01-21 16:04:54 +00:00
|
|
|
|
|
|
|
private:
|
2022-05-06 15:01:43 +00:00
|
|
|
static auto onInterfaceAddedOrRemoved(GDBusObjectManager*, GDBusObject*, GDBusInterface*,
|
|
|
|
gpointer) -> void;
|
|
|
|
static auto onInterfaceProxyPropertiesChanged(GDBusObjectManagerClient*, GDBusObjectProxy*,
|
|
|
|
GDBusProxy*, GVariant*, const gchar* const*,
|
|
|
|
gpointer) -> void;
|
2022-05-02 16:11:21 +00:00
|
|
|
|
|
|
|
auto getDeviceBatteryPercentage(GDBusObject*) -> std::optional<unsigned char>;
|
|
|
|
auto getDeviceProperties(GDBusObject*, DeviceInfo&) -> bool;
|
2022-05-05 22:38:04 +00:00
|
|
|
auto getControllerProperties(GDBusObject*, ControllerInfo&) -> bool;
|
2022-05-02 16:11:21 +00:00
|
|
|
|
2023-08-16 13:34:06 +00:00
|
|
|
// Returns std::nullopt if no controller could be found
|
|
|
|
auto findCurController() -> std::optional<ControllerInfo>;
|
2022-05-02 16:11:21 +00:00
|
|
|
auto findConnectedDevices(const std::string&, std::vector<DeviceInfo>&) -> void;
|
|
|
|
|
|
|
|
#ifdef WANT_RFKILL
|
2021-02-03 04:10:27 +00:00
|
|
|
util::Rfkill rfkill_;
|
2022-05-02 16:11:21 +00:00
|
|
|
#endif
|
|
|
|
const std::unique_ptr<GDBusObjectManager, void (*)(GDBusObjectManager*)> manager_;
|
|
|
|
|
|
|
|
std::string state_;
|
2023-08-16 13:34:06 +00:00
|
|
|
std::optional<ControllerInfo> cur_controller_;
|
2022-05-02 16:11:21 +00:00
|
|
|
std::vector<DeviceInfo> connected_devices_;
|
|
|
|
DeviceInfo cur_focussed_device_;
|
2022-05-04 16:27:29 +00:00
|
|
|
std::string device_enumerate_;
|
2022-05-02 16:11:21 +00:00
|
|
|
|
|
|
|
std::vector<std::string> device_preference_;
|
2020-01-21 16:04:54 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace waybar::modules
|