From 4e36aba9cb70f8bac082bd1514a49f00fe4c2f8c Mon Sep 17 00:00:00 2001 From: Alexander Bocken Date: Sun, 7 Jun 2020 20:56:01 +0200 Subject: [PATCH] renamed bthandler to bt, added hardcoded paired_devices file since "bluetoothctl paired-devices" seems unreliable --- Makefile | 27 ++++++++++----- bt | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 9 deletions(-) create mode 100755 bt diff --git a/Makefile b/Makefile index 6103d15..8f5835c 100644 --- a/Makefile +++ b/Makefile @@ -4,19 +4,28 @@ VERSION = 1.1 # paths -PREFIX = ~/.local/bin/tools +PREFIX = ~/.local/bin +DATA_DIR = ~/.local/share/bt#if changed, needs adjustment in bt as well (defined in the beginning) +SRC = bt -SRC = bthandler -OBJ = $(SRC:.c=.o) install: mkdir -p $(DESTDIR)$(PREFIX) - cp -f bthandler $(DESTDIR)$(PREFIX) - chmod 755 $(DESTDIR)$(PREFIX)/bthandler - touch $(DESTDIR)$(PREFIX)/bt_blacklist + mkdir -p $(DATA_DIR) + cp -f bt $(DESTDIR)$(PREFIX) + chmod 755 $(DESTDIR)$(PREFIX)/bt + touch $(DATA_DIR)/blacklist + touch $(DATA_DIR)/paired uninstall: - rm -f $(DESTDIR)$(PREFIX)/bthandler - rm -f $(DESTDIR)$(PREFIX)/bt_blacklist + rm -f $(DESTDIR)$(PREFIX)/bt + rm -rf $(DATA_DIR) -.PHONY: install uninstall +#clears manual paired devices list and blacklist +clear: + rm -rf $(DATA_DIR) + mkdir -p $(DATA_DIR) + touch $(DATA_DIR)/paired + touch $(DATA_DIR)/blacklist + +.PHONY: install uninstall clear diff --git a/bt b/bt new file mode 100755 index 0000000..c8f212c --- /dev/null +++ b/bt @@ -0,0 +1,103 @@ +#!/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 /tmp/paired_devices +echo paired_devices: +cat /tmp/paired_devices +cat "$PAIRLIST" | awk '{for (i=3; i> /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 /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