feat: add bluetooth to waybar and fix battery max loading
This commit is contained in:
parent
0801cb17aa
commit
539cb58493
5 changed files with 130 additions and 2 deletions
106
hosts/nb/modules/bluetooth-waybar.nix
Normal file
106
hosts/nb/modules/bluetooth-waybar.nix
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
{ pkgs, ... }:
|
||||
let
|
||||
waybar-bluetooth = pkgs.writeShellScriptBin "waybar-bluetooth" ''
|
||||
powered=$(${pkgs.bluez}/bin/bluetoothctl show | ${pkgs.gnugrep}/bin/grep "Powered:" | ${pkgs.gawk}/bin/awk '{print $2}')
|
||||
if [ "$powered" = "yes" ]; then
|
||||
connected_device=$(${pkgs.bluez}/bin/bluetoothctl devices Connected | head -1 | cut -d' ' -f3-)
|
||||
if [ -n "$connected_device" ]; then
|
||||
icon=""
|
||||
text="$icon $connected_device"
|
||||
class="connected"
|
||||
tooltip="Connected: $connected_device"
|
||||
else
|
||||
icon=""
|
||||
text="$icon"
|
||||
class="on"
|
||||
tooltip="Bluetooth on (no device connected)"
|
||||
fi
|
||||
else
|
||||
icon=""
|
||||
text="$icon"
|
||||
class="off"
|
||||
tooltip="Bluetooth off"
|
||||
fi
|
||||
|
||||
${pkgs.jq}/bin/jq -cn \
|
||||
--arg text "$text" \
|
||||
--arg tooltip "$tooltip" \
|
||||
--arg class "$class" \
|
||||
'{text: $text, tooltip: $tooltip, class: $class}'
|
||||
'';
|
||||
|
||||
bluetooth-toggle = pkgs.writeShellScriptBin "bluetooth-toggle" ''
|
||||
powered=$(${pkgs.bluez}/bin/bluetoothctl show | ${pkgs.gnugrep}/bin/grep "Powered:" | ${pkgs.gawk}/bin/awk '{print $2}')
|
||||
if [ "$powered" = "yes" ]; then
|
||||
${pkgs.bluez}/bin/bluetoothctl power off
|
||||
${pkgs.util-linux}/bin/rfkill block bluetooth
|
||||
else
|
||||
${pkgs.util-linux}/bin/rfkill unblock bluetooth
|
||||
sleep 0.5
|
||||
${pkgs.bluez}/bin/bluetoothctl power on
|
||||
fi
|
||||
'';
|
||||
|
||||
bluetooth-connect-menu = pkgs.writeShellScriptBin "bluetooth-connect-menu" ''
|
||||
# Power on bluetooth if off
|
||||
powered=$(${pkgs.bluez}/bin/bluetoothctl show | ${pkgs.gnugrep}/bin/grep "Powered:" | ${pkgs.gawk}/bin/awk '{print $2}')
|
||||
if [ "$powered" != "yes" ]; then
|
||||
${pkgs.util-linux}/bin/rfkill unblock bluetooth
|
||||
sleep 0.5
|
||||
${pkgs.bluez}/bin/bluetoothctl power on
|
||||
sleep 1
|
||||
fi
|
||||
|
||||
# Build list of paired devices with connection status
|
||||
devices=""
|
||||
while IFS= read -r line; do
|
||||
mac=$(echo "$line" | ${pkgs.gawk}/bin/awk '{print $2}')
|
||||
name=$(echo "$line" | cut -d' ' -f3-)
|
||||
[ -z "$mac" ] && continue
|
||||
|
||||
# Check if connected
|
||||
info=$(${pkgs.bluez}/bin/bluetoothctl info "$mac" 2>/dev/null)
|
||||
connected=$(echo "$info" | ${pkgs.gnugrep}/bin/grep "Connected:" | ${pkgs.gawk}/bin/awk '{print $2}')
|
||||
if [ "$connected" = "yes" ]; then
|
||||
devices="''${devices}[connected] $name\n"
|
||||
else
|
||||
devices="''${devices}$name\n"
|
||||
fi
|
||||
done < <(${pkgs.bluez}/bin/bluetoothctl devices Paired)
|
||||
|
||||
devices="''${devices}Open Bluetooth Manager"
|
||||
|
||||
# Show fzf menu
|
||||
choice=$(printf "%b" "$devices" | ${pkgs.fzf}/bin/fzf --prompt="Bluetooth > " --reverse --no-info)
|
||||
[ -z "$choice" ] && exit 0
|
||||
|
||||
if [ "$choice" = "Open Bluetooth Manager" ]; then
|
||||
${pkgs.blueman}/bin/blueman-manager &
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Extract device name (strip [connected] prefix if present)
|
||||
device_name="''${choice#\[connected\] }"
|
||||
|
||||
# Find MAC address for the device
|
||||
mac=$(${pkgs.bluez}/bin/bluetoothctl devices Paired | ${pkgs.gnugrep}/bin/grep "$device_name" | ${pkgs.gawk}/bin/awk '{print $2}')
|
||||
[ -z "$mac" ] && exit 1
|
||||
|
||||
if [[ "$choice" == \[connected\]* ]]; then
|
||||
echo "Disconnecting $device_name..."
|
||||
${pkgs.bluez}/bin/bluetoothctl disconnect "$mac"
|
||||
else
|
||||
echo "Connecting to $device_name..."
|
||||
${pkgs.bluez}/bin/bluetoothctl connect "$mac"
|
||||
fi
|
||||
|
||||
sleep 1
|
||||
'';
|
||||
in
|
||||
{
|
||||
environment.systemPackages = [
|
||||
waybar-bluetooth
|
||||
bluetooth-toggle
|
||||
bluetooth-connect-menu
|
||||
];
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue