testsAndMisc/linux_configuration/i3-configuration/i3blocks/bluetooth.sh

73 lines
1.5 KiB
Bash
Executable File

#!/bin/bash
# i3blocks bluetooth indicator.
set -euo pipefail
SCRIPT_DIR=${BASH_SOURCE[0]%/*}
[[ $SCRIPT_DIR == "${BASH_SOURCE[0]}" ]] && SCRIPT_DIR='.'
# shellcheck source=linux_configuration/i3-configuration/i3blocks/persist_common.sh
source "$SCRIPT_DIR/persist_common.sh"
get_bluetooth_info() {
local info
info=$(bluetoothctl info 2> /dev/null) || info=''
printf '%s\n' "$info"
}
emit() {
local bluetooth_info connected device line state_key
bluetooth_info=$(get_bluetooth_info)
connected='no'
device=''
while IFS= read -r line; do
case $line in
*'Connected: yes')
connected='yes'
;;
*'Alias: '*)
device=${line#*Alias: }
;;
esac
done <<< "$bluetooth_info"
state_key="$connected|$device"
if ! i3blocks_update_if_changed_key "bluetooth_state" "$state_key"; then
return 0
fi
if [[ $connected == yes && -n $device ]]; then
echo "$device"
echo
echo "#50FA7B"
else
echo " Disconnected"
fi
}
is_persist_mode() {
[[ ${BLOCK_INTERVAL:-} == "persist" ]]
}
emit_throttled() {
if ! i3blocks_should_emit_by_interval_key "bluetooth_emit" "$EMIT_MIN_INTERVAL_S"; then
return 0
fi
emit
}
EMIT_MIN_INTERVAL_S=2
emit
if is_persist_mode; then
# React to BlueZ D-Bus signals instead of polling.
if command -v dbus-monitor > /dev/null 2>&1; then
dbus-monitor --system "type='signal',sender='org.bluez'" 2> /dev/null |
while read -r line; do
[[ $line == *"PropertiesChanged"* ]] || continue
emit_throttled
done
fi
fi