Add bluetooth icon

This commit is contained in:
Sem
2026-04-07 22:10:33 +02:00
parent 3f27d6618a
commit 328dfa1786
9 changed files with 198 additions and 6 deletions

View File

@@ -2,3 +2,4 @@
env = XCURSOR_SIZE,24 env = XCURSOR_SIZE,24
env = HYPRCURSOR_SIZE,24 env = HYPRCURSOR_SIZE,24
env = QT_QPA_PLATFORMTHEME,qt6ct

View File

@@ -26,6 +26,7 @@ bind = $mainMod SHIFT, o, movefocus, d
bind = $mainMod SHIFT, J, swapnext bind = $mainMod SHIFT, J, swapnext
bind = $mainMod SHIFT, K, swapnext, prev bind = $mainMod SHIFT, K, swapnext, prev
bind = $mainMod, F, fullscreen, toggle
# Switch workspaces with mainMod + [0-9] # Switch workspaces with mainMod + [0-9]
bind = $mainMod, 1, workspace, 1 bind = $mainMod, 1, workspace, 1

View File

@@ -1,3 +1,32 @@
[Appearance] [Appearance]
color_scheme_path=/home/sem/linux-dotfiles/qt6ct/colors/matugen.conf color_scheme_path=/home/sem/.config/qt6ct/colors/matugen.conf
custom_palette=true custom_palette=true
icon_theme=breeze-dark
standard_dialogs=default
style=Breeze
[Fonts]
fixed="Sans Serif,9,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,,0,0"
general="Sans Serif,9,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,,0,0"
[Interface]
activate_item_on_single_click=1
buttonbox_layout=0
cursor_flash_time=1000
dialog_buttons_have_icons=1
double_click_interval=400
gui_effects=@Invalid()
keyboard_scheme=2
menus_have_icons=true
show_shortcuts_in_context_menus=true
stylesheets=@Invalid()
toolbutton_style=4
underline_shortcut=1
wheel_scroll_lines=3
[SettingsWindow]
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x4\xe2\0\0\x2\xa6\0\0\0\0\0\0\0\0\0\0\x4\xe2\0\0\x2\xa6\0\0\0\x1\x2\0\0\0\n\0\0\0\0\0\0\0\0\0\0\0\x4\xe2\0\0\x2\xa6)
[Troubleshooting]
force_raster_widgets=1
ignored_applications=@Invalid()

View File

@@ -0,0 +1,56 @@
import QtQuick
import Quickshell.Io
Item {
id: root
signal devicesFound(var devices)
property var connectedDevices: []
function deviceListChanged(newList) {
if (newList.length !== root.connectedDevices.length) {
return true;
}
for (let i = 0; i < newList.length; i++) {
if (newList[i].mac !== root.connectedDevices[i].mac ||
newList[i].name !== root.connectedDevices[i].name) {
return true;
}
}
return false;
}
Process {
id: bluetoothConnectedDevicesProcess
command: ["bluetoothctl", "devices", "Connected"]
stdout: StdioCollector {
onStreamFinished: {
if (!this.text) {
root.connectedDevices = [];
root.devicesFound([]);
return;
}
var devices = this.text.trim().split("\n").map(line => {
var parts = line.split(" ");
return {
mac: parts[1],
name: parts.slice(2).join(" ")
};
});
if (root.deviceListChanged(devices)) {
root.connectedDevices = devices;
root.devicesFound(devices);
}
}
}
}
Timer {
interval: 2000
running: true
repeat: true
onTriggered: bluetoothConnectedDevicesProcess.running = true
}
Component.onCompleted: bluetoothConnectedDevicesProcess.running = true
}

View File

@@ -68,7 +68,6 @@ Item {
stdout: StdioCollector { stdout: StdioCollector {
onStreamFinished: { onStreamFinished: {
console.log("GPU usage data:", this.text);
if (!this.text) { if (!this.text) {
return; return;
} }

View File

@@ -51,7 +51,6 @@ ShellRoot {
gpuUsage: stats.gpuUsage gpuUsage: stats.gpuUsage
} }
} }
} }
Variants { Variants {
@@ -66,4 +65,3 @@ ShellRoot {
} }
} }
} }

View File

@@ -0,0 +1,49 @@
import Quickshell.Io
import QtQuick
import "../constants"
import "../services"
Text {
id: root
// Nerd Font Bluetooth icon (nf-fa-bluetooth)
property string iconGlyph: "\udb80\udcaf"
property string connectedIconGlyph: "\udb80\udcb1"
property string disconnectedIconGlyph: "\udb80\udcaf"
property BluetoothService bluetoothService: BluetoothService {
onDevicesFound: function(devices) {
if (devices.length > 0) {
root.iconGlyph = root.connectedIconGlyph;
root.color = Colors.md3.on_primary_fixed;
} else {
root.iconGlyph = root.disconnectedIconGlyph;
root.color = Colors.md3.primary;
}
}
}
text: iconGlyph
color: Colors.md3.on_primary_fixed
font {
family: Constants.fontFamily
pixelSize: Constants.fontSize
bold: true
}
Process {
id: bluemanManagerProcess
command: ["blueman-manager"]
}
MouseArea {
anchors.fill: parent
hoverEnabled: true
onClicked: {
bluemanManagerProcess.running = true;
}
}
}

View File

@@ -0,0 +1,51 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Quickshell.Services.Pipewire
ColumnLayout {
required property PwNode node;
// bind the node so we can read its properties
PwObjectTracker { objects: [ node ] }
RowLayout {
Image {
visible: source != ""
source: {
const icon = node.properties["application.icon-name"] ?? "audio-volume-high-symbolic";
return `image://icon/${icon}`;
}
sourceSize.width: 20
sourceSize.height: 20
}
Label {
text: {
// application.name -> description -> name
const app = node.properties["application.name"] ?? (node.description != "" ? node.description : node.name);
const media = node.properties["media.name"];
return media != undefined ? `${app} - ${media}` : app;
}
}
Button {
text: node.audio.muted ? "unmute" : "mute"
onClicked: node.audio.muted = !node.audio.muted
}
}
RowLayout {
Label {
Layout.preferredWidth: 50
text: `${Math.floor(node.audio.volume * 100)}%`
}
Slider {
Layout.fillWidth: true
value: node.audio.volume
onValueChanged: node.audio.volume = value
}
}
}

View File

@@ -66,6 +66,7 @@ Item {
Layout.fillWidth: true Layout.fillWidth: true
} }
// ===================== // =====================
// RIGHT: System info // RIGHT: System info
// ===================== // =====================
@@ -74,6 +75,10 @@ Item {
LineSeparator {} LineSeparator {}
BluetoothIcon {}
LineSeparator {}
BarText { BarText {
prefix: "C" prefix: "C"
value: cpuUsage value: cpuUsage
@@ -93,6 +98,9 @@ Item {
value: gpuUsage value: gpuUsage
} }
LineSeparator {}
LineSeparator {} LineSeparator {}
Clock {} Clock {}