From 794610a1cacae050ac809dcc4338c6bc9913f3fa Mon Sep 17 00:00:00 2001 From: Daan Goossens Date: Wed, 4 May 2022 18:27:29 +0200 Subject: [PATCH] feat: display all connected devices in tooltip --- include/modules/bluetooth.hpp | 1 + man/waybar-bluetooth.5.scd | 41 ++++++++++++++++++++++++----------- src/modules/bluetooth.cpp | 30 +++++++++++++++++++++++-- 3 files changed, 57 insertions(+), 15 deletions(-) diff --git a/include/modules/bluetooth.hpp b/include/modules/bluetooth.hpp index 0e7bbf3..6be2e78 100644 --- a/include/modules/bluetooth.hpp +++ b/include/modules/bluetooth.hpp @@ -70,6 +70,7 @@ class Bluetooth : public ALabel { AdapterInfo cur_adapter_; std::vector connected_devices_; DeviceInfo cur_focussed_device_; + std::string device_enumerate_; std::vector device_preference_; }; diff --git a/man/waybar-bluetooth.5.scd b/man/waybar-bluetooth.5.scd index 71faaf8..186207d 100644 --- a/man/waybar-bluetooth.5.scd +++ b/man/waybar-bluetooth.5.scd @@ -114,6 +114,15 @@ Addressed by *bluetooth* typeof: string ++ This format is used when the selected connected device, defined by the config option *format-device-preference*, provides is battery percentage. This needs the experimental features of bluez to be enabled to work. +*tooltip-format-enumerate-connected*: ++ + typeof: string ++ + This format is used to define how each connected device should be displayed within the *device_enumerate* format replacement in the tooltip menu. + +*tooltip-format-enumerate-connected-battery*: ++ + typeof: string ++ + This format is used to define how each connected device with a battery should be displayed within the *device_enumerate* format replacement in the tooltip menu. When this config option is not defined, the *tooltip-format-enumerate-connected* format will be used also for the connected devices with a battery. + + # FORMAT REPLACEMENTS *{status}*: Status of the bluetooth device. @@ -134,25 +143,31 @@ Addressed by *bluetooth* *{device_battery_percentage}*: Battery percentage of the current selected device if available. Only use in the *format-connected-battery* and *tooltip-format-connected-battery*. -# EXAMPLES +*{device_enumerate}*: Show a list of all connected devices in the tooltip, each on a seperate line. Only applicable in the *connected* state. Define the format of each device with the *tooltip-format-enumerate-connected* or/and *tooltip-format-enumerate-connected-battery* config options. -``` -"bluetooth": { - "format": " {status}", - "format-connected": " {device_alias}", - "format-connected-battery": " {device_battery_percentage}%", - "tooltip-format": "{adapter_alias} {adapter_address}" -} -``` +# EXAMPLES ``` "bluetooth": { // "adapter-alias": "adapter1", // specify the adapter alias (name) if there are more than 1 on the system "format": " {status}", - "format-connected": " {num_connections} connected", - // TODO: make it so that it shows all connected devices in the tooltip - // "tooltip-format-connected": "{device_alias}", - // "tooltip-format-connected-battery": "{device_alias} {device_battery_percentage}%", + "format-connected": " {num_connections} connected", + "tooltip-format": "{adapter_alias}\t{adapter_address}", + "tooltip-format-connected": "{adapter_alias}\t{adapter_address}\n\n{device_enumerate}", + "tooltip-format-enumerate-connected": "{device_alias}\t{device_address}", + "tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\t{device_battery_percentage}%" +} +``` + +``` +"bluetooth": { + "format": " {status}", + "format-connected": " {device_alias}", + "format-connected-battery": " {device_alias} {device_battery_percentage}%", + // "format-device-preference": [ "alias1", "alias2" ], // preference list deciding which device to show in format-connected format-connected-battery + "tooltip-format": "{adapter_alias}\t{adapter_address}\n\n{num_connections} connected\n\n{device_enumerate}", + "tooltip-format-enumerate-connected": "{device_alias}\t{device_address}", + "tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\t{device_battery_percentage}%" } ``` diff --git a/src/modules/bluetooth.cpp b/src/modules/bluetooth.cpp index 8981083..b0be971 100644 --- a/src/modules/bluetooth.cpp +++ b/src/modules/bluetooth.cpp @@ -1,6 +1,7 @@ #include "modules/bluetooth.hpp" #include +#include #include #include @@ -199,8 +200,32 @@ auto waybar::modules::Bluetooth::update() -> void { fmt::arg("device_battery_percentage", cur_focussed_device_.battery_percentage.value_or(0)) )); - // TODO: make possible to show information about all connected devices in the tooltip if (tooltipEnabled()) { + bool tooltip_enumerate_connections_ = config_["tooltip-format-enumerate-connected"].isString(); + bool tooltip_enumerate_connections_battery_ = config_["tooltip-format-enumerate-connected-battery"].isString(); + if (tooltip_enumerate_connections_ || tooltip_enumerate_connections_battery_) { + std::stringstream ss; + for (DeviceInfo dev : connected_devices_) { + if (tooltip_enumerate_connections_battery_ && dev.battery_percentage.has_value()) { + ss << "\n"; + ss << fmt::format(config_["tooltip-format-enumerate-connected-battery"].asString(), + fmt::arg("device_address", dev.address), + fmt::arg("device_address_type", dev.address_type), + fmt::arg("device_alias", dev.alias), + fmt::arg("device_battery_percentage", dev.battery_percentage.value_or(0))); + } else if (tooltip_enumerate_connections_) { + ss << "\n"; + ss << fmt::format(config_["tooltip-format-enumerate-connected"].asString(), + fmt::arg("device_address", dev.address), + fmt::arg("device_address_type", dev.address_type), + fmt::arg("device_alias", dev.alias)); + } + } + device_enumerate_ = ss.str(); + if (!device_enumerate_.empty()) { + device_enumerate_.erase(0, 1); + } + } label_.set_tooltip_text(fmt::format(tooltip_format, fmt::arg("status", state_), fmt::arg("num_connections", connected_devices_.size()), @@ -210,7 +235,8 @@ auto waybar::modules::Bluetooth::update() -> void { fmt::arg("device_address", cur_focussed_device_.address), fmt::arg("device_address_type", cur_focussed_device_.address_type), fmt::arg("device_alias", cur_focussed_device_.alias), - fmt::arg("device_battery_percentage", cur_focussed_device_.battery_percentage.value_or(0)) + fmt::arg("device_battery_percentage", cur_focussed_device_.battery_percentage.value_or(0)), + fmt::arg("device_enumerate", device_enumerate_) )); }