134 lines
3.6 KiB
Bash
Executable File
134 lines
3.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
notify() {
|
|
notify-send " Bluetooth" "$1"
|
|
}
|
|
|
|
require_bluetoothctl() {
|
|
if ! command -v bluetoothctl >/dev/null 2>&1; then
|
|
notify "bluetoothctl ist nicht installiert."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
wofi_pick() {
|
|
wofi --dmenu --prompt "$1" --insensitive
|
|
}
|
|
|
|
adapter_powered() {
|
|
{ bluetoothctl show 2>/dev/null || true; } | awk -F': ' '/Powered/ {print $2; exit}'
|
|
}
|
|
|
|
device_name() {
|
|
local mac="$1"
|
|
bluetoothctl info "$mac" 2>/dev/null | awk -F': ' '/Name/ {print $2; exit}'
|
|
}
|
|
|
|
pick_device() {
|
|
local prompt="$1"
|
|
bluetoothctl devices |
|
|
awk '{mac=$2; $1=""; $2=""; sub(/^ */, ""); printf " %s [%s]\n", $0, mac}' |
|
|
wofi_pick "$prompt"
|
|
}
|
|
|
|
selected_mac() {
|
|
sed -n 's/.*\[\([0-9A-Fa-f:]\{17\}\)\].*/\1/p'
|
|
}
|
|
|
|
scan_devices() {
|
|
notify "Scan laeuft fuer 8 Sekunden."
|
|
timeout 8 bluetoothctl scan on >/dev/null 2>&1 || true
|
|
bluetoothctl scan off >/dev/null 2>&1 || true
|
|
|
|
local selection mac name
|
|
selection="$(pick_device " Geraet verbinden")"
|
|
[ -n "$selection" ] || exit 0
|
|
mac="$(printf '%s\n' "$selection" | selected_mac)"
|
|
name="$(device_name "$mac")"
|
|
[ -n "$name" ] || name="$mac"
|
|
|
|
bluetoothctl pair "$mac" >/dev/null 2>&1 || true
|
|
bluetoothctl trust "$mac" >/dev/null 2>&1 || true
|
|
bluetoothctl connect "$mac" && notify "Verbunden mit $name."
|
|
}
|
|
|
|
connect_saved_device() {
|
|
local selection mac name
|
|
selection="$(pick_device " Gekoppeltes Geraet verbinden")"
|
|
[ -n "$selection" ] || exit 0
|
|
mac="$(printf '%s\n' "$selection" | selected_mac)"
|
|
name="$(device_name "$mac")"
|
|
[ -n "$name" ] || name="$mac"
|
|
bluetoothctl connect "$mac" && notify "Verbunden mit $name."
|
|
}
|
|
|
|
disconnect_device() {
|
|
local selection mac name
|
|
selection="$(
|
|
bluetoothctl devices Connected |
|
|
awk '{mac=$2; $1=""; $2=""; sub(/^ */, ""); printf " %s [%s]\n", $0, mac}' |
|
|
wofi_pick " Bluetooth trennen"
|
|
)"
|
|
|
|
[ -n "$selection" ] || exit 0
|
|
mac="$(printf '%s\n' "$selection" | selected_mac)"
|
|
name="$(device_name "$mac")"
|
|
[ -n "$name" ] || name="$mac"
|
|
bluetoothctl disconnect "$mac" && notify "$name getrennt."
|
|
}
|
|
|
|
remove_device() {
|
|
local selection mac name
|
|
selection="$(pick_device " Geraet entfernen")"
|
|
[ -n "$selection" ] || exit 0
|
|
mac="$(printf '%s\n' "$selection" | selected_mac)"
|
|
name="$(device_name "$mac")"
|
|
[ -n "$name" ] || name="$mac"
|
|
bluetoothctl remove "$mac" && notify "$name entfernt."
|
|
}
|
|
|
|
require_bluetoothctl
|
|
|
|
power="$(adapter_powered)"
|
|
[ -n "$power" ] || power="unknown"
|
|
|
|
choice="$(
|
|
printf '%s\n' \
|
|
" Geraet suchen und verbinden" \
|
|
" Bluetooth ein/aus" \
|
|
" Gekoppelte Geraete" \
|
|
" Verbundenes Geraet trennen" \
|
|
" Geraet entfernen" \
|
|
" Status: $power" |
|
|
wofi_pick " Bluetooth"
|
|
)"
|
|
|
|
case "$choice" in
|
|
*"Geraet suchen"*)
|
|
bluetoothctl power on >/dev/null
|
|
bluetoothctl agent on >/dev/null 2>&1 || true
|
|
bluetoothctl default-agent >/dev/null 2>&1 || true
|
|
scan_devices
|
|
;;
|
|
*"Bluetooth ein/aus"*)
|
|
if [ "$power" = "yes" ]; then
|
|
bluetoothctl power off && notify "Bluetooth ausgeschaltet."
|
|
else
|
|
bluetoothctl power on && notify "Bluetooth eingeschaltet."
|
|
fi
|
|
;;
|
|
*"Gekoppelte Geraete"*)
|
|
connect_saved_device
|
|
;;
|
|
*"Verbundenes Geraet trennen"*)
|
|
disconnect_device
|
|
;;
|
|
*"Geraet entfernen"*)
|
|
remove_device
|
|
;;
|
|
*"Status:"*)
|
|
bluetoothctl show | wofi --dmenu --prompt " Bluetoothstatus"
|
|
;;
|
|
esac
|