diff options
author | Guillermo Ramos | 2025-09-07 10:39:10 +0200 |
---|---|---|
committer | Guillermo Ramos | 2025-09-07 12:42:25 +0200 |
commit | 5ab8b74a54bde4bc9ec472fe4c5ab8578796c6a3 (patch) | |
tree | 117470410105b4de7d4b1b069871682712695061 | |
parent | 90d5d1c6c6410cebc69d2914fe36ea51319d0d0a (diff) | |
download | cli-5ab8b74a54bde4bc9ec472fe4c5ab8578796c6a3.tar.gz |
Add btconnect
Signed-off-by: Guillermo Ramos <gramos@opennebula.io>
-rwxr-xr-x | btconnect | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/btconnect b/btconnect new file mode 100755 index 0000000..b814722 --- /dev/null +++ b/btconnect @@ -0,0 +1,64 @@ +#!/usr/bin/env perl +# +# Quick bluetooth device manager. Finds already paired devices and shows a menu +# (fzf) to choose which one to connect to or disconnect from. +################################################################################ + +use feature 'signatures'; + +use POSIX qw(isatty); + +# In: $type : str ('Paired', 'Bonded', 'Trusted', 'Connected') +# Out: %devs : hash{name:str => mac:str} +sub get_bt_devices($type) { + my @devlines = `bluetoothctl devices $type | grep '^Device'`; + chomp foreach @devlines; + + my %devs; + foreach my $devline (@devlines) { + # $devline is like: 'Device DE:E4:38:E5:CF:DC MX Master 3S' + my (undef, $mac, $name) = split ' ', $devline, 3; + $devs{$name} = $mac; + } + + return \%devs; +} + +# Globals +my $PAIRED = get_bt_devices 'Paired'; +my $CONNECTED = get_bt_devices 'Connected'; +my $MENULINES = join '', map { + my $connected_str = $CONNECTED->{$_} ? ' (connected)' : ''; + "$_$connected_str\n" +} (sort keys %$PAIRED); +chomp $MENULINES; + +sub get_selection($selector) { + my $selname = `echo '$MENULINES' | $selector` =~ s/ \(connected\)$//r || exit; + chomp $selname; + + return {name => $selname, mac => $PAIRED->{$selname}}; +} + +sub btconnect($selector) { + my $sel = get_selection($selector); + + my $out; + if ($CONNECTED->{$sel->{name}}) { + print "Disconnecting from '$sel->{name}' ($sel->{mac})... "; + $out = `bluetoothctl disconnect $sel->{mac}`; + } else { + print "Connecting to '$sel->{name}' ($sel->{mac})... "; + $out = `bluetoothctl connect $sel->{mac}`; + } + print $? ? "ERROR:\n\n$out\n" : "done\n"; +} + +if (isatty(STDIN)) { + # Show menu (fzf) and connect using the CLI + my $query = join ' ', @ARGV; + btconnect("fzf -q '$query'"); +} else { + # Show menu (wmenu/dmenu) and connect using the GUI + btconnect($ENV{WAYLAND_DISPLAY} ? 'wmenu -i' : 'dmenu -i'); +} |