1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2025-12-07 22:15:38 -05:00

bluetooth: integrate with DMS API v9 - Supports proper pairing with an agent & pin, passcode, etc.

This commit is contained in:
bbedward
2025-10-23 11:54:22 -04:00
parent 61d68b1f76
commit 1311da7258
6 changed files with 482 additions and 14 deletions

View File

@@ -6,6 +6,7 @@ import QtQuick
import Quickshell
import Quickshell.Io
import Quickshell.Bluetooth
import qs.Services
Singleton {
id: root
@@ -15,6 +16,7 @@ Singleton {
readonly property bool enabled: (adapter && adapter.enabled) ?? false
readonly property bool discovering: (adapter && adapter.discovering) ?? false
readonly property var devices: adapter ? adapter.devices : null
readonly property bool enhancedPairingAvailable: DMSService.dmsAvailable && DMSService.apiVersion >= 9 && DMSService.capabilities.includes("bluetooth")
readonly property bool connected: {
if (!adapter || !adapter.devices) {
return false
@@ -173,6 +175,25 @@ Singleton {
device.connect()
}
function pairDevice(device, callback) {
if (!device) {
if (callback) callback({error: "Invalid device"})
return
}
// The DMS backend actually implements a bluez agent, so we can pair anything
if (enhancedPairingAvailable) {
const devicePath = getDevicePath(device)
DMSService.bluetoothPair(devicePath, callback)
return
}
// Quickshell does not implement a bluez agent, so we can try to pair but only with devices that don't require a passcode
device.trusted = true
device.connect()
if (callback) callback({success: true})
}
function getCardName(device) {
if (!device) {
return ""
@@ -180,6 +201,14 @@ Singleton {
return `bluez_card.${device.address.replace(/:/g, "_")}`
}
function getDevicePath(device) {
if (!device || !device.address) {
return ""
}
const adapterPath = adapter ? "/org/bluez/hci0" : "/org/bluez/hci0"
return `${adapterPath}/dev_${device.address.replace(/:/g, "_")}`
}
function isAudioDevice(device) {
if (!device) {
return false