diff options
Diffstat (limited to 'services')
| -rw-r--r-- | services/Bluetooth.qml | 4 | ||||
| -rw-r--r-- | services/Network.qml | 43 |
2 files changed, 36 insertions, 11 deletions
diff --git a/services/Bluetooth.qml b/services/Bluetooth.qml index c7ed727..f77001e 100644 --- a/services/Bluetooth.qml +++ b/services/Bluetooth.qml @@ -40,13 +40,13 @@ Singleton { 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 devices = JSON.parse(data).filter(d => d.Name); const rDevices = root.devices; const len = rDevices.length; for (let i = 0; i < len; i++) { const device = rDevices[i]; - if (!devices.find(d => d.address === device?.Address)) + if (!devices.find(d => d.Address === device?.address)) rDevices.splice(i, 1); } diff --git a/services/Network.qml b/services/Network.qml index a65ab1e..67bcb48 100644 --- a/services/Network.qml +++ b/services/Network.qml @@ -7,9 +7,8 @@ import QtQuick Singleton { id: root - readonly property AccessPoint active: AccessPoint { - active: true - } + readonly property list<AccessPoint> networks: [] + readonly property AccessPoint active: networks.find(n => n.active) ?? null reloadableId: "network" @@ -24,14 +23,34 @@ Singleton { Process { id: getNetworks running: true - command: ["nmcli", "-g", "ACTIVE,SIGNAL,FREQ,SSID", "d", "w"] + command: ["sh", "-c", `nmcli -g ACTIVE,SIGNAL,FREQ,SSID d w | jq -cR '[(inputs / ":") | select(.[3] | length >= 4)]'`] stdout: SplitParser { onRead: data => { - const [active, strength, frequency, ssid] = data.split(":"); - if (active === "yes") { - root.active.ssid = ssid; - root.active.strength = parseInt(strength); - root.active.frequency = parseInt(frequency); + const networks = JSON.parse(data).map(n => [n[0] === "yes", parseInt(n[1]), parseInt(n[2]), n[3]]); + const rNetworks = root.networks; + + const len = rNetworks.length; + for (let i = 0; i < len; i++) { + const network = rNetworks[i]; + if (!networks.find(n => n[2] === network?.frequency && n[3] === network?.ssid)) + rNetworks.splice(i, 1); + } + + for (const network of networks) { + const match = rNetworks.find(n => n.frequency === network[2] && n.ssid === network[3]); + if (match) { + match.active = network[0]; + match.strength = network[1]; + match.frequency = network[2]; + match.ssid = network[3]; + } else { + rNetworks.push(apComp.createObject(root, { + active: network[0], + strength: network[1], + frequency: network[2], + ssid: network[3] + })); + } } } } @@ -43,4 +62,10 @@ Singleton { property int frequency property bool active } + + Component { + id: apComp + + AccessPoint {} + } } |