From bb49747fd90128d73cb5533402d9c09687ed6ef1 Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Tue, 26 Aug 2025 21:50:37 +0700 Subject: [PATCH] bluetooth: use quickshell's service --- .../quickshell/ii/modules/bar/BarContent.qml | 6 +- .../quickToggles/BluetoothToggle.qml | 26 +++---- .../verticalBar/VerticalBarContent.qml | 6 +- .config/quickshell/ii/services/Bluetooth.qml | 73 ------------------- 4 files changed, 20 insertions(+), 91 deletions(-) delete mode 100644 .config/quickshell/ii/services/Bluetooth.qml diff --git a/.config/quickshell/ii/modules/bar/BarContent.qml b/.config/quickshell/ii/modules/bar/BarContent.qml index 35d42a009..acc06452f 100644 --- a/.config/quickshell/ii/modules/bar/BarContent.qml +++ b/.config/quickshell/ii/modules/bar/BarContent.qml @@ -2,6 +2,7 @@ import "./weather" import QtQuick import QtQuick.Layouts import Quickshell +import Quickshell.Bluetooth import Quickshell.Services.UPower import qs import qs.services @@ -306,7 +307,10 @@ Item { // Bar content region color: rightSidebarButton.colText } MaterialSymbol { - text: Bluetooth.bluetoothConnected ? "bluetooth_connected" : Bluetooth.bluetoothEnabled ? "bluetooth" : "bluetooth_disabled" + readonly property bool bluetoothEnabled: Bluetooth.defaultAdapter.enabled + readonly property BluetoothDevice bluetoothDevice: Bluetooth.defaultAdapter.devices.values.find(device => device.connected) + readonly property bool bluetoothConnected: bluetoothDevice !== undefined + text: bluetoothConnected ? "bluetooth_connected" : bluetoothEnabled ? "bluetooth" : "bluetooth_disabled" iconSize: Appearance.font.pixelSize.larger color: rightSidebarButton.colText } diff --git a/.config/quickshell/ii/modules/sidebarRight/quickToggles/BluetoothToggle.qml b/.config/quickshell/ii/modules/sidebarRight/quickToggles/BluetoothToggle.qml index 5122bf0c2..6bd4651dc 100644 --- a/.config/quickshell/ii/modules/sidebarRight/quickToggles/BluetoothToggle.qml +++ b/.config/quickshell/ii/modules/sidebarRight/quickToggles/BluetoothToggle.qml @@ -1,36 +1,30 @@ import qs -import qs.services import qs.modules.common import qs.modules.common.widgets import qs.modules.common.functions import QtQuick import Quickshell +import Quickshell.Bluetooth import Quickshell.Io import Quickshell.Hyprland QuickToggleButton { - toggled: Bluetooth.bluetoothEnabled - buttonIcon: Bluetooth.bluetoothConnected ? "bluetooth_connected" : Bluetooth.bluetoothEnabled ? "bluetooth" : "bluetooth_disabled" + id: root + readonly property bool bluetoothEnabled: Bluetooth.defaultAdapter.enabled + readonly property BluetoothDevice bluetoothDevice: Bluetooth.defaultAdapter.devices.values.find(device => device.connected) + readonly property bool bluetoothConnected: bluetoothDevice !== undefined + toggled: bluetoothEnabled + buttonIcon: bluetoothConnected ? "bluetooth_connected" : bluetoothEnabled ? "bluetooth" : "bluetooth_disabled" onClicked: { - toggleBluetooth.running = true + Bluetooth.defaultAdapter.enabled = !Bluetooth.defaultAdapter.enabled } altAction: () => { Quickshell.execDetached(["bash", "-c", `${Config.options.apps.bluetooth}`]) GlobalStates.sidebarRightOpen = false } - Process { - id: toggleBluetooth - command: ["bash", "-c", `bluetoothctl power ${Bluetooth.bluetoothEnabled ? "off" : "on"}`] - onRunningChanged: { - if(!running) { - Bluetooth.update() - } - } - } StyledToolTip { content: Translation.tr("%1 | Right-click to configure").arg( - (Bluetooth.bluetoothEnabled && Bluetooth.bluetoothDeviceName.length > 0) ? - Bluetooth.bluetoothDeviceName : Translation.tr("Bluetooth")) - + (bluetoothDevice?.name.length > 0) ? + bluetoothDevice.name : Translation.tr("Bluetooth")) } } diff --git a/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml b/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml index 448ff2f36..2245457c1 100644 --- a/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml +++ b/.config/quickshell/ii/modules/verticalBar/VerticalBarContent.qml @@ -1,6 +1,7 @@ import QtQuick import QtQuick.Layouts import Quickshell +import Quickshell.Bluetooth import Quickshell.Services.UPower import qs import qs.services @@ -284,7 +285,10 @@ Item { // Bar content region color: rightSidebarButton.colText } MaterialSymbol { - text: Bluetooth.bluetoothConnected ? "bluetooth_connected" : Bluetooth.bluetoothEnabled ? "bluetooth" : "bluetooth_disabled" + readonly property bool bluetoothEnabled: Bluetooth.defaultAdapter.enabled + readonly property BluetoothDevice bluetoothDevice: Bluetooth.defaultAdapter.devices.values.find(device => device.connected) + readonly property bool bluetoothConnected: bluetoothDevice !== undefined + text: bluetoothConnected ? "bluetooth_connected" : bluetoothEnabled ? "bluetooth" : "bluetooth_disabled" iconSize: Appearance.font.pixelSize.larger color: rightSidebarButton.colText } diff --git a/.config/quickshell/ii/services/Bluetooth.qml b/.config/quickshell/ii/services/Bluetooth.qml deleted file mode 100644 index 817bbc921..000000000 --- a/.config/quickshell/ii/services/Bluetooth.qml +++ /dev/null @@ -1,73 +0,0 @@ -pragma Singleton -pragma ComponentBehavior: Bound - -import Quickshell; -import Quickshell.Io; -import QtQuick; - -/** - * Basic polled Bluetooth state. - */ -Singleton { - id: root - - property int updateInterval: 1000 - property string bluetoothDeviceName: "" - property string bluetoothDeviceAddress: "" - property bool bluetoothEnabled: false - property bool bluetoothConnected: false - - function update() { - updateBluetoothDevice.running = true - updateBluetoothStatus.running = true - updateBluetoothEnabled.running = true - } - - Timer { - interval: 10 - running: true - repeat: true - onTriggered: { - update() - interval = root.updateInterval - } - } - - // Check if Bluetooth is enabled (controller powered on) - Process { - id: updateBluetoothEnabled - command: ["sh", "-c", "bluetoothctl show | grep -q 'Powered: yes' && echo 1 || echo 0"] - running: true - stdout: SplitParser { - onRead: data => { - root.bluetoothEnabled = (parseInt(data) === 1) - } - } - } - - // Get the name and address of the first connected Bluetooth device - Process { - id: updateBluetoothDevice - command: ["sh", "-c", "bluetoothctl info | awk -F': ' '/Name: /{name=$2} /Device /{addr=$2} END{print name \":\" addr}'"] - running: true - stdout: SplitParser { - onRead: data => { - let parts = data.split(":") - root.bluetoothDeviceName = parts[0] || "" - root.bluetoothDeviceAddress = parts[1] || "" - } - } - } - - // Check if any device is connected - Process { - id: updateBluetoothStatus - command: ["sh", "-c", "bluetoothctl info | grep -q 'Connected: yes' && echo 1 || echo 0"] - running: true - stdout: SplitParser { - onRead: data => { - root.bluetoothConnected = (parseInt(data) === 1) - } - } - } -}