104 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/bash
 | 
						|
#wait time to discover new devices in seconds
 | 
						|
SCAN_PERIOD=5
 | 
						|
BLACKLIST=${XDG_DATA_HOME:-$HOME/.local/share}/bt/blacklist
 | 
						|
PAIRLIST=${XDG_DATA_HOME:-$HOME/.local/share}/bt/paired
 | 
						|
actions="turn off\nturn on\npair\nunpair"
 | 
						|
 | 
						|
#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; do
 | 
						|
   if ! hash "$prog" 2>/dev/null; then
 | 
						|
      printf 'bthandler: %s: command not found\n' "$prog" >&2
 | 
						|
      exit 127
 | 
						|
   fi
 | 
						|
done
 | 
						|
 | 
						|
#Compile list of all Bluetooth IDS of paired devices (from bluetoothctl and from hardcoded list)
 | 
						|
bluetoothctl paired-devices | awk '{print $2}' > /tmp/bt_IDS
 | 
						|
cat "$PAIRLIST" | awk '{print $2}' >> /tmp/bt_IDS
 | 
						|
echo bt_IDS:
 | 
						|
cat /tmp/bt_IDS
 | 
						|
bt_IDS="$( cat /tmp/bt_IDS | sort -u )"
 | 
						|
[ -n "$bt_IDS" ] && echo "$bt_IDS" > /tmp/bt_IDS
 | 
						|
echo bt_IDS sorted:
 | 
						|
cat /tmp/bt_IDS
 | 
						|
 | 
						|
#Compile list of all device Names of paired devices (from bluetoothctl and from hardcoded list)
 | 
						|
bluetoothctl paired-devices | awk '{for (i=3; i<NF; i++) printf $i " "; print $NF}' > /tmp/paired_devices
 | 
						|
echo paired_devices:
 | 
						|
cat /tmp/paired_devices
 | 
						|
cat "$PAIRLIST" | awk '{for (i=3; i<NF; i++) printf $i " "; print $NF}' >> /tmp/paired_devices
 | 
						|
paired_devices="$( cat /tmp/paired_devices | sort -u )"
 | 
						|
[ -n "$paired_devices" ] && echo "$paired_devices" > /tmp/paired_devices
 | 
						|
echo paired_devices sorted:
 | 
						|
cat /tmp/paired_devices
 | 
						|
 | 
						|
 | 
						|
grep -vf "$BLACKLIST" /tmp/paired_devices > /tmp/disp_devices
 | 
						|
 | 
						|
#Don't print empty device list, removes unnecessary empty choice in dmenu
 | 
						|
len=$(cat /tmp/disp_devices | wc -l)
 | 
						|
echo len: $len
 | 
						|
[ $len -eq 0 ] && choice=$( printf "$actions" | dmenu -i -p 'What BT action would you like to perform:' )
 | 
						|
[ $len -gt 0 ] && choice=$( printf "$(< /tmp/disp_devices)\n$actions" | dmenu -i -p 'What BT action would you like to perform:' )
 | 
						|
 | 
						|
cleanup(){
 | 
						|
	rm -f /tmp/bt_devices
 | 
						|
	rm -f /tmp/bt_IDS
 | 
						|
	rm -f /tmp/paired_devices
 | 
						|
	rm -f /tmp/new_devices
 | 
						|
	rm -f /tmp/disp_devices
 | 
						|
	bluetoothctl scan off > /dev/null
 | 
						|
	exit 0
 | 
						|
}
 | 
						|
 | 
						|
case $choice in
 | 
						|
	"turn on") bluetoothctl power on
 | 
						|
		cleanup;;
 | 
						|
	"turn off") bluetoothctl power off
 | 
						|
		cleanup;;
 | 
						|
	"scan on") bluetoothctl power on && echo power on && sleep 2
 | 
						|
		[ -n $TERMINAL ] && ($TERMINAL -e bluetoothctl scan on ) || st bluetoothctl scan on
 | 
						|
		cleanup;;
 | 
						|
	"pair") bluetoothctl power on
 | 
						|
		bluetoothctl scan on & disown
 | 
						|
		notify-send "Bluetooth" "Searching for devices, please wait a bit"
 | 
						|
		sleep $SCAN_PERIOD
 | 
						|
		bluetoothctl devices | awk '{for (i=3; i<NF; i++) printf $i " "; print $NF}' > /tmp/bt_devices
 | 
						|
		grep -vf /tmp/paired_devices /tmp/bt_devices > /tmp/new_devices
 | 
						|
		choice=$( cat /tmp/new_devices | dmenu -l 10 -i -p 'pair with which device?' )
 | 
						|
		if [ -n "$choice" ]; then
 | 
						|
			bluetoothctl devices | awk '{print $2}' > /tmp/bt_IDS
 | 
						|
			dev_no=$(cat -n /tmp/bt_devices | grep "$choice" | awk '{print $1}')
 | 
						|
			dev_id=$(cat -n /tmp/bt_IDS | grep -E $dev_no"[[:space:]]" | awk '{print $2}' )
 | 
						|
 | 
						|
			bluetoothctl pair $dev_id && sleep 2
 | 
						|
			bluetoothctl connect $dev_id
 | 
						|
			#if device is not already hard coded as paired, add to paired devices list
 | 
						|
			echo grep: $( grep $dev_id "$PAIRLIST" )
 | 
						|
			if [ -z $( grep $dev_id "$PAIRLIST" ) ]; then
 | 
						|
				echo "Device $dev_id $choice" >> "$PAIRLIST"
 | 
						|
			fi
 | 
						|
		fi
 | 
						|
		cleanup;;
 | 
						|
	"unpair") choice=$( cat /tmp/paired_devices | dmenu -l 10 -i -p 'remove which paired device?')
 | 
						|
		if [ -n "choice" ]; then
 | 
						|
			dev_no=$(cat -n /tmp/paired_devices | grep "$choice" | awk '{print $1}')
 | 
						|
			dev_id=$(cat -n /tmp/bt_IDS | grep -E $dev_no"[[:space:]]" | awk '{print $2}' )
 | 
						|
			bluetoothctl remove $dev_id
 | 
						|
			#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;;
 | 
						|
esac
 | 
						|
 | 
						|
if [ -n "$choice" ]; then
 | 
						|
	dev_no=$(cat -n /tmp/paired_devices | grep "$choice" | awk '{print $1}')
 | 
						|
	dev_id=$(cat -n /tmp/bt_IDS | grep $dev_no | awk '{print $2}')
 | 
						|
	bluetoothctl power on
 | 
						|
	bluetoothctl connect $dev_id
 | 
						|
fi
 | 
						|
 | 
						|
cleanup
 |