import { bind, interval, readFile, timeout, writeFile } from "astal"; import { Gtk } from "astal/gtk4"; import AstalBluetooth from "gi://AstalBluetooth"; import BTDevice from "./Device"; const ALIGN = Gtk.Align; const bt = AstalBluetooth.get_default(); const BluetoothModule = () => { const picker = BluetoothPicker(); const openBTPicker = () => { try { bt.adapter.start_discovery(); } catch (e) { printerr(e); } picker.popup(); }; return ( ); }; const BluetoothPickerList = () => { let btEnableState = false; try { btEnableState = readFile("./btconf") === "true" ? true : false; } catch (_) { } if (bt.get_adapter()) { print('Setting BT state to ' + btEnableState); bt.adapter.set_powered(btEnableState); } else { timeout(5000, () => { if (bt.get_adapter()) { print('Setting BT state to ' + btEnableState); bt.adapter.set_powered(btEnableState); } else { timeout(5000, () => { try { bt.adapter.set_powered(btEnableState); } catch (_) { } }) } }) } const updateState = () => { btEnableState = !btEnableState; writeFile("./btconf", "" + btEnableState); }; return ( { try { bt.adapter.stop_discovery() } catch (_) { } }} cssClasses={["popover-box"]} > } endWidget={ updateState()} > } > {bind(bt, "devices").as(devices => { return devices .filter(device => { if (device.get_connected() || device.get_paired()) { return device; } }) .map(device => { return ; }); })} {bind(bt, "devices").as(devices => { return devices .filter(data => { if (!data.get_connected() && !data.get_paired()) { return data; } }) .map(device => { return ; }); })} ); }; const BluetoothPicker = () => { const popover = new Gtk.Popover(); popover.set_child(BluetoothPickerList()); popover.connect("closed", () => { try { bt.adapter.stop_discovery(); } catch (e) { printerr(e); } }); return popover; }; export default { BluetoothModule, };