diff --git a/bt b/bt index 6e2cadd..b3ba1cd 100755 --- a/bt +++ b/bt @@ -4,17 +4,14 @@ SCAN_PERIOD=5 #locations of blacklist and hard coded list of paired devices (watch out, need to modify Makefile as well if you want to change these values and still use make install) BLACKLIST=${XDG_DATA_HOME:-$HOME/.local/share}/bt/blacklist PAIRLIST=${XDG_DATA_HOME:-$HOME/.local/share}/bt/paired -AUTOTRUST=true -actions="turn off -turn on -pair + +actions="pair +disconnect unpair" -if ! $AUTOTRUST; then - actions+=" -trust" -fi - +#get power state of bluetooth controller +powerstatus="$( bluetoothctl show | grep Powered | awk '{print $2}' )" +scanstatus="$( bluetoothctl show | grep Discovering | awk '{print $2}' )" #Checks for necessary programs to be present. Very unlikely not to be present but let's just err on the safer side. for prog in dmenu bluetoothctl awk cat date nl; do @@ -24,9 +21,20 @@ for prog in dmenu bluetoothctl awk cat date nl; do fi done -#start scanning as early as possible to speed up pairing process: -bluetoothctl power on & bluetoothctl scan on &>/dev/null & -start_scan="$( date +'%s' )" +poweron(){ + [ "$powerstatus" = "no" ] && bluetoothctl power on +} +scanon(){ + if [ "$scanstatus" = "no" ]; then + bluetoothctl scan on & + start_scan="$( date +'%s' )" +fi +} + +#start scanning as early as possible to speed up pairing process +#=> maybe use an option to do this? Otherwise ever invocation of bt powers on the controller. +poweron +scanon #Compile list of all Bluetooth IDS of paired devices (from bluetoothctl and from hardcoded list) bt_IDS="$( ( bluetoothctl paired-devices && cat "$PAIRLIST" ) | sort -u | awk '{print $2}' )" @@ -35,10 +43,14 @@ bt_IDS="$( ( bluetoothctl paired-devices && cat "$PAIRLIST" ) | sort -u | awk '{ paired_devices="$( ( bluetoothctl paired-devices && cat "$PAIRLIST" ) | sort -u | awk '{for (i=3; i/dev/null & - bluetoothctl scan on &>/dev/null & + #bluetoothctl power on &>/dev/null & + #bluetoothctl scan on &>/dev/null & #check whether $SCAN_PERIOD seconds has already passed since starting scanning, if not, wait for the rest of that time. if [ $((( "$(date +'%s')" - "$start_scan" ))) -lt $SCAN_PERIOD ]; then sleep_period="$((( "$SCAN_PERIOD" - "$( date +'%s')" + "$start_scan" )))" @@ -60,10 +72,15 @@ pair(){ sleep "$sleep_period" fi - echo "$paired_devices" > /tmp/paired_devices - new_devices="$( bluetoothctl devices | awk '{for (i=3; i /tmp/paired_devices + new_devices="$( bluetoothctl devices | awk '{for (i=3; i> "$PAIRLIST" fi fi - cleanup } case $choice in - "turn on") bluetoothctl power on - cleanup;; - "turn off") bluetoothctl power off - cleanup;; + "turn on") bluetoothctl power on;; + "turn off") bluetoothctl power off;; "scan on") bluetoothctl power on && echo power on && sleep 2 - ([ -n "$TERMINAL" ] && $TERMINAL -e bluetoothctl scan on ) || st bluetoothctl scan on - cleanup;; + ([ -n "$TERMINAL" ] && $TERMINAL -e bluetoothctl scan on ) || st bluetoothctl scan on;; "pair") pair;; "unpair") choice=$( echo "$paired_devices" | dmenu -l 10 -i -p 'remove which paired device?') if [ -n "$choice" ]; then @@ -104,22 +119,25 @@ case $choice in #remove device to unpair from hard coded paired devices list new_paired_list="$( grep -v "$dev_id" "$PAIRLIST" )" echo "$new_paired_list" > "$PAIRLIST" - fi - cleanup;; + fi;; "trust") choice=$( echo "$paired_devices" | dmenu -l 10 -i -p 'remove which paired device?') if [ -n "$choice" ]; then dev_no=$( echo "$paired_devices" | nl | grep -P "[0-9]+\t$choice$" | awk '{print $1}') dev_id=$( echo "$bt_IDS" | nl | grep -P "^.*$dev_no\t" | awk '{print $2}' ) bluetoothctl trust "$dev_id" - fi + fi;; + "disconnect") choice=$( echo "$paired_devices" | dmenu -l 10 -i -p 'remove which paired device?') + if [ -n "$choice" ]; then + dev_no=$( echo "$paired_devices" | nl | grep -P "[0-9]+\t$choice$" | awk '{print $1}') + dev_id=$( echo "$bt_IDS" | nl | grep -P "^.*$dev_no\t" | awk '{print $2}' ) + bluetoothctl disconnect "$dev_id" + fi;; + "*") + dev_no=$( echo "$paired_devices" | nl | grep -P "[0-9]+\t$choice$" | awk '{print $1}') + dev_id=$( echo "$bt_IDS" | nl | grep -P "^.*$dev_no\t" | awk '{print $2}') + bluetoothctl power on + bluetoothctl pair "$dev_id" + bluetoothctl connect "$dev_id";; esac -if [ -n "$choice" ]; then - dev_no=$( echo "$paired_devices" | nl | grep -P "[0-9]+\t$choice$" | awk '{print $1}') - dev_id=$( echo "$bt_IDS" | nl | grep -P "^.*$dev_no\t" | awk '{print $2}') - bluetoothctl power on - bluetoothctl pair "$dev_id" - bluetoothctl connect "$dev_id" -fi - cleanup