This commit is contained in:
pika 2025-06-10 15:34:15 +02:00
parent 32edcff102
commit 0296117901
110 changed files with 9713 additions and 5 deletions

80
services/Bluetooth.qml Normal file
View file

@ -0,0 +1,80 @@
pragma Singleton
import Quickshell
import Quickshell.Io
import QtQuick
Singleton {
id: root
property bool powered
property bool discovering
readonly property list<Device> devices: []
Process {
running: true
command: ["bluetoothctl"]
stdout: SplitParser {
onRead: {
getInfo.running = true;
getDevices.running = true;
}
}
}
Process {
id: getInfo
running: true
command: ["sh", "-c", "bluetoothctl show | paste -s"]
stdout: SplitParser {
onRead: data => {
root.powered = data.includes("Powered: yes");
root.discovering = data.includes("Discovering: yes");
}
}
}
Process {
id: getDevices
running: true
command: ["fish", "-c", `for a in (bluetoothctl devices | cut -d ' ' -f 2); bluetoothctl info $a | jq -R 'reduce (inputs / ":") as [$key, $value] ({}; .[$key | ltrimstr("\t")] = ($value | ltrimstr(" ")))' | jq -c --arg addr $a '.Address = $addr'; end | jq -sc`]
stdout: SplitParser {
onRead: data => {
const devices = JSON.parse(data).filter(d => d.Name);
const rDevices = root.devices;
const destroyed = rDevices.filter(rd => !devices.find(d => d.Address === rd.address));
for (const device of destroyed)
rDevices.splice(rDevices.indexOf(device), 1).forEach(d => d.destroy());
for (const device of devices) {
const match = rDevices.find(d => d.address === device.Address);
if (match) {
match.lastIpcObject = device;
} else {
rDevices.push(deviceComp.createObject(root, {
lastIpcObject: device
}));
}
}
}
}
}
component Device: QtObject {
required property var lastIpcObject
readonly property string name: lastIpcObject.Name
readonly property string alias: lastIpcObject.Alias
readonly property string address: lastIpcObject.Address
readonly property string icon: lastIpcObject.Icon
readonly property bool connected: lastIpcObject.Connected === "yes"
readonly property bool paired: lastIpcObject.Paired === "yes"
readonly property bool trusted: lastIpcObject.Trusted === "yes"
}
Component {
id: deviceComp
Device {}
}
}